第 10 章 OptaPlanner Score 接口

分数由 Score 接口表示,它扩展了 Comparable 接口:

public interface Score<...> extends Comparable<...> {
    ...
}

要使用的分数实施取决于您的用例。您的分数可能不适用于一个 值。OptaPlanner 有几个内置分数实现,但您也可以实施自定义分数。大多数用例都使用内置的 HardSoftScore 分数。

分数类图示例

所有分数实施也都有一个 initScore ( int)。它主要用于内部使用 OptaPlanner:它是未初始化的计划变量的负数。从用户的角度来说,这是 0, 除非在它能够初始化所有规划变量之前终止建筑高度。在本例中,Score .isSolutionInitialized () 返回 false

在解析器运行时,分数实施(如 HardSoftScore)必须相同。分数实现在解决方案域类中配置:

@PlanningSolution
public class CloudBalance {
    ...

    @PlanningScore
    private HardSoftScore score;

}

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

这会导致 分数损坏

十进制数字(BigDecimal)没有这些问题。

注意

巨型算术性比 int 算算术要慢得多。在某些试验中,分数计算需要更长的时间。

因此,在很多情况下,可能需要将单个分数权重 的所有 数字乘以十十,因此分数权重适合扩展的 int。例如,如果您将所有权重乘以 1000,则 0.07 的 fuelCost 变得 fuelCostMillis70,并且不再使用十进制分数权重。