在optaplanner

时间:2016-11-28 22:14:41

标签: java entity drools optaplanner

我正在使用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");
}

但非方法有效。

0 个答案:

没有答案