我一直无法将这个问题与一些规范相匹配,我想要一些指南来构建/使用算法并解决它。说明如下:
我们有些人想吃早餐。每个人都可以订购任意数量的咖啡,果汁和烤面包。我们累计所有小组的订单。
InitialOrder = { C1, J1, T1 } with C1, J1, T1 being integer non-negative numbers.
每个组件都有一个给定的价格,因此初始订单的总价格为
InitialPrice = C1 * Pc + J1 * Pj + T1 * Pt with Pc, Pj, Pt being rational positive numbers
自助餐厅还提供包含标准物品组合的“早餐菜单”
full breakfast = coffee + juice + toast normal breakfast = coffee + toast bread breakfast = 2 toast
选择这些菜单比单独选择每个组件要便宜,所以我们有
Pf < Pc + Pj + Pt Pn < Pc + Pt Pb < 2 * Pt with Pf, Pn, Pb being rational positive numbers
人们希望将初始订单分组到菜单中,以最大限度地减少花费的总金额。然后
FinalOrder = { C2, J2, T2, F, N, B } with C2, J2, T2, F, N, B integer non-negative numbers
我们将有一个FinalPrice&lt; = InitialPrice as
FinalPrice = C2 * Pc + J2 * Pj + T2 * Pt + F * Pf + N * Pn + B * Pb with Pc, Pj, Pt, Pf, Pn, Pb as rational positive numbers
所有价格(Pc,Pj,Pt,Pf,Pn和Pb)都是事先知道的。
请问,您知道我应该采用哪种方法来构建算法以最小化给定InitialOrder的FinalPrice?随意询问您需要的任何细节。
提前谢谢。
答案 0 :(得分:1)
这看起来像Linear Integer Programming问题。
给定线性约束(必须与初始订单匹配),您需要最小化六个变量和线性方程(最终价格)。限制是变量是非负的并且取整数值。
例如在你的例子中它将是(我假设你的实际问题比你的例子更复杂: - )
最小化
C2 * Pc + J2 * Pj + T2 * Pt + F * Pf + N * Pn + B * Pb
(将Pc等乘以适当的整数,以便在需要时使它们成为整数)
受制于
的限制 C2 + F + N = C1
T2 + F + N + 2B = T1
J2 + F = J1
在一般情况下,整数规划是NP-Hard,但考虑到问题的小尺寸和约束,标准求解技术可能很快就能为你解决。
希望有所帮助。
答案 1 :(得分:0)
如果你不想整个程序(整数线性编程,这是一个相当复杂的区域),请考虑使用分支绑定进行详尽的树搜索。 BnB本质上是深度优先搜索,您可以在当前分支的成本大于或等于目前为止找到的最佳解决方案的任何点回溯。
正如Moron所说,对于任何大问题,你都需要ILP。
答案 2 :(得分:0)
由于您的问题与bin打包(或至少是它的矢量版本)密切相关,因此一些相关的启发式方法也可能派上用场。具体来说,一个贪婪的启发式,你贪婪地包装完整的早餐(或2 *正常+吐司,取决于相对成本),然后继续这样,可能就足够了。