有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Optaplanner在不同的机器上进行不同的计算

我对Optaplanner有以下问题。我们有一个解决方案,可以接收到一系列带有经度和纬度信息的位置(用我们的术语ticekets)。然后通过Optaplanner库优化这些票证,以获得最接近的最佳票证序列。这实际上就是车辆路径问题

目前,我们将输入票证的最大数量增加到15张以上。但我面临着一个奇怪的问题。在我的机器上(Win 10,i7,4核,16 GB RAM,SSD),一切都很好,50个都经过了优化。在我朋友的机器上也是一样,它也有i7处理器。但是,当我将应用程序部署到生产环境中时,即使用Intel Xeon CPU的VMWare工作站,计算速度非常慢,计算时间很长,并且没有优化票证

我们尝试了更多配置不同的VMWare环境,但仍然没有取得好的效果(但我没有配置它们)。我试图增加计算的超时时间,但它也只能计算相当低的计算步骤。我无法在我的本地机器上模拟它(我还尝试在安装在PC上的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>

以下是我的滑稽规则:

// ############################################################################
// 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

最后从我的机器和prod机器上叠加strace。 My local PC

enter image description here

我该如何解决这个问题?我真的没有主意了


共 (1) 个答案

  1. # 1 楼答案

    如果构造启发式完全使用environmentMode REPRODICIBLE(这是默认设置)完成(并且根据两个日志完成),那么它不可能有不同的分数。检查您的解算器配置,以证明您没有使用environmentMode NON_Reprodible(以前称为PRODUCTION)

    如果它仍然与environmentMode REPRODICIBLE不同,请在两者上打开跟踪日志记录,并显示其不同之处

    分数计算速度的差异并不令人惊讶:云虚拟机、容器、GAE等在正常帐户中每个进程的物理CPU通常少于1个。我经常看到它们比本地机器慢,除了专用的云产品(例如OpenShift专用而不是OpenShift Online或GCE而不是GAE)