【发布时间】:2023-02-09 05:30:35
【问题描述】:
我正在尝试为我的网站优化二进制问题。
数据包含大约 75 个项目,每个项目都有重量(50 到 1000 之间)和一个价格附加到它。这是一个数据 sn-p:
{"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
}
}
我计算整个数据集的期望值
exp_val = (w1个p1个+ w2个p2个+ ... + wnpn) / 总和 (w1个+ w2个+ ... wn)
和
总和(w1个+ w2个+ ... wn) = 23665(考虑所有项目)
到目前为止一切顺利,但现在是棘手的部分。并非所有项目都是需要的,也就是说,它们的价值较低和/或权重较高,这会稀释我可以从中提取的资金池。
通过“阻止”或最多删除 3 个项目我只能从剩余的项目中提取,并通过这样做最大化加速价值函数。问题是:要删除哪些项目?由于价格随时间变化,我必须定期检查要移除的物品。
我从简单地删除权重最高和价格最低的项目开始,但我确信这只代表局部最优,并且会有更优化的策略。
在检查了一些网站之后,似乎混合整数线性规划 (MILP) 或特别是 BILP(二进制 ...) 可以解决我的问题,我找到了 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.milp.html 但无法使其工作,因为我'我坚持将我的问题转化为代码。谁能帮我吗?
【问题讨论】:
-
在编写代码之前,您应该在纸上正确地表述您的优化问题。入门:引入一个二进制变量 x_i,如果项目 i 被选中则为 1,否则为 0。然后,您想在约束 1/sum(x_i * w_i) = y 的情况下最大化 sum(y * x_i * w_i * p_i)。请注意,第二个约束等效于 1 = sum(y * x_i * w_i) 并且您可以线性化乘积 y * x_i,有关详细信息,请参阅this post。
标签: python-3.x optimization scipy-optimize mixed-integer-programming