想象一下,我是一家面包店,试图通过我有限数量的原料来最大限度地增加馅料的数量。
以下每个饼图配方A, B, C, and D
都会生成1个饼图:
A = i + j + k
B = t + z
C = 2z
D = 2j + 2k
*食谱总是有线性形式,如上所述。
我有以下成分:
4 of i
5 of z
4 of j
2 of k
1 of t
我想要一种算法来最大化我的馅饼产量,因为我的成分有限。
这些示例输入的最佳解决方案将产生以下数量的馅饼:
2 x A
1 x B
2 x C
0 x D
= a total of 5 pies
我可以通过采用所有组合的最大生产者,但数量来轻松解决这个问题 随着成分的数量增加,组合变得令人望而却步。我觉得必须有 是这种优化问题的概括,我只是不知道从哪里开始。
虽然我只能烘烤整个馅饼,但我仍然有兴趣看到一种可能产生非整数结果的方法。
答案 0 :(得分:3)
您可以定义linear programming问题。我将在示例中显示用法,但它当然可以推广到任何数据。
将您的馅饼表示为您的变量(x1 = A,x2 = B,...),LP问题如下:
maximize x1 + x2 + x3 + x4
s.t. x1 <= 4 (needed i's)
x1 + 2x4 <= 4 (needed j's)
x1 + 2x4 <= 2 (needed k's)
x2 <= 1 (needed t's)
x2 + 2x3 <= 5 (needed z's)
and x1,x2,x3,x4 >= 0
这个问题的分数解可以多项式求解,但整数线性规划是NP-Complete。
问题确实是NP-Complete,因为给出integer linear programming问题,您可以使用相同的方法将问题减少到“最大化馅饼数量”,其中每个约束都是馅饼中的一个成分而变量是馅饼的数量。
对于整数问题 - 如果你可以使用“接近某个边界”,文献中有很多近似技术,(例如local ratio technique或primal-dual是经常使用)或者如果你需要一个精确的解决方案 - 指数解决方案可能是你最好的解决方案。 (当然,除非P=NP)
答案 1 :(得分:1)
由于你的所有函数都是线性的,听起来你正在寻找linear programming(如果连续值是可接受的)或integer programming(如果你需要你的变量是整数)。
线性编程是一种标准技术,可以有效解决。执行此操作的传统算法是simplex method。
整数编程通常是难以处理的,因为添加整数约束允许它描述难以处理的组合问题。似乎有大量的近似技术(例如,您可能只是尝试使用常规线性编程来查看可以获得的内容),但当然它们取决于问题的具体性质。