第 10 章 OptaPlanner Score 接口
分数由 Score
接口表示,它扩展了 Comparable
接口:
public interface Score<...> extends Comparable<...> { ... }
public interface Score<...> extends Comparable<...> {
...
}
要使用的分数实施取决于您的用例。您的分数可能不适用于一个 长
值。OptaPlanner 有几个内置分数实现,但您也可以实施自定义分数。大多数用例都使用内置的 HardSoftScore
分数。
所有分数实施也都有一个 initScore
( int
)。它主要用于内部使用 OptaPlanner:它是未初始化的计划变量的负数。从用户的角度来说,这是 0,
除非在它能够初始化所有规划变量之前终止建筑高度。在本例中,Score .isSolutionInitialized ()
返回 false
。
在解析器运行时,分数实施(如 HardSoftScore
)必须相同。分数实现在解决方案域类中配置:
10.1. 分数计算中的浮点号 复制链接链接已复制到粘贴板!
避免使用浮点数类型 float
或分数 计算中的双倍
。改为使用 BigDecimal
或 scale long
。浮点号无法正确表示十进制数字。例如,双引号
无法正确包含 0.05
值。相反,它包含最接近代表的值。算术,包括增加和减去,使用浮点号(特别是规划问题)会导致决策不正确,如下图所示:
另外,浮动点数添加不关联:
System.out.println( ((0.01 + 0.02) + 0.03) == (0.01 + (0.02 + 0.03)) ); // returns false
System.out.println( ((0.01 + 0.02) + 0.03) == (0.01 + (0.02 + 0.03)) ); // returns false
这会导致 分数损坏。
十进制数字(BigDecimal
)没有这些问题。
巨型算术性比 int
、长
或 双
算算术要慢得多。在某些试验中,分数计算需要更长的时间。
因此,在很多情况下,可能需要将单个分数权重 的所有 数字乘以十十,因此分数权重适合扩展的 int
或 长
。例如,如果您将所有权重乘以 1000
,则 0.07
的 fuelCost 变得 fuelCostMillis
为 70
,并且不再使用十进制分数权重。