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


person Zorian    schedule 11.09.2014    source источник


Ответы (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
person Geoffrey De Smet    schedule 12.09.2014