OptaPlanner return 最好的分数但不是它的相关解决方案
OptaPlanner return the best score but not its associated solution
我正在使用 OptaPlanner 7.33.0 解决类似 CloudBalancing 的问题。
returned PlanningSolution 对象包含最佳计算分数,但解决方案不匹配。
我用一个非常小的数据集调试了所有解决方案,returned 解决方案似乎是最新的,它没有 returned 分数。
示例:
- 1: 得分最高的解决方案得分为 0hard/-1197medium/4soft
- 2:returned 解决方案的得分为 0hard/-1198medium/2soft
- 求解器 return 一个 PlanningSolution 对象,其得分为解决方案 1 但内容为解决方案 2
这是我的规划方案class
@PlanningSolution
public class GroupSolution
{
@PlanningEntityCollectionProperty
private List<Request> request;
@ValueRangeProvider(id = "groupRange")
@ProblemFactCollectionProperty
private List<Group> proposedGroups;
@PlanningScore
private HardMediumSoftScore score;
// Others planning fact that I use in my EasyScoreCalculator
}
请求class
@PlanningEntity
public class Request
{
@PlanningVariable(valueRangeProviderRefs = {
"groupRange"
}, nullable = false)
private Group group;
// Other properties
}
配置
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<scanAnnotatedClasses>
<packageInclude>my.package.domain</packageInclude>
</scanAnnotatedClasses>
<!-- Score configuration -->
<scoreDirectorFactory>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
<easyScoreCalculatorClass>my.package.MyEasyScoreCalculator</easyScoreCalculatorClass>
</scoreDirectorFactory>
<constructionHeuristic />
<termination>
<minutesSpentLimit>5</minutesSpentLimit>
</termination>
</solver>
我正在使用具有 3 个评分级别的 EasyScoreCalculator,我是这样使用它们的:
- hard : 我只将它设置为 0 或 -1。如果 -1 我不计算其他分数,因为 -1 表示解决方案不适用
- 中等:价格,例如如果解决方案成本为 100 欧元,我的中等分数将为 -100
- soft :如果 2 个价格相同,我会使用此分数来选择具有更多空组(每个组的最大请求数)的解决方案。这个分数永远不会是负数
我将继续对此进行调查,但如果您有任何建议以获得正确的结果,请告诉我。
但主要问题是,您知道这是否是正常的 OptaPlanner 行为吗?
如果正常,在哪种情况下他会 return 一个不匹配的分数和解决方案?
1) 听起来像是乐谱损坏。鉴于 FAST_ASSERT "fixes it"(不是),运行 和 <environmentMode>NON_INTRUSIVE_FULL_ASSERT</environmentMode>
,如果它抛出异常,它可能会指出真正的问题,因为它检测到早前的问题。
2) 也可能是由于计划实体克隆腐败。这更难被发现。您是否使用自定义解决方案克隆器?是否有任何域 classes 引用了规划实体 class(es) 或规划解决方案(因此引用 Request
或 GroupSolution
)?任何 class 具有包含 Request
或 GroupSolution
实例的集合或地图的实体?
我正在使用 OptaPlanner 7.33.0 解决类似 CloudBalancing 的问题。
returned PlanningSolution 对象包含最佳计算分数,但解决方案不匹配。 我用一个非常小的数据集调试了所有解决方案,returned 解决方案似乎是最新的,它没有 returned 分数。
示例:
- 1: 得分最高的解决方案得分为 0hard/-1197medium/4soft
- 2:returned 解决方案的得分为 0hard/-1198medium/2soft
- 求解器 return 一个 PlanningSolution 对象,其得分为解决方案 1 但内容为解决方案 2
这是我的规划方案class
@PlanningSolution
public class GroupSolution
{
@PlanningEntityCollectionProperty
private List<Request> request;
@ValueRangeProvider(id = "groupRange")
@ProblemFactCollectionProperty
private List<Group> proposedGroups;
@PlanningScore
private HardMediumSoftScore score;
// Others planning fact that I use in my EasyScoreCalculator
}
请求class
@PlanningEntity
public class Request
{
@PlanningVariable(valueRangeProviderRefs = {
"groupRange"
}, nullable = false)
private Group group;
// Other properties
}
配置
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<scanAnnotatedClasses>
<packageInclude>my.package.domain</packageInclude>
</scanAnnotatedClasses>
<!-- Score configuration -->
<scoreDirectorFactory>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
<easyScoreCalculatorClass>my.package.MyEasyScoreCalculator</easyScoreCalculatorClass>
</scoreDirectorFactory>
<constructionHeuristic />
<termination>
<minutesSpentLimit>5</minutesSpentLimit>
</termination>
</solver>
我正在使用具有 3 个评分级别的 EasyScoreCalculator,我是这样使用它们的:
- hard : 我只将它设置为 0 或 -1。如果 -1 我不计算其他分数,因为 -1 表示解决方案不适用
- 中等:价格,例如如果解决方案成本为 100 欧元,我的中等分数将为 -100
- soft :如果 2 个价格相同,我会使用此分数来选择具有更多空组(每个组的最大请求数)的解决方案。这个分数永远不会是负数
我将继续对此进行调查,但如果您有任何建议以获得正确的结果,请告诉我。
但主要问题是,您知道这是否是正常的 OptaPlanner 行为吗? 如果正常,在哪种情况下他会 return 一个不匹配的分数和解决方案?
1) 听起来像是乐谱损坏。鉴于 FAST_ASSERT "fixes it"(不是),运行 和 <environmentMode>NON_INTRUSIVE_FULL_ASSERT</environmentMode>
,如果它抛出异常,它可能会指出真正的问题,因为它检测到早前的问题。
2) 也可能是由于计划实体克隆腐败。这更难被发现。您是否使用自定义解决方案克隆器?是否有任何域 classes 引用了规划实体 class(es) 或规划解决方案(因此引用 Request
或 GroupSolution
)?任何 class 具有包含 Request
或 GroupSolution
实例的集合或地图的实体?