当前位置: 首页 > 知识库问答 >
问题:

寻找在OptaPlanner中使用“DoublEvalueRange”的正确方法

龙俊英
2023-03-14
The selector is not countable, check the ValueRanges involved.
Verify that a ValueRangeProvider does not return ValueRange when it can return CountableValueRange or Collection.

@PlanningSolution
public class Solution {
    @PlanningEntityProperty
    private Entity entity;

    @PlanningScore
    private HardSoftScore score = HardSoftScore.ZERO;

    public Solution(Entity entity) {
        this.entity = entity;
    }

    @ValueRangeProvider(id = "x_1")
    public ValueRange<Double> getX1Range() {
        return ValueRangeFactory.createDoubleValueRange(0.0, 100.0);
    }

    @ValueRangeProvider(id = "x_2")
    public ValueRange<Double> getX2Range() {
        return ValueRangeFactory.createDoubleValueRange(0.0, 100.0);
    }
...<getters setters>...

我的实体:

@PlanningEntity
public class Entity {
    private long id;

    @PlanningVariable(valueRangeProviderRefs = "x_1")
    private Double x1;

    @PlanningVariable(valueRangeProviderRefs = "x_2")
    private Double x2;
...<getters setters>...

我的限制:

...
    private Constraint c1(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Entity.class)
                .filter(e -> !(3.0 * e.getX1() + 5.0 * e.getX2() < 5.0 ))
                .penalize("C1", HardSoftScore.ONE_HARD);
    }

    private Constraint c2(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Entity.class)
                .filter(e -> !(2.0 * e.getX1() - 6.0 * e.getX2() > 0.0 ))
                .penalize("C2", HardSoftScore.ONE_HARD);
    }

    private Constraint min(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Entity.class)
                .penalize("MIN", HardSoftScore.ONE_SOFT, e -> (int)(-e.getX1() + 6.0 * e.getX2()));
    }
...

共有1个答案

萧德馨
2023-03-14

查看ValueRangeFactory的createXXXValueRange()方法集的返回类型,我注意到除了一个以外,所有的返回类型都返回了一个CountableValueRange。该规则的一个例外是createDoubleValueRange(),它返回一个“mere”ValueRange(ValueRange)。

错误指向相同的方向:ValueRange不被认为是有效的可数ValueRange。对我来说,这是有道理的:OptaPlanner希望从一组离散的值中选择来执行它的移动。所以我不认为有任何“合法”的方式来使用它为Optaplanner的求解移动。

由于我不能确定的原因,我自己不会把OptaPlanner作为解决LP问题的首选,因为可行解集是可以计算的。但是无论如何,使用OptaPlanner(就像您的例子一样),我将处理离散值的倍数(10,100,1000,...)(在结果计算中,将它们除以10,100,1000,...)。而且/但与此同时,我会非常谨慎地避免分数腐败,这种危险永远不会很远。

 类似资料:
  • 我有一组约36000个多边形,它们代表国家的一个分区(~县)。我的python脚本接收很多点:pointId、经度、纬度。 对于每一个点,我想发回pointId,polygonId。对于每个点,循环到所有多边形并使用myPoint。在(myPolygon)中,效率非常低。 我认为shapely库提供了一种更好的方法来准备多边形,以便为一个点查找多边形成为一个树路径(国家、地区、子地区……) 以下是

  • 问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的

  • 本文向大家介绍Linux中Homebrew的正确使用方法,包括了Linux中Homebrew的正确使用方法的使用技巧和注意事项,需要的朋友参考一下 很多人都在使用Linux Homebrew ,有三个技巧可以帮助你更好的使用它: 避免环境污染 首先要避免将 Homebrew 的 bin 目录添加到 $PATH ,而仅仅将你需要使用的几个可执行做软连接放到 ~/bin 下面(这个目录在 $PATH

  • 问题内容: 我正在尝试学习如何在PyQt Gui应用程序中使用QThreads。我有一些可以运行一段时间的东西,(通常)可以在其中更新Gui的点,但是我想将主要工作拆分为自己的线程(有时东西会卡住,最终有一个取消/重试按钮,如果Gui被冻结(因为主循环被阻塞),则该按钮显然不起作用)。 我已阅读https://mayaposch.wordpress.com/2011/11/01/how-to-re

  • 我试图阅读上一篇文章中的Kafka主题,但我无法正确阅读: 在属性文件中,我设置了以下内容: 组id=我的团队 客户。id=my_client 启用。汽车提交=真 自动。抵消重置=最早的 隔离。级别=读取已提交 然后代码: 我可以看到偏移量是如何从0打印出来的,即使我在主题中有一些项目。 在日志文件中,我可以看到以下内容(缩写): [Consumer clientId=my_client,grou

  • 问题内容: 这个想法是使用更少的连接和更好的性能。连接是否随时终止? 对于另一个问题,是否打开新连接? 问题答案: 不,多路复用器不会过期。没有GetDatabase不会打开新连接。basics.md涵盖了所有内容 -特别是: 从GetDatabase返回的对象是便宜的直通对象,不需要存储。