【问题标题】:scipy linear programming - formulation of problemscipy线性规划 - 问题的制定
【发布时间】: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


【解决方案1】:
from scipy.optimize import minimize

a1, a2, a3 = 1167,1327,1907
b1,b2,b3 = 24000, 34400, 36000
c1,c2,c3 = 69500,15100,12700

x = [10000,10000,10000] 
res = minimize(
    lambda x: c1*x[0]+c2*x[1]+c3*x[2], #what we want to minimize
    x, 
    constraints = (
        {'type':'eq','fun': lambda x: x[0]*a1-x[1]*a2}, #1st subject
        {'type':'ineq','fun': lambda x: a1*x[0]+a2*x[1]+a3*x[2]-7}, #2st subject
        {'type':'ineq','fun': lambda x: b1*x[0]+b2*x[1]+b3*x[2]-0}, #3st subject
        {'type':'eq','fun': lambda x: x[0]%5+x[1]%5+x[2]%5-0}, # x1 x2 x3 are multiple of 5

                  ),
    bounds = ((0,None),(0,None),(0,None)),
    method='SLSQP',options={'disp': True,'maxiter' : 10000})

print(res)

这里是输出:

> Optimization terminated successfully    (Exit mode 0)
>             Current function value: 381000000.00006175
>             Iterations: 2
>             Function evaluations: 9
>             Gradient evaluations: 2
>      fun: 381000000.00006175
>      jac: array([69500., 15100., 12700.])  message: 'Optimization terminated successfully'
>     nfev: 9
>      nit: 2
>     njev: 2   status: 0  success: True
>        x: array([    0.,     0., 30000.])

我必须将所有值乘以 10000 以避免模式 8,如 here 所解释的那样

我希望这是您所需要的。不过你应该试试 Or-Tools,一个比 scipy 更强大、更简单的 CP 库。

编辑:回复评论

here 是一个谷歌合作的链接,因为原始发布者无法在他身边运行此代码。

【讨论】:

  • 这忽略了许多求解器的假设:两倍的可微性和可能的​​凸性(如果您对全局最优感兴趣)。最初的问题是离散优化问题,将其扔给连续 NLP 求解器是行不通的。
  • 感谢您的努力。但是,我会尝试寻找替代解决方案。实际上,我有数百行和多列作为约束。以建议的方式定义约束会使它复杂化,超出我可以控制代码的程度。我尽量避免太复杂的东西。再次感谢您的贡献。
  • 我确实尝试了你的代码,但它似乎不成功,也许是我的一些错误。此外,我不认为产生的结果是预期的,excel 以比使用此代码产生的结果低得多的数量和成本解决了它。还是谢谢你。
  • @lot 感谢您对 Or-Tools 的建议 - 这对我来说太好用了!希望它能让我得到想要的结果,就在最后一站调试结果中的一些逻辑错误。使用起来也非常简单!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多