这是我在这里的第一篇文章,我正在为我的学习Java程序员的团队发布一个学校项目。所以我们不是优秀的程序员。 如何添加约束以使Optaplanner将讲座移动到特定的房间类型。 例如,我想将“编程”讲座转移到计算机室,将讲座“数学”转移到正常的房间。但是,由于我的约束,它宣布了严格的约束,但没有在他们的房间里移动讲座。这应该是一个消极的约束。因此显示了此硬约束的负分数,但仍无法解析/移动。
这是约束:
rule "computerroom"
when
$room : Room($computerroom : computerroom)
$course : Course(computerroom == $computerroom)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
我们在Room类中添加了一个新变量,如下所示:
package org.optaplanner.examples.curriculumcourse.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.optaplanner.examples.common.domain.AbstractPersistable;
@XStreamAlias("Room")
public class Room extends AbstractPersistable {
private String code;
private int capacity;
private boolean computerroom;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public boolean getComputerroom() {
return computerroom;
}
public void setComputerroom(boolean computerroom) {
this.computerroom = computerroom;
}
public int getCapacity() {
return capacity;
}
public void setCapacity(int capacity) {
this.capacity = capacity;
}
public String getLabel() {
return code;
}
@Override
public String toString() {
return code + " {C" + capacity + "}";
}
}
你有没有为我们提供建议?
另一件小事:Optaplanner获取了大量数据: 我们如何才能增加解决的最大秒数?因为我们尝试了超过1152的其他值,但它不起作用。 这只是一个小问题,约束更重要,但我们很乐意让程序运行!
电贺 SEP2014
答案 0 :(得分:1)
该得分规则不检查任何“计划变量”(=在求解过程中变化的变量)。所以它是静态的,它永远不会有与开始时不同的分数。
请考虑一下:
rule "computerroom"
when
// If there's a room which has no computer
$r : Room(hasComputer == false)
// And we're putting a course which needs a computer in that room
$course : Course(needsComputer == true, room == $r)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
重要的是 Course(..., room == $r)
。 room
是一个计划变量:它在规划期间会发生变化。
注意:如果他们使用计算机房(但很容易改变),这个不会惩罚那些不需要电脑的课程。
相同的规则,但写得更短,更有效率:
rule "computerroom"
when
$course : Course(needsComputer == true, room != null, room.hasComputer == false)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end