我正在使用optaplanner框架来解决优化问题。
有一个计划实体“提供”具有计划变量“volume”。还有另一个名为“price”的JavaBean属性,它是卷的函数。
在解决方案运行期间更改“音量”时,是否可以一次性更改“价格”和“音量”属性?
提供类除其他外还有“音量”设定器
setVolume(int volume) {
this.volume = volume;
recalculatePrice();
}
我正在使用自定义移动类来扩展AbstractMove以更改音量
protected void doMoveOnGenuineVariables(ScoreDirector sd) {
sd.beforeVariableChanged(offering, "volume");
offering.setVolume(volume);
// volume was passed to constructor on creation
sd.afterVariableChanged(offering, "volume");
}
在优化运行期间,我确实看到价格被更改,但解决方案的最终价格始终是创建产品时设置的初始价格(drools引擎使用价格属性来计算分数)。
我也尝试将价格作为计划变量,并以不同方式实现doMoveOnGenuineVariables:
protected void doMoveOnGenuineVariables(ScoreDirector sd) {
sd.beforeVariableChanged(offering, "volume");
sd.beforeVariableChanged(offering, "price");
offering.setVolume(volume);
sd.afterVariableChanged(offering, "price");
sd.afterVariableChanged(offering, "volume");
}
或
protected void doMoveOnGenuineVariables(ScoreDirector sd) {
sd.beforeVariableChanged(offering, "volume");
offering.setVolume(volume);
sd.afterVariableChanged(offering, "volume");
sd.beforeVariableChanged(offering, "price");
offering.recalculatePrice();
sd.afterVariableChanged(offering, "price");
}
但非方法有效。