Java Optaplanner添加计算机室限制

Java Optaplanner添加计算机室限制,java,constraints,optaplanner,Java,Constraints,Optaplanner,这是我在这里的第一篇文章,我为我的学习Java程序员团队发布了一个学校项目。所以我们不是优秀的程序员。 如何添加约束以使Optaplanner将讲座移动到特定的房间类型中。 例如,我想把“编程”课搬到电脑室,把“数学”课搬到普通房间。但在我的约束下,它声明了硬约束,但没有移动他们房间里的讲座。这应该是一个消极的约束。因此,显示了此硬约束的负分数,但它仍然不会被解决/移动 以下是限制条件: rule "computerroom" when $room : Room($comp

这是我在这里的第一篇文章,我为我的学习Java程序员团队发布了一个学校项目。所以我们不是优秀的程序员。 如何添加约束以使Optaplanner将讲座移动到特定的房间类型中。 例如,我想把“编程”课搬到电脑室,把“数学”课搬到普通房间。但在我的约束下,它声明了硬约束,但没有移动他们房间里的讲座。这应该是一个消极的约束。因此,显示了此硬约束的负分数,但它仍然不会被解决/移动

以下是限制条件:

rule "computerroom"
    when
       $room : Room($computerroom : computerroom)
       $course : Course(computerroom == $computerroom)
    then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
end
我们向教室添加了一个新变量,如下所示:

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以上的其他值,但不起作用。 这只是一个小问题,约束更重要,但我们很乐意让程序运行

问候
2014年9月

评分规则没有检查任何“计划变量”(=在求解过程中发生变化的变量)。所以它是静态的,它的分数永远不会和它开始时的分数不同

请考虑以下情况:

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
这里重要的是
课程(…,room==r)
房间
是一个规划变量:它在规划过程中会发生变化

注意:这一条不会惩罚那些不需要电脑的课程,如果他们使用电脑室(但这很容易改变)

同样的规则,但写得更短更有效:

rule "computerroom"
  when
    $course : Course(needsComputer == true, room != null, room.hasComputer == false)
  then
    scoreHolder.addHardConstraintMatch(kcontext, -1);
end