你面临的是线性规划问题,其中等式和不等式是限制条件,并且你想要最小化(然后最大化)表达式y
。等式、不等式和表达式都是线性的,因此这是线性规划问题。使用scipy.optimize.linprog
函数的scipy
包可以解决这种线性规划问题。
以下是可实现您需求的注释代码。请注意,所有不等式都稍作更改以包括等式,这对于具有最大或最小值y
是必要的。为了找到y
的最大值,该代码将寻找-y
的最小值,然后打印其加法逆元,因为linprog
会最小化目标函数。最后,linprog
的不等式约束必须是“小于等于”,因此我将不等式x + y> 180
的两侧都乘以-1
,得到一个新的不等式-x+-y <= -180
。如果您有任何问题,请随时提出。
from scipy.optimize import linprog
coefficients_inequalities = [[-1, -1]]
constants_inequalities = [-180]
coefficients_equalities = [[3, 12]]
constants_equalities = [1000]
bounds_x = (30, 160)
bounds_y = (10, 60)
coefficients_min_y = [0, 1]
res = linprog(coefficients_min_y,
A_ub=coefficients_inequalities,
b_ub=constants_inequalities,
A_eq=coefficients_equalities,
b_eq=constants_equalities,
bounds=(bounds_x, bounds_y))
print('Minimum value of y =', res.fun)
coefficients_max_y = [0, -1]
res = linprog(coefficients_max_y,
A_ub=coefficients_inequalities,
b_ub=constants_inequalities,
A_eq=coefficients_equalities,
b_eq=constants_equalities,
bounds=(bounds_x, bounds_y))
print('Maximum value of y =', -res.fun)
那段代码的输出结果为:
Minimum value of y = 43.3333333333
Maximum value of y = 51.1111111111
这是在浮点精度范围内正确的。如果您需要对应的x
值,请查看res.x
的值,它是一个数组,给出所需点上x
和y
的值- x
是res.x [0]
,而y
是res.x [1]
。
y
。在Python中搜索线性规划,如果您在实现它时遇到特定问题,请告诉我们。您可以从 scipy.optimize.linprog 开始。当您查看scipy时,是否研究过它? - Rory Daulton