Optaplanner有以下問題。我們有解決方案,可以接收包含經度和緯度信息的一堆地點(用我們的ticekets)。這些門票然後通過Optaplanner庫進行優化,以獲得最接近的門票的最佳順序。這是事實上的車輛路線問題。Java Optaplanner - 在不同的機器上進行不同的計算
目前我們增加了最大數量的輸入門票高於15。但我面臨奇怪的問題。在我的機器上(Win 10,i7擁有4個內核,16 GB RAM,SSD),一切運行良好,50個進行了優化。同樣在我的朋友機器上也有一個i7 CPU。但是,當我將應用程序部署到採用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>
這裏是我的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
我怎樣才能解決這個問題呢?我真的沒有想法。
你好Geofrey,非常感謝你的回答!我有環境模式REPRODICIBLE,所以這不是問題的原因。我試圖在PC上運行速度很慢的CPU - 舊賽揚 - 並且一切順利。所以從我的角度來看,這不是我的代碼中的錯誤。你建議什麼?在專用PC上運行它?看來客戶不相信我會解決它,但我不知道還有什麼建議 –
我檢查了啓動階段打開TRACE級別日誌記錄的日誌。第一個區別在於第一步的計算: 我的本地PC: '移動索引(0),得分(-16init/0hard/0soft),移動(訪問(ticket = Ticket(id = 1178172,priorityOfTicket = 10, dueDate = 1502316000,estimatedTimeOfCompletion = 1800,location = Location(緯度= 29.666109,經度= -95.198724))){null-> Domicile(nextVisit = null,location = Location(緯度= 29.683423,經度= -95.258453),departureTime = 1502290342 )})。' –
remote VMWare: 'Move index(0),score(-16init/0hard/-7343soft),move(Visit(ticket = Ticket(id = 1178172,priorityOfTicket = 10,dueDate = 1502316000,estimatedTimeOfCompletion = 1800,location =位置(緯度= 29.666109,經度= -95.198724))){null - >住所(nextVisit = null,位置=位置(緯度= 29.683423,經度= -95.258453),departureTime = 1502290342)})。可以看到SOFT分數在不同的對方越來越多步 –