我正在为我的网站优化一个二进制问题。
数据包含大约75个项目,每个项目都有一个权重(50到1000之间)和一个价格。
{"weighting":{
"0":500,
"1":50,
"2":50,
"3":50,
"4":250,
"5":1000
},
"price":{
"0":4,
"1":78,
"2":75,
"3":170,
"4":5,
"5":4
}
}
我用下式计算整个数据集的期望值
瓦尔=(w1 p1 + w2 p2 +...+ wn pn)/总和(w1 + w2 +... wn)
与
总和(w1 + w2 +... wn)= 23665(考虑所有项目)
到目前为止一切顺利,但现在来了棘手的部分。并不是所有的项目都是想要的,也就是说,他们的价值较低和/或有一个高权重,稀释了池,我可以借鉴。
通过“阻塞”或删除最多3个项目,我只能从剩余项目中提取,这样做可以最大化加速值函数。哪些项目要删除?由于价格随着时间的推移而变化,我必须定期检查要删除的项目。
我已经开始简单地删除具有最高权重和最低价格的项目,但我敢肯定,这只代表了一个局部最优,并会有一个更优的战略。
在查看了一些网站后,似乎混合整数线性规划(MILP)或特别是BILP(binary...)可以解决我的问题,我找到了https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.milp.html,但无法使其工作,因为我坚持将我的问题转换为代码。有人能帮助我吗?
3条答案
按热度按时间6xfqseft1#
我尝试了以下方法:
看来问题就出在这一部分:
不管我怎么重新措辞(尝试@Bhartendu Awasthi建议
但目标函数始终返回0,尽管它应该返回0(不删除任何内容)
如果我们排除第3、4和5项,则结果应为
我目前没有解决办法,但会在未来几天内尝试解决它。
ddarikpa2#
利用@joni的评论,我已经把它翻译成了代码,决策变量的乘法不是线性的,你必须通过添加另一个中间连续决策变量来线性化乘积。
然而,如果您使用Google-ortool的CP-SAT求解器(我已经使用过),它可以处理一些非线性运算,如决策变量的乘法、除法等,这是纯线性求解器所不支持的。
代码列表
qojgxg4l3#
我的解决方案是:
在或tools中的cpmodel中,您可以通过使用
然后像这样构造代码
请注意,在
要添加变量名,即在创建变量时使用第三个参数(str):
这样一来,我发现我不必遵循Jonis的建议,因为ortool的cpmodel可以自己处理二进制变量,下面的代码很适合我:
您可能想知道为什么我在代码中添加了一个常量(没有它就不能工作)。
始终将结果舍入为整数值,并且由于结果在8.something的范围内,因此目标函数始终返回8。但是,如果将分子乘以1000,则8.3456变为8345,8.4334变为8433,因此可以正确计算。
希望这对任何有类似问题的人都有帮助。另外,非常感谢乔尼和巴滕杜为我指明了正确的方向!