![](/img/trans.png)
[英]Matching participant with PuLP optimization: how to set constraints for a unique solution?
[英]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.