我正在努力学习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被多次使用。 如何强制规划变量的值范围内的所有值至少使用一次。
感谢。
阿基夫,
答案 0 :(得分:3)
添加分数约束:
when
Box($n : number, $id : id)
Box(number == $n, $id > id)
then
// -1 hard