Модульная конфигурация оптапланера - PullRequest
1 голос
/ 25 апреля 2020

Вопрос:

Есть ли способ написать файл конфигурации решателя, который содержит вставки частей конфигурации из других xml -файлов в Optaplanner?

Объяснение:

Я пытаюсь выполнить несколько довольно сложных тестов производительности с частично очень разными конфигурациями решателя, такими как разные

  • этапы локального поиска
  • классы фильтров
  • наборы правил drool
  • et c.

Из-за этого шаблонный способ, показанный в этом тесте, ограничивает видео спасения недостаточно.

Так как XML имеет вставку DTD Entity, я подумал о модульности сложных шаблонов конфигурации и их повторном использовании в разных наборах, но, к сожалению, Optaplanner, похоже, не поддерживает эту функцию при чтении файл конфигурации решателя.

java.lang.IllegalArgumentException: Unmarshalling of benchmarkConfigResource (path/to/my/benchmarkConfig.xml) fails..
...
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.io.StreamException
cause-message       : 
class               : org.optaplanner.core.config.solver.SolverConfig
required-type       : org.optaplanner.core.config.solver.SolverConfig
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 42
class[1]            : org.optaplanner.benchmark.config.SolverBenchmarkConfig
class[2]            : org.optaplanner.benchmark.config.PlannerBenchmarkConfig
version             : 1.4.10
-------------------------------
...

Пример

Идея состоит в том, чтобы иметь каталог файлов conifg примерно так:

|--- benchmarkConfig.xml
|--- header.xml
|--- scoreDirectorFactory_1.xml
|--- scoreDirectorFactory_2.xml
|--- ...
|--- localSearch_tabuSearch.xml
|--- localSearch_hillClimber.xml
|--- ...

И benchmarkConfig.xml в форме этого

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plannerBenchmark [
        <!ENTITY header SYSTEM "header.xml">
        <!ENTITY scoreDirectorFactory_1 SYSTEM "scoreDirectorFactory_1.xml">
        <!ENTITY scoreDirectorFactory_2 SYSTEM "scoreDirectorFactory_2.xml">
        <!ENTITY localSearch_tabuSearch SYSTEM "localSearch_tabuSearch.xml">
        <!ENTITY localSearch_hillClimber SYSTEM "localSearch_hillClimber.xml">
        ]>
<plannerBenchmark>
    ...
    <inheritedSolverBenchmark>
        ...

        <solver>
            &header;
        </solver>
    </inheritedSolverBenchmark>


    <solverBenchmark>
        <name>SDF1-TabuSearch</name>
        &scoreDirectorFactory_1;
        <localSearch>
            &localSearch_tabuSearch;
        </localSearch>
    </solverBenchmark>

    <solverBenchmark>
        <name>SDF1-TabuSearch-HillClimber</name>
        &scoreDirectorFactory_1;
        <localSearch>
            &localSearch_tabuSearch;
        </localSearch>
        <localSearch>
            &localSearch_hillClimber;
        </localSearch>
    </solverBenchmark>

    <solverBenchmark>
        <name>SDF1-HillClimber</name>
        &scoreDirectorFactory_1;
        <localSearch>
            &localSearch_hillClimber;
        </localSearch>
    </solverBenchmark>

    <solverBenchmark>
        <name>SDF2-TabuSearch</name>
        &scoreDirectorFactory_2;
        <localSearch>
            &localSearch_tabuSearch;
        </localSearch>
    </solverBenchmark>

    ...

</plannerBenchmark>

Как будто использование системы эталонных тестов Optaplanner было бы довольно мощным, ИМХО.

1 Ответ

0 голосов
/ 25 апреля 2020

Это не поддерживается direclty, но с учетом того, что:

  • (если используется шаблон freemarker, который выводит XML)
  • вход XML напрямую переводится в обычный старые java классы, через XStream. Класс root равен PlannerBenchmarkConfig
  • , и вы можете программно добавлять и удалять элементы et c в этих java классах вместо того, чтобы проходить через XML. Некоторые из тех элементов, которые вы добавляете, вы также можете прочитать из xml.
  • В конце вы можете вызвать PlannerBenchmarkFactory.create(PlannerBenchmarkConfig benchmarkConfig), который возвращает PlannerBenchmarkFactory.

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

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