所以我在drools中创建了一个自定义分数:
public interface MyScore extends Score<MyScore>
并已实施。但是我看不到如何使用分数。配置有一个
<scoreDefinition>
标记,但将除 SIMPLE 或 HARD_AND_SOFT 之外的任何内容放入其中会产生错误。
如何配置求解器以使用我创建的分数,文档似乎暗示这是可能的,但没有详细说明。
所以我在drools中创建了一个自定义分数:
public interface MyScore extends Score<MyScore>
并已实施。但是我看不到如何使用分数。配置有一个
<scoreDefinition>
标记,但将除 SIMPLE 或 HARD_AND_SOFT 之外的任何内容放入其中会产生错误。
如何配置求解器以使用我创建的分数,文档似乎暗示这是可能的,但没有详细说明。
这本来是可能的(也是一种正常的做法),但有一个障碍。
我刚刚添加了这个文档:
实施自定义分数
要实施自定义分数,您还需要实施自定义 ScoreDefinition。扩展 AbstractScoreDefinition(最好通过复制粘贴 HardAndSoftScoreDefinition 或 SimpleScoreDefinition)并从那里开始。
接下来,在 SolverConfig.xml 中挂钩自定义 ScoreDefinition:
<scoreDefinition>
<scoreDefinitionClass>org.drools.planner.examples.my.score.definition.MyScoreDefinition</scoreDefinitionClass>
</scoreDefinition>
路障
我将为 5.3 或 5.4 修复一个障碍:
ScoreDefinitionConfig 有这个代码:
/**
* @TODO score-in-solution refactor
*/
public ScoreCalculator buildScoreCalculator() {
if (scoreDefinitionType != null) {
switch (scoreDefinitionType) {
case SIMPLE:
return new SimpleScoreCalculator();
case SIMPLE_DOUBLE:
return new SimpleDoubleScoreCalculator();
case HARD_AND_SOFT:
return new DefaultHardAndSoftConstraintScoreCalculator();
default:
throw new IllegalStateException("The scoreDefinitionType (" + scoreDefinitionType
+ ") is not implemented");
}
} else {
return new SimpleScoreCalculator();
}
}
处理该问题的一种方法是扩展 ScoreDefinitionConfig 并覆盖该方法,如手册中使用自定义选择器、接受器或觅食者一节中所述。
就我所见,可能不支持自定义分数,这很遗憾......我检查了 ScoreDefinitionConfig 类,我看到了这个:
switch (scoreDefinitionType) {
case SIMPLE:
return new SimpleScoreDefinition();
case HARD_AND_SOFT:
return new HardAndSoftScoreDefinition();
default:
throw new IllegalStateException("scoreDefinitionType ("
+ scoreDefinitionType + ") not implemented");
所以,除了 SIMPLE 和 HARD_AND_SOFT 之外的任何东西都不会削减它......
对此有何见解?
KR,路易斯