最小化受到相等和完整性约束的3个变量的总和

时间:2016-10-05 08:17:10

标签: python algorithm linear-programming integer-programming

我正在编程(使用Python)问题,我必须在3个变量中解决以下类型的线性方程:

x,y,z都是整数。

公式示例:2x + 5y + 8z = 14

条件:Minimize x + y + z

我一直在尝试以最佳方式搜索找到解决方案的算法。如果有人有任何想法,请指导我完成算法或代码来源。

我只是好奇,如果将此问题外推到n个变量,可以做些什么?

我不想使用hit&试用循环以继续检查值。此外,可能存在方程式没有解决方案的情况。

更新

添加下限条件:

x, y, z >= 0
x, y, z are natural

5 个答案:

答案 0 :(得分:3)

任何三重(x,y,z) z =(14 - 2x - 5y)/ 8 ,满足您的约束条件。

请注意, x + y +(14 - 2x - 5y)/ 8 是从下面无界限的。当 x y 中的每一个减少时,此函数减少,没有有限的最小值。

答案 1 :(得分:2)

只有3个维度,你有一个相等约束的整数程序(IP)。等式约束2 x + 5 y + 8 z = 14定义了三维空间中的平面。参数化,

x = 7 - 2.5 u - 4 v
y = u
z = v 

我们在2维中获得无约束 IP。鉴于完整性限制,我们有u <- {0,2}v <- {0,1}。列举所有四个 (u,v)对,我们得出结论:最小值为4,并且在(u,v) = (2,0)(u,v) = (0,1)处达到,它们对应{分别为{1}}和(x,y,z) = (2,2,0)

使用PuLP解决整数程序:

(x,y,z) = (3,0,1)

生成from pulp import * # decision variables x = LpVariable("x", 0, None, LpInteger) y = LpVariable("y", 0, None, LpInteger) z = LpVariable("z", 0, None, LpInteger) # define integer program (IP) prob = LpProblem("problem", LpMinimize) prob += x+y+z # objective function prob += 2*x + 5*y + 8*z == 14 # equality constraint # solve IP prob.solve() # print results print LpStatus[prob.status] print value(x) print value(y) print value(z) x = 3y = 0

答案 2 :(得分:1)

解决此类问题的另一个工具是SCIP。 GitHub上还有一个易于使用的Python界面:PySCIPOpt

一般情况下(混合)整数规划问题很难解决(NP复杂度),即使是只有少量变量和约束的简单查看实例,也可能需要数小时才能证明最优解。

答案 3 :(得分:0)

从你的第一个等式:

x =(14 - 5y - 8x)/ 2

所以,你现在只需要最小化

(14 - 5y - 8z)/ 2 + y + z

(14 - 3y - 6z)/ 2

但我们可以忽略&#39; / 2&#39;部分用于最小化目的。

据推测,你的问题肯定会有一些其他限制,因为正如所描述的那样,解决方案是y和z都可以无限制地增长。

答案 4 :(得分:0)

我不知道n个变量的任何通用快速解决方案,或者不使用命中&amp;尾随循环。但是对于给定的特定方程2x + 5y + 8z = 14,可能存在一些基于观察的捷径。

请注意,对于任何可能的解决方案,范围都非常小:

0<=x<=70<=y<=20<=z<=1

除x = 7外,您至少要使用2个变量。 (对于这种情况,x + y + z = 7)

如果只使用2个变量,让我们找到我们得到的东西:

如果您选择使用(x,z)或(y,z),因为z只能为1,xy是微不足道的。

(对于(x,z),x + y + z = 4,对(y,z)没有解决方案)

如果你选择使用(x,y),因为x的系数是偶数且y的系数是奇数,你必须选择偶数y来实现甚至是RHS (14)。这意味着y必须为2,x则是微不足道的。

(对于这种情况,x + y + z = 4)

如果使用所有3个变量,让我们找到我们得到的结果:

同样地,z必须为1,所以基本上它使用2个变量(x,y)来实现14-8 = 6,这是偶数。

我们再次使用相似的参数,因此我们必须选择偶数y,即2,但此时2y + 1z&gt;已经14,这意味着没有使用所有3个变量的解决方案

因此,简单地通过逻辑,通过使用1或2个变量来减少等式,我们可以发现最小x + y + z是4 以实现14 (x = 3,y = 0,z = 1或x = 2,y = 2,z = 0)