簡體   English   中英

如何使用CP Optimizer對收貨和交付操作進行容量約束建模?

[英]How to model capacity constraints with pick-up and delivery operations with CP Optimizer?

我正在對具有容量限制的調度問題建模。 任務是安排必須由特定計算機執行的一組操作。 更具體地說,我有一組車輛和一組位置,這些車輛必須訪問這些位置才能執行一些操作。 每個位置最多只能處理一輛車,每輛車的容量最大。 有兩種類型的操作:提取和交付操作。 取貨操作對應於正需求,而交貨操作對應於負需求。 任務是在考慮到車輛的容量限制的同時安排所有操作。

我想使用CPLEX的CP優化器,並且正在使用Java Eclipse對其建模。

我嘗試使用cumul函數表達式對此進行建模,因為我可以使用StepAtStart函數來指示操作開始時容量的增加。 但是,該函數不會對負值建模。

我已經從SchedRCPSP示例獲得啟發,嘗試了這段代碼。 但是我不能輸入負值,也不能減去負需求的表達式。

IloIntervalVar[] opList = new IloIntervalVar[nbOp];
[...]
[...]
IloCumulFunctionExpr[] resources = new IloCumulFunctionExpr[nbVeh];
for(int v = 1; v < nbVeh -1 ; v++) {
      resources[v] = cp.cumulFunctionExpr();          
}
for(int i = 0; i < nbOp; i++) {
      Operation opi = operations.get(i);
      if(opi.Demand> 0) {
            resources[opi.vehicle] = 
            cp.sum(resources[opi.vehicle], 
                   cp.stepAtStart(opList[i], opi.Demand));
      }else {                        
            resources[opi.vehicle] = 
            // THIS SHOULD BE A SUBSTRACTION (NEGATIVE DEMAND)
            cp.sum(resources[opi.vehicle],
                  cp.stepAtStart(opList[i],opi.Demand));                        
      }
      if(opi.StartOperation){            
        resources[opi.vehicle] = 
        cp.sum(resources[opi.vehicle],
               cp.stepAtStart(opList[i],opi.initialLoad));
      }
}
for(int v = 1; v < nbVeh - 1 ; v++) {
      cp.add(cp.le(resources[v], inst.capacities.get(v)));
}

這是正確的方法嗎? 有沒有一種方法可以模擬車輛內部貨物的這種波動? 我想建模一種方法,禁止違反容量限制的車輛使用一定的vistis排列。

例如,如果我的車輛的容量為10個單位,初始負載為8個單位,並且有兩個操作A和B(操作A:在城市1上取4個單元,操作B:在城市2上取5個單元)。 我希望不允許排列(A-> B),因為它違反了城市1處車輛的容量限制。

更好的解決方案是為每個項目和每個可能的車輛創建一個可選的時間間隔變量,該間隔變量是裝載日期,結束日期是卸載日期,將其最小大小設置為裝載和卸載位置之間的時間距離。 (不要忘了為物品添加替代車輛)

那么,每輛車增加的累積約束為:

cp.add(cp.le(cp.sum(pulse(transport [v] [i],opi.initialLoad)),inst.capacities.get(v))));

由於加載和卸載日期之間的時間相關性,這將簡化模型聲明並提高求解器的性能

希望對您有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM