OptaPlanner возвращает лучший результат, но не связанное с ним решение - PullRequest
0 голосов
/ 27 марта 2020

Я работаю над такой проблемой, как CloudBalancing с OptaPlanner 7.33.0.

Возвращенный объект PlanningSolution содержит наилучший расчетный показатель, но решение не соответствует. Я отладил все решения с очень маленьким набором данных, и возвращенное решение кажется последним, так как оно не имеет возвращенного результата.

Пример:

  • 1: Решение с наилучшей оценкой имеет оценку 0hard / -1197medium / 4soft
  • 2: Возвращенное решение имеет оценку: 0hard / -1198medium / 2soft
  • Решатель возвращает объект PlanningSolution с оценкой решения 1, но с содержанием решения 2

Это мой класс решения планирования

@PlanningSolution
public class GroupSolution
{
    @PlanningEntityCollectionProperty
    private List<Request> request;

    @ValueRangeProvider(id = "groupRange")
    @ProblemFactCollectionProperty
    private List<Group> proposedGroups;

    @PlanningScore
    private HardMediumSoftScore score;

    // Others planning fact that I use in my EasyScoreCalculator
}

Класс запроса

@PlanningEntity
public class Request
{
    @PlanningVariable(valueRangeProviderRefs = {
        "groupRange"
    }, nullable = false)
    private Group group;

    // Other properties
}

Конфигурация

<?xml version="1.0" encoding="UTF-8"?>
<solver>
  <scanAnnotatedClasses>
    <packageInclude>my.package.domain</packageInclude>
  </scanAnnotatedClasses>

  <!-- Score configuration -->
  <scoreDirectorFactory>
    <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
    <easyScoreCalculatorClass>my.package.MyEasyScoreCalculator</easyScoreCalculatorClass>
  </scoreDirectorFactory>

  <constructionHeuristic />

  <termination>
    <minutesSpentLimit>5</minutesSpentLimit>
  </termination>
</solver>

Я использую EasyScoreCalculator с 3 уровнями оценки и использую их следующим образом:

  • hard: я только установил 0 или -1. если -1 я не называю c, другие оценивают как -1, значит, решение не применимо
  • средний: цена, например, если решение стоит 100 евро, мой средний балл будет -100
  • soft: если 2 цены одинаковы, я использую этот показатель, чтобы предпочесть решение с более пустой группой (наибольшее количество запросов на группу). Эта оценка никогда не бывает отрицательной

Я буду продолжать расследование по этому вопросу, но если у вас есть какие-либо предложения, чтобы получить правильный результат, вы можете сказать мне.

Но главный вопрос, сделать Вы знаете, нормальное ли это поведение OptaPlanner или нет? Если это нормально, то в каком случае он вернет несоответствующий счет и решение?

1 Ответ

1 голос
/ 28 марта 2020

1) Звучит как искаженная оценка. Учитывая, что FAST_ASSERT «исправляет» (но не исправляет), запустите его с <environmentMode>NON_INTRUSIVE_FULL_ASSERT</environmentMode>, если оно выдает исключение, это может указать на реальную проблему, потому что она обнаруживает проблему ранее.

2 ) Также может быть связано с клонированием коррупции объекта планирования. Это сложнее обнаружить. Используете ли вы клонер решения? Существуют ли какие-либо доменные классы, которые имеют ссылки на класс (ы) объекта планирования или на решение для планирования (поэтому ссылки Request или GroupSolution)? Любые классы, которые имеют коллекцию или карту с Request или GroupSolution экземплярами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...