Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于纸浆中的先前解决方案施加约束?_Python_Optimization_Mathematical Optimization_Pulp_Mixed Integer Programming - Fatal编程技术网

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

Python 如何基于纸浆中的先前解决方案施加约束?,python,optimization,mathematical-optimization,pulp,mixed-integer-programming,Python,Optimization,Mathematical Optimization,Pulp,Mixed Integer Programming,所以我有一个混合整数程序,其中我的指标x在0或1中 取决于是否使用该项目。我想根据以下代码中的约束条件,使包中物品的价格最大化 我的问题是,我想重复这个过程有限次,每次都使用解决方案为下一次/下一轮施加进一步的约束 价格每一次/每一轮都会波动,因此需要包装不同的物品。但是,每次运行解算器时,我只允许一次自由更改。对于上一个解决方案集的每一个额外更改,每个项目将受到-100的处罚。玩具示例:如果最后一个解决方案是[0,0,1,1,0,0,0,0,0],新的解决方案是[1,1,0,0,0,0,0,0

所以我有一个混合整数程序,其中我的指标x在0或1中 取决于是否使用该项目。我想根据以下代码中的约束条件,使包中物品的价格最大化

我的问题是,我想重复这个过程有限次,每次都使用解决方案为下一次/下一轮施加进一步的约束

价格每一次/每一轮都会波动,因此需要包装不同的物品。但是,每次运行解算器时,我只允许一次自由更改。对于上一个解决方案集的每一个额外更改,每个项目将受到-100的处罚。玩具示例:如果最后一个解决方案是[0,0,1,1,0,0,0,0,0],新的解决方案是[1,1,0,0,0,0,0,0,0],那么在-100的目标中会受到惩罚,因为它们与上一轮相比有两个变化。如果它更改为[0,1,0,1,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]
items=[i代表范围内的i(len(df))]
价格=df['price'].to_dict()
音量=df['volume'].到dict()
重量=df[“重量”]。_dict()
prob=LpProblem('mip',LpMaximize)
x=LpVariable.dicts(“items”,items,0,1,LpBinary)
#客观的
prob+=lpSum([(项目中i的价格[i]*x[i]))
#约束条件
prob+=lpSum([x[i]表示项目中的i])=10
prob+=lpSum([weight[i]*x[i]表示项目中的i])不太容易

我想尝试一下:

(1) 引入一个二进制变量
d[i]∈ {0,1}
和约束条件:

 -d[i] <= x[i] - x0[i] <= d[i]
(3) 添加一个正变量
n1>=0
和约束

  n1 >= n - 1 
(4) 在目标中添加一个术语

 -100*n1

(我们想要最小化
100*n1
,所以我添加了减号,因为您的obj正在最大化)。

(1)为什么需要d[I]的系数为2或-2?x[i]-x0[i]只能是1-1或0。(1-0)即新选择,(0-1)即删除,(0-0)即未再次选择或(1-1)再次拾取。(2) 我不确定n的用途是什么?i和d的总和给了我们什么?谢谢你的表演(2)?不太确定我是否遵循逻辑……(2)n计算差异的数量。对不起,我对纸浆非常陌生,这一切都很混乱。那么你的意思是sum(i,d[i])基本上是lpSum(项目中i的[d[i])吗?n和n1是由以下LpVariable.dicts(“name”,items,0)添加的,还是它们本质上是作为常量变量添加的?这是伪代码(数学)表示法。翻译成纸浆是微不足道的。
 -100*n1