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

时间:2015-10-26 09:35:37

标签: 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 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
A 1 Sat3 22-12-2015 11:50:24.789

@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”})

public Boolean getSelected(){return selected; }

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

@ValueRangeProvider(id =“selectedRange”)

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

public List getBooleanList(){return selectedList; }

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

但是我收到了以下错误:

线程“AWT-EventQueue-0”中的异常java.lang.IllegalArgumentException:entityClass(类org.tasking.domain.ImageStrip)具有一个带有一个不存在的valueRangeProviderRef(selectedRange)的带注释属性(已选中)在已注册的PlanningSolution或PlanningEntity上。

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

1 个答案:

答案 0 :(得分:1)

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

在您的解决方案上:

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