第 10 章 OptaPlanner Score 接口


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

public interface Score<...> extends Comparable<...> {
    ...
}
Copy to Clipboard Toggle word wrap

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

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

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

@PlanningSolution
public class CloudBalance {
    ...

    @PlanningScore
    private HardSoftScore score;

}
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

这会导致 分数损坏

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

注意

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

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat