optaplanner:如何强制规划变量值只能使用一次

时间:2014-03-11 19:50:08

标签: java optaplanner

我正在努力学习optaplanner。作为一个学习项目,我试图实现一个计算“magic squares”的非常基本和简单的程序。

基本上我试图将“数字”分配给行和列中定义的“框”。

很抱歉没有直接从源代码复制/粘贴,我的开发机器无法连接到互联网,所以我会尝试手工写下重要的课程。

我的域名结构如下:

  

@PlanningSolution   MagicSquareSolution

//facts
List<Column> columnList
List<Row> rowList
List<Number> numberList

//entity
List<Box> boxList


@valueRangeProvider (id="numberRange")
getNumberList()

@PlanningEntityCollectionProperty
getBoxList

  

@PlanningEntity   框

Column column
Row row
Number number // planningVariable

@PlanningVariable(valueRangeProviderRefs="{numberRange}")
getNumber

我正在使用SIMPLE Java计分器类。

在我的求解器配置xml中,我使用了FIRST_FIT和FIRST_NON_DETERIRATING_SCORE。

问题是;在我得到的解决方案中,数字被重用,如

7 5 3
1 5 9
7 5 3

虽然行和列的总和等于15,但在这里可以看到; 数字7,5和3被多次使用。 如何强制规划变量的值范围内的所有值至少使用一次。

感谢。

阿基夫,

1 个答案:

答案 0 :(得分:3)

添加分数约束:

when
     Box($n : number, $id : id)
     Box(number == $n, $id > id)
then
     // -1 hard