optaplanner @ValueRangeProfider 用于布尔规划变量 [optaplanner]

optaplanner @ValueRangeProfider for a boolean planning variable [optaplanner]

嗨,所有 opatplanner 用户,

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

@PlanningEntity:

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

@PlanningVariable:

 boolean selected

我的问题资料主要是这样的:

Image_strip:

D 1 Sat2 22-12-2015 11:02:24.051
D 1 Sat1 22-12-2015 11:03:24.069
A 2 Sat1 22-12-2015 11:04:24.122
A 2 Sat3 22-12-2015 11:06:24.172
B 2 Sat3 22-12-2015 11:07:24.197
B 2 Sat2 22-12-2015 11:08:24.284
D 1 Sat3 22-12-2015 11:10:24.042
A 3 Sat1 22-12-2015 11:10:24.395
A 2 Sat2 22-12-2015 11:10:24.441
A 1 Sat2 22-12-2015 11:11:24.456
C 2 Sat1 22-12-2015 11:12:24.465
B 1 Sat1 22-12-2015 11:13:24.469
B 1 Sat2 22-12-2015 11:14:24.551
C 2 Sat2 22-12-2015 11:15:24.556
B 1 Sat3 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 3 Sat3 22-12-2015 11:19:00.469
A 1 Sat1 22-12-2015 11:20:24.123
C 1 Sat2 22-12-2015 11:20:24.827
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
1 Sat3 22-12-2015 11:50:24.789

@PlanningSolution:时间表

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

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

我的规则如下:

规则"Transition Time Rule"

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"})

public Boolean getSelected() { return 已选择; }

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

@ValueRangeProvider(id = "selectedRange")

List getValueRange() { return Arrays.asList(Boolean.FALSE, Boolean.TRUE); }

public 列表 getBooleanList() { return selectedList; }

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

但我收到以下错误:

线程"AWT-EventQueue-0"java.lang.IllegalArgumentException中的异常:实体类(classorg.tasking.domain.ImageStrip)有一个PlanningVariable)注释属性(已选择)带有valueRangeProviderRef( selectedRange) 在已注册的 PlanningSolution 或 PlanningEntity 中不存在。

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

使用Boolean(不是boolean),所以null可以表示一个未初始化的变量(这使得实体也未初始化)。

关于你的解决方案:

@ValueRangeProvider(...)
List<Boolean> getValueRange() {
     return Arrays.asList(Boolean.FALSE, Boolean.TRUE);
}