描述 optaplanner 中的“简单”规则

问题描述 投票:0回答:1

我有一个简单的场景,我有一个规划实体持有一个整数问题事实,例如

[1][2][3][4][5][6][7][8][9].

我的目标是使用optaplanner对列表进行排序,将其划分为包含所有相邻数字的子列表,并计算每个子列表的平均值。

例如

[12][1][4][5][6][7][11][9][10]
应该分为三个子列表:

[1]
,
[4][5][6][7]
[9][10][11][12]

平均值为 1、 5.5,和 10.5,分别。

总分应该是平均分之和,即17.

几年前,我可以在 Drools 中编写这条规则,这并不容易,但有可能。但是现在,我想切换到 Constraint Streams 的现代计算方式。

optaplanner
1个回答
0
投票

如果还原模型怎么办?

  1. 为事实组建模(认为将获得
    [4][5][6][7]
    的id,具有计划变量组的计划实体Assignment(认为
    [4]
    )。
  2. from(Assignment.class).groupBy(Assignment::getGroup, average(Assignment::getWeight)).penalize(...)

唯一的问题(除了 average() 不存在之外)是 average() 返回一个双精度数(浮点数不相关)。你需要它来返回一个 BigDecimal 并使用 BigDecimal ... Score.

另外,你会想要积极的支柱交换动作以更快地获得更好的结果。

© www.soinside.com 2019 - 2024. All rights reserved.