簡體   English   中英

如何根據 PuLP 中先前的解決方案施加約束?

[英]How to impose constraints based on previous solution in PuLP?

所以我有這個混合整數程序,其中我的指標 x 在 0 或 1 中,具體取決於項目是否被使用。 我想根據以下代碼中的約束最大化包中物品的價格。

我的問題是,我想重復這個過程有限的次數,並每次使用該解決方案對下一次/輪施加進一步的約束。

每次/輪次的價格都會波動,因此需要打包不同的物品。 但是,每次運行求解器時,我只允許進行一次免費更改 對於最后一個解決方案集的每個額外更改,每個項目都會受到-100 的懲罰。 玩具示例:如果最后一個解是 [0,0,1,1,0,0,0,0,0,0] 而新解是 [1,1,0,0,0,0,0, 0,0,0] 那么在 -100 的目標中會受到懲罰,因為它們比上一輪有 2 次變化。 如果它更改為 [0,1,0,1,0,0,0,0,0,0] 則不會受到懲罰。

如何在目標中施加此懲罰並施加 1 個自由更改約束?

初始程序如下:

items = [i for i in range(len(df))]
price = df['price'].to_dict()
volume = df['volume'].to_dict() 
weight = df['weight'].to_dict()


prob = LpProblem('mip',LpMaximize)
x = LpVariable.dicts("items", items, 0, 1, LpBinary)

#objective
prob += lpSum([(price[i]*x[i]) for i in items])

#constraints
prob += lpSum([x[i] for i in items]) = 10
prob += lpSum([weight[i] * x[i] for i in items]) <= 1000
prob += lpSum([volume[i] * x[i] for i in items]) <= 5000

prob.solve()

#to get the solution in a list for reuse
current_solution = [x[i].varValue for i in items]

我想過在 var[i] 中使用價格 = -100 的虛擬項目,但無法讓它工作。 有什么幫助嗎? 非常感謝。

不是超級容易。

我會嘗試類似的東西:

(1) 引入二元變量d[i] ∈ {0,1}和約束條件:

 -d[i] <= x[i] - x0[i] <= d[i]

其中x0是以前的解決方案。 (這必須在 PuLP 中實現為兩個不同的約束。此外,我們實際上可以將d放寬為在 0 和 1 之間連續:它將自動為二進制。)

(2) 添加變量n和約束:

  n = sum(i, d[i])

(3) 添加一個正變量n1 >= 0和約束

  n1 >= n - 1 

(4) 為目標添加一項

 -100*n1

(我們想最小化100*n1所以我添加了減號,因為你的 obj 正在最大化)。

暫無
暫無

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

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