2017-08-25 100 views
1

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 

最後堆棧從我的機器和生產線的機器strace的。 My local PC

enter image description here

我怎樣才能解決這個問題呢?我真的沒有想法。

回答

1

如果環境模式REPRODICIBLE(這是默認值)完全完成(並且它根據兩個日誌完成),構建啓發式將不可能有不同的分數。檢查你的求解器配置,證明你沒有使用environmentMode NON_REPRODICBLE(以前稱爲PRODUCTION)。

如果它仍然與environmentMode REPRODICIBLE不同,請打開兩者上的跟蹤日誌並顯示其不同之處。

分數計算速度的差異並不奇怪:雲VM,容器,GAE等在正常帳戶中每個進程通常具有少於1個物理CPU。我經常目睹它們比本地機器慢,除了專用雲產品(例如OpenShift Dedicated,而不是OpenShift Online或GCE而不是GAE)。

+0

你好Geofrey,非常感謝你的回答!我有環境模式REPRODICIBLE,所以這不是問題的原因。我試圖在PC上運行速度很慢的CPU - 舊賽揚 - 並且一切順利。所以從我的角度來看,這不是我的代碼中的錯誤。你建議什麼?在專用PC上運行它?看來客戶不相信我會解決它,但我不知道還有什麼建議 –

+1

我檢查了啓動階段打開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 )})。' –

+1

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分數在不同的對方越來越多步 –

相關問題