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);
}
嗨,所有 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);
}