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

布尔规划变量的optaplanner@ValueRangeProfider[optaplanner]

阴凯歌
2023-03-14

各位opatplanner用户,

我的规划问题是:获取遥感卫星星座的有效时间表。

@PlanningEntity:

ImageStrip (String taskCode,
            int stripIndex,
            String satellite,
            Timestamp timeSlot,
            boolean selected (planning variable))

@PlanningVariable:

 boolean selected

我的问题数据主要是这样的:

Image_Strip:

D1 Sat2 22-12-2015 11:02:24.051
D1 Sat1 22-12-2015 11:04:24.122
A2 Sat3 22-12-2015 11:06:24.172
B2 Sat3 22-12-2015 11:07:24.197
B2 Sat2 22-12-2015 11:08:24.284
D1 Sat3 22-12-2015 11:10:24.042
A2 Sat2 22-12-2015 11:10:24.395
A2 Sat2 22-12-2015 11:10:24.441
A1 Sat2 22-12-2015 11:10:24.441
A1Sat3 22-12-2015 11:16:24.642
C 2 Sat3 22-12-2015 11:17:24.648
C 1 Sat3 22-12-2015 11:18:24.738
A 1 Sat3 22-12-2015 11:19:00.469
A 1 Sat1 22-12-2015 11:20:24.1223
C 1 Sat1 22-12-2015 11:21:24.916
B 2 Sat1 22-12-2015 11:30:24.373
A 3 Sat2 22-12-2015 11:40:50.750
A 1 Sat3 22-12-2015

@planningsolution:Schedule

拜托,问题是我如何才能为一个布尔规划变量定义值范围提供程序?此外,我还想为我的规划变量使用@planningvariable(nullable=true)。

例如,对于计划中定义的计划变量(选择了布尔值),使用@ValueRangeProvider。并使用过度约束的规划条件(nullable=true)。

我的规则如下:

规则“过渡时间规则”

when

    $leftImageStrip:ImageStrip($selected : selected,
                               $satellite : satellite, 
                               selected != null,
                               $timeslot : timeslot)
   $sumTime : Number () from accumulate (
                               $rightImageStrip : ImageStrip(selected == $selected,
                               satellite == $satellite,
                             Math.abs(timeslot.getTime() -                                                 $timeslot.getTime()) <= 180000,
                              this != $leftImageStrip),
                              sum($rightImageStrip.gain))
then
    System.out.println(" SUM = " + $sumTime );
    scoreHolder.addHardConstraintMatch(kcontext, -$sumTime.intValue());

我在规划实体做了以下工作:

@PlanningVariable(nullable=true,valueRangeProviderRefs={“SelectedRange”})

公共布尔getSelected(){return selected;}

在规划解决方案中,我提出了以下内容:

@ValueRangeProvider(id=“SelectedRange”)

List getValueRange(){return Arrays.AsList(Boolean.False,Boolean.True);}

公共列表getBooleanList(){return SelectedList;}

public void setBooleanList(List selectedList){This.selectedList=selectedList;}

但我收到了以下错误:

线程“Awt-EventQueue-0”java.lang.IllegalArgumentException中出现异常:entityClass(类org.tasking.domain.ImageStrip)有一个PlanningVariable)带注释的属性(selected),其valueRangeProviderRef(selectedRange)在注册的PlanningSolution或PlanningEntity上不存在。

我无法识别错误原因。提前致谢!!!

共有1个答案

施自珍
2023-03-14

使用boolean(而不是boolean),因此null可以表示未初始化的变量(这使得实体也未初始化)。

关于您的解决方案:

@ValueRangeProvider(...)
List<Boolean> getValueRange() {
     return Arrays.asList(Boolean.FALSE, Boolean.TRUE);
}
 类似资料:
  • 我用增量java解决了optaPlanner的一个问题,其中有一个规划变量和一个规划实体,但是现在在我们的项目中有很多规划变量的需求,比如我们要找到最好的房间(容量,isAC等),汽车(totalSeatsLeft,isAC等),我们不知道有多少资源,因为我们每天都需要根据用户的需求增加更多的资源,比如会议室设施等,所以给我一些想法,这样我们就可以为optaPlanner做一个域。多谢了。

  • 我正在研究来自OptaPlanner的示例用例。我也找不到任何类似的例子,可以在一个规划实体中求解多个规划变量。例如,在护士名册中,一个轮班的每个可能需要多个分配的。在这种情况下,如何利用planner和编写规则呢?

  • 在制定时间表时,你必须遵守法律(硬性要求),该法律规定,作为一名员工,你每七天只能工作一定的时间。它没有说日历周的原因是在创建时间表时为雇主提供一些回旋空间(通常是提前4-16周)。一旦设置了此计划期的开始日期,在您想要进行完整的重新规划之前,该日期无法更改,但您需要通知员工。所以它可以被视为一个变量,直到你接受了时间表,然后它就变成了一个常数。当然,这是每个员工的个人情况。该开始日期将由您的第一

  • 我是Optaplanner的新手,我一直在考虑将VRP扩展到一个不同的问题空间。我用的是6.1.0-final。这是一个很难计算的问题,但下面是: 规划实体-装运(扩展Standstill),由运输商(即货船)锚定规划变量-终端(货物目的地),当然隐含运输商(作为VRP示例中的Vehicle这样的影子变量) 在这个路径问题中,货物直接运输到一个终端,然后再运回工厂。即一个运输机服务于一个终点站,然

  • 首先,对于我的分数计算,我使用Java EasyScoreCalculator接口,并使用Java API创建我的求解器(因为我在Java OSGI插件中从xml或drl文件加载配置/约束时遇到了问题) 我的问题: 我想解决的,一个多技术工人任务调度问题。 任务的开始日期和结束日期应在给定的日期范围内计划。 解决方案:我要优化所有工人的总体工作量(分钟)。 目前我确实有三个规划变量: null 在

  • 我想为VRP创建一个过度约束规划的增量分数。我创建了一个传统的虚拟车辆,其中包括所有计划外的客户。 示例: Optaplanner将Customer1从Vehicle1移动到Vehicle2: 当我得到AfterVariableChanged:previousStandstill(Customer1)时,在Customer.getVehicle()中,我有旧车辆的价值,我不知道是否需要添加软成本(