【发布时间】:2022-02-24 02:05:56
【问题描述】:
朋友 - 有人可以帮我在 python 中使用 scipy 制定一个 LP 问题,如下所示,对于这个幼稚的问题,我完全无法开始。我可以在 excel 中做到这一点,但在 python 中发现它很困难(我是这个库的新手,无法解决) 如果有人可以帮助我,我将非常感激:
import pulp as p
import numpy as np
arr = np.array([[0.1167, 2.40, 6.95], [0.1327, 3.44, 15.1], [0.1901, 3.76, 12.7]])
arr = arr.transpose()
# create a problem
Lp_prob = p.LpProblem('Problem', p.LpMinimize)
# create variables
x1 = p.LpVariable("x1", lowBound=0, upBound=np.inf)
x2 = p.LpVariable("x2", lowBound=0, upBound=np.inf)
x3 = p.LpVariable("x3", lowBound=0, upBound=np.inf)
# define problem
Lp_prob += 6.95 * x1 + 15.1 * x2 + 12.7 * x3
# define constraints
Lp_prob += x1 * 0.1167 + x2 * .1327 + x3 * 0.1901 >= 1.95
Lp_prob += x1 * 2.4 + x2 * 3.44 + x3 * 3.76 >= 0
Lp_prob += x1 >= x2
Lp_prob += x1 >= 0
Lp_prob += x2 >= 0
Lp_prob += x3 >= 0
# see the problem created
print(Lp_prob)
status = Lp_prob.solve()
PulpSolverError: Pulp: Error while executing C:\Users\FinanceProfessional\.conda\envs\spyder-env\Lib\site-packages\pulp\apis\..\solverdir\cbc\win\64\cbc.exe
使用 scipy
from scipy.optimize import linprog
arr = np.array([[0.1167, 2.40, 6.95], [0.1327, 3.44, 15.1], [0.1901, 3.76, 12.7]])
arr = arr.transpose()
c = arr[-1]
A = [arr[0], arr[1], [1,1,0]]
b = [0.09, 0, 0]
x0_bounds = (0, None)
x1_bounds = (0, None)
x2_bounds = (0, None)
result = linprog(c, A_ub=A, b_ub=b, bounds=[x0_bounds, x1_bounds, x2_bounds], method='revised simplex')
print(result)
con: array([], dtype=float64)
fun: 0.0
message: 'Optimization terminated successfully.'
nit: 0
slack: array([0.09, 0. , 0. ])
status: 0
success: True
x: array([0., 0., 0.])
【问题讨论】:
-
您自己尝试过吗?
-
查看我的完整代码,请在上面编辑。返回错误
-
您可能想看看这是否对您有帮助:coin-or.github.io/pulp/guides/…
-
简而言之:你不能用 scipy 解决这个问题(还),因为这是一个离散优化问题,因为
multiples of 5(一个 MILP)并且没有可用的 MILP 求解器(还)。跨度> -
很多图书馆都可以做到,包括纸浆。 MILP 求解器(甚至 LP 求解器)是最先进/最复杂的开发软件之一(一种流行的软件是大约 100 万行 c++),并且从事这些工作的人数量有限。 Scipy 受到 BSD 许可证的影响,也许还有构建工具,恕我直言,过去不允许添加为数不多的候选人之一。但是由于积极开发了一个新的(MIT-lic)求解器项目,并且 MILP 支持即将到来,情况正在发生变化。而且我敢打赌它比 Excel 提供的要好得多(在这方面有不好的代表)
标签: python optimization scipy pulp