Java Optaplanner - разные вычисления на разных машинах

У меня следующая проблема с Optaplanner. У нас есть решение, которое получает множество местоположений (в наших терминах ticekets) с информацией о долготе и широте. Эти билеты затем оптимизируются через библиотеку Optaplanner, чтобы получить лучшую последовательность билетов, которые являются ближайшими. Это проблема маршрутизации транспортных средств.

В настоящее время мы увеличиваем максимальное количество входных билетов до 15. Но я столкнулся со странной проблемой. На моей машине (Win 10, i7 с 4 ядрами, 16 ГБ ОЗУ, SSD) все работает очень хорошо и 50 оптимизированы. То же самое на машине моих друзей, которая также имеет процессор i7. Но когда я развертываю приложение в производственной среде, которая является рабочей станцией VMWare с процессором Intel Xeon, вычисление происходит очень медленно, и затраты времени на вычисление достигаются, а билеты не оптимизируются.

Мы перепробовали больше сред VMWare с разными конфигурациями, но все еще не дали хорошего результата (но я их не настраивал). Я пытался увеличить время ожидания вычислений, но он также вычисляет довольно низкие шаги вычислений. Я не могу смоделировать это на своей локальной машине (я также попытался запустить VMWare, установленную на моем компьютере, и все прошло нормально). Я обнаружил, что эвристическая фаза вычислений дает действительно разные значения, так что, возможно, это является источником проблем.

Вот мой конфигурационный файл optaplanner:

<solver>
    <solutionClass>com.keystone.core.domain.solver.TicketOptimizationSolution</solutionClass>
    <entityClass>com.keystone.core.domain.solver.Visit</entityClass>
    <entityClass>com.keystone.core.domain.solver.Appearance</entityClass>

    <scoreDirectorFactory>
        <scoreDefinitionType>HARD_SOFT_LONG</scoreDefinitionType>
        <scoreDrl>com/keystone/ticketOptimizer/solver/ticketOptimizerScoreRules.drl</scoreDrl>
        <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
    </scoreDirectorFactory>

    <termination>
        <secondsSpentLimit>25</secondsSpentLimit>
    </termination>

    <constructionHeuristic>
        <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
    </constructionHeuristic>

    <localSearch>
        <termination>
            <terminationCompositionStyle>OR</terminationCompositionStyle>
            <secondsSpentLimit>20</secondsSpentLimit>
            <unimprovedSecondsSpentLimit>5</unimprovedSecondsSpentLimit>
        </termination>
        <unionMoveSelector>
            <changeMoveSelector>
                <cacheType>PHASE</cacheType>
                <selectionOrder>SHUFFLED</selectionOrder>
            </changeMoveSelector>
            <swapMoveSelector/>
            <subChainChangeMoveSelector>
                <subChainSelector>
                    <maximumSubChainSize>50</maximumSubChainSize>
                </subChainSelector>
                <selectReversingMoveToo>true</selectReversingMoveToo>
            </subChainChangeMoveSelector>
            <subChainSwapMoveSelector>
                <selectReversingMoveToo>true</selectReversingMoveToo>
            </subChainSwapMoveSelector>
        </unionMoveSelector>
        <acceptor>​
            <stepCountingHillClimbingSize>400</stepCountingHillClimbingSize>
            <entityTabuSize>5</entityTabuSize>
        </acceptor>
        <forager>
            <acceptedCountLimit>1</acceptedCountLimit>
        </forager>
    </localSearch>
</solver>

Вот мои правила drolls:

// ############################################################################
// Hard constraints
// ############################################################################

rule "ticketNotDoneDueDate"
    when
        Visit($ticket: ticket, $departureTime: departureTime)
        Ticket($departureTime > dueDate, $dueDate: dueDate) from $ticket
    then
        scoreHolder.addHardConstraintMatch(kcontext, $dueDate - $departureTime);
end

// ############################################################################
// Soft constraints
// ############################################################################

rule "distanceToPreviousStandstill"
    when
        $visit : Visit(previousAppearance != null, $distanceFromPreviousStandstill : distanceFromPreviousStandstill)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, - (int)$distanceFromPreviousStandstill);
end

И, наконец, укладываю стрейс из моей машины и прод машины. Мой локальный ПК

Как я могу решить эту проблему? У меня действительно нет идей.

1 ответ

Невозможно, чтобы Construction Heuristic имел другую оценку, если он полностью завершился (и это было сделано в соответствии с обоими журналами) с помощью environmentMode REPRODICIBLE (который используется по умолчанию). Проверьте конфигурацию вашего решателя, чтобы доказать, что вы не используете environmentMode NON_REPRODICBLE (который раньше назывался PRODUCTION).

Если он по-прежнему отличается от environmentMode REPRODICIBLE, включите ведение журнала трассировки на обоих и покажите, где он отличается.

Разница в скорости вычисления оценок неудивительна: облачные виртуальные машины, контейнеры, GAE и т. Д. Часто имеют менее 1 физического ЦП на процесс в обычных учетных записях. Я часто видел, как они работают медленнее, чем локальные машины, за исключением выделенных облачных предложений (например, OpenShift Dedicated вместо OpenShift Online или GCE вместо GAE).

Другие вопросы по тегам