我的一个编码项目中存在以下问题,在此我将对其进行简化:
我正在在线订购食品杂货,并且需要非常特定数量的特定物品。我想订购以下商品:
有许多商店与我等距,我将从那里运送食物。并非所有商店都有我需要的东西。 我想用最少的订单数来获得所需的东西。例如,从下面的#2商店订购是浪费的订单,因为通过从不同的商店订购,我可以用更少的订单完成商品。 能解决这个问题的优化算法的名字是什么?
商店#1供应
第2个商店的货源
1橙汁
2牛排
1汤
商店#3供应
25汤
50橙汁
商店#4供应
25牛排
10根山药
在这种情况下,最低的可能顺序是3
。 #1商店有8个苹果。 #3商店的2汤和20橙汁。 #4商店有1块山药和3块牛排。
答案 0 :(得分:1)
在我看来,这很可能是Integer Linear programming problem (ILP)的一种受限情况,即其0或1变体,其中整数变量仅限于集合{0,1}。已知这是NP难的(相应的决策问题是NP完全的)。
此问题的表达方式如下(遵循引文中的约定):
给出矩阵 A ,约束向量 b 和权重向量 c ,找到向量 x ∈∈{0,1} N 因此满足所有约束 A⋅x ≥ b ,并且成本 c⋅x 很小。
我翻转了约束不等式,但这等效于更改 A 和 b 的符号
不等式表示您对订单的满意程度:您可以至少在所逛商店中购买每件商品的金额。请注意, b 的长度与 A 中的行数以及两个< em> c 和 x 。点积 c⋅x 自然是一个标量。
由于您要尽量减少旅行次数,因此每次旅行的费用相同,因此 c == 1 和 < strong>c⋅x 是旅行总数。商店库存矩阵 A 每个项目都有一行,每个商店都有一列,而 b 是您的购物清单。
自然地,通过尝试 x 的所有可能的2 N 值,可以找到确切的最佳解决方案。
由于没有单一的方法可以解决NP难题,因此请考虑问题的大小以及您要达到的最佳值的接近程度。当“库存”很大时,贪婪的方法会很有效(当您下一个要访问的商店的物品总数最多时)。如果您事先对预期的最小行程数有所了解,则可以将搜索光束调整为某个值,使行程数超出某个倍增系数。当您的搜索受到时间限制时,这是最好的方法(我通常进行波束搜索,与本文中提到的分支和剪切方法密切相关,在图形中占用几GB内存的速度略快于每个内存30ms的限制光束宽达10,000的探测步骤)。如果搜索范围不太粗糙,模拟退火也可以。
也search on cs.SE;对于这类问题,它甚至可能是一个更好的地方。