Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在等式和完整性约束下最小化3个变量之和_Python_Algorithm_Linear Programming_Integer Programming - Fatal编程技术网

Python 在等式和完整性约束下最小化3个变量之和

Python 在等式和完整性约束下最小化3个变量之和,python,algorithm,linear-programming,integer-programming,Python,Algorithm,Linear Programming,Integer Programming,我正在处理一个编程(使用Python)问题,其中我必须在3个变量中求解以下类型的线性方程: x、 y,z都是整数 等式示例:2x+5y+8z=14 条件:最小化x+y+z 我一直在试图寻找一种算法,以最佳方式找到解决方案。如果有人有任何想法,请指导我通过算法或代码源 我只是好奇,如果这个问题被外推到n个变量,能做什么 我不想使用hit&trial循环来不断检查值。此外,可能存在一种情况,即方程没有解 更新 添加下限条件: x, y, z >= 0 x, y, z are natural

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

x、 y,z都是整数

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

条件:
最小化x+y+z

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

我只是好奇,如果这个问题被外推到n个变量,能做什么

我不想使用hit&trial循环来不断检查值。此外,可能存在一种情况,即方程没有解

更新

添加下限条件:

x, y, z >= 0
x, y, z are natural
任何z=(14-2x-5y)/8的三元组(x,y,z)都满足您的约束


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

从第一个方程:

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

所以,现在只需要最小化

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

那是

(14-3y-6z)/2

但是为了最小化,我们可以忽略'/2'部分


想必,您的问题上还存在一些其他限制,因为正如所述,解决方案是y和z都可以无边界增长。

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

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


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

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

我们得到了一个二维的无约束IP。考虑到完整性约束,我们有
u解决这类问题的另一个工具是。GitHub上还有一个易于使用的Python接口:


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

正如下面的答案所指出的,除非变量有界
x,y,z
。在某些问题中,所有变量的下限都为零是很常见的,但您没有指定这一点。一般来说,对于Python中的线性规划问题,我会推荐。也许听起来毫无意义,(x,y,z)是否需要一个整数解?是的,只寻找整数解。我在上面添加了Update2,以了解我在寻找算法编程方法时发现的问题。所有帮助的链接都是共享的,谢谢大家的帮助!谢谢,这看起来是最好的数学解。但是,我实际上是想通过编程来解决这个问题。我找到了
硬币兑换算法
,我想我可以用它来解决这类问题。
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)