Optaplanner增加了计算机房限制

时间:2014-09-11 12:48:27

标签: java constraints optaplanner

这是我在这里的第一篇文章,我正在为我的学习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

1 个答案:

答案 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