3

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

x, y, z 都是整数。

方程示例: 2x + 5y + 8z = 14

健康)状况:Minimize x + y + z

我一直在尝试寻找一种算法,以最佳方式找到解决方案。如果有人有任何想法,请通过算法或代码源指导我。

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

我不想使用命中和试验循环来继续检查值。此外,可能存在方程无解的情况。

更新

添加下限条件:

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

5 回答 5

3

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

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

我们在二维上获得了一个不受约束的 IP。给定完整性约束,我们有u <- {0,2}v <- {0,1}。枚举所有 (u,v)对,我们得出结论,最小值是4并且它是在 和 处达到的(u,v) = (2,0)(u,v) = (0,1)它们分别对应于(x,y,z) = (2,2,0)(x,y,z) = (3,0,1)

使用PuLP求解整数程序:

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 = 0z = 1

于 2016-10-06T01:48:34.193 回答
3

任何三元组(x, y, z),其中z = (14 - 2x - 5y) / 8 都满足您的约束。

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

于 2016-10-05T08:20:05.800 回答
1

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

一般来说(混合)整数规划问题很难解决(NP 复杂性),通常即使是看起来很简单的实例,只有几个变量和约束,也可能需要数小时来证明最优解。

于 2016-10-06T05:38:45.443 回答
0

从你的第一个方程:

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

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

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

这是

(14 - 3y - 6z) / 2

但我们可以忽略 ' / 2' 部分以最小化。

据推测,您的问题必须有其他一些限制,因为如上所述,解决方案是 y 和 z 都可以无限制地增长。

于 2016-10-05T08:33:03.553 回答
0

我不知道 n 个变量的任何通用快速解决方案,或者不使用命中和跟踪循环。但是对于给定的特定方程 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),asz只能是 1,x或者y是微不足道的。

(x+y+z = 4 对于 (x,z),对于 (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 > 14 已经,这意味着没有使用所有 3 个变量的解决方案


因此,简单地按逻辑,用1或2个变量来化简方程,我们可以发现x+y+z最小为4,达到14 (x=3,y=0,z=1 or x=2,y=2 ,z=0)

于 2016-10-05T09:00:03.060 回答