【问题标题】:Optaplanner add computerroom restrictionOptaplanner 添加机房限制
【发布时间】:2014-09-11 12:48:26
【问题描述】:

这是我在这里的第一篇文章,我正在为我的学习 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 的其他值,但它不起作用。 这只是一个小问题,约束更重要,但我们很乐意让程序运行!

问候 2014年9月

【问题讨论】:

    标签: java constraints optaplanner


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多