我正在编程(使用Python)问题,我必须在3个变量中解决以下类型的线性方程:
x,y,z都是整数。
公式示例:2x + 5y + 8z = 14
条件:Minimize x + y + z
我一直在尝试以最佳方式搜索找到解决方案的算法。如果有人有任何想法,请指导我完成算法或代码来源。
我只是好奇,如果将此问题外推到n个变量,可以做些什么?
我不想使用hit&试用循环以继续检查值。此外,可能存在方程式没有解决方案的情况。
更新
添加下限条件:
x, y, z >= 0
x, y, z are natural
答案 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 = 3
和y = 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<=7
,0<=y<=2
,0<=z<=1
除x = 7外,您至少要使用2个变量。 (对于这种情况,x + y + z = 7)
如果只使用2个变量,让我们找到我们得到的东西:
如果您选择使用(x,z)或(y,z),因为z
只能为1,x
或y
是微不足道的。
(对于(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)