我对Optaplanner有以下问题。我们的解决方案可以获得具有长度和纬度信息的大量位置(在我们的术语ticekets中)。然后通过Optaplanner库对这些票证进行优化,以获得最接近的最佳票证序列。这是事故车辆路线问题。
目前我们将最大输入票数增加到15以上。但我面临着一个奇怪的问题。在我的机器上(Win 10,带有4个内核的i7,16 GB RAM,SSD)一切都运行良好,50个进行了优化。同样在我的朋友机器上也有i7 CPU。但是,当我将应用程序部署到生产环境时,这是VMWare工作站,使用Intel Xeon CPU计算速度非常慢,并且计算花费的时间已经达到,而且票证也没有优化。
我们尝试了更多具有不同配置的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>
这是我的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
我该如何解决这个问题?我真的没有想法。
答案 0 :(得分:1)
如果构造启发式完全(并且根据两个日志完成)与environmentMode REPRODICIBLE(这是默认值)完成,那么它是不可能的。检查求解器配置以证明您没有使用environmentMode NON_REPRODICBLE(以前称为PRODUCTION)。
如果它仍然与environmentMode REPRODICIBLE不同,请打开两者上的跟踪记录并显示它的不同之处。
分数计算速度的差异并不令人惊讶:云虚拟机,容器,GAE等在正常帐户中每个进程的物理CPU通常少于1个。我经常目睹它们比本地机器慢,除了专用的云产品(例如OpenShift Dedicated而不是OpenShift Online或GCE而不是GAE)。