如何基于PuLP中的先前解决方案施加约束?

问题描述

所以我有一个混合整数程序,其中指标x处于0或1 取决于是否使用该物品。我想根据以下代码中的限制,使袋子中物品的价格最大化。

我的问题是,我想重复此过程有限次,并在每次下回合/回合中每次都使用该解决方案施加更多约束。

价格每次/每轮波动,因此需要包装不同的物品。但是,我每次运行求解器都只允许一个免费更改。对于最后一个解决方案集进行的每个其他更改,将对每个项目收取-100的罚款。玩具示例:因此,如果最后一个解决方案是[0,1,0],而新解决方案是[1,0, 0,0],则目标是-100,这是因为他们与上一轮相比有2处变化。如果将其更改为[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,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最大化时,我添加了减号)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...