java - optaplanner:如何强制规划变量值仅使用一次

标签 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 Box

Column column
Row row
Number number // planningVariable

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

我正在使用一个简单的 Java 分数计算器类。

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

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

7 5 3
1 5 9
7 5 3

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

谢谢。

阿基夫,

最佳答案

添加分数约束:

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

关于java - optaplanner:如何强制规划变量值仅使用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335179/

相关文章:

java - 无法将自定义 NavigationHandler 转换为 javax.faces.application.ConfigurableNavigationHandler

OptaPlanner 将多辆车部署到同一位置

java - OptaPlanner 车辆路线 - 车辆时间窗口

java - Pattern::asPredicate 线程安全吗

java - 如何读取以逗号分隔的文件

mathematical-optimization - OptaPlanner 是否能够模拟随机程序?

mysql - 如何避免 optaweb-employee-rostering 在服务器重新启动时重建持久数据

java - 根据int值显示字符串

java - 无法将 double 值转换为 boolean 值(这里是菜鸟)