python 线性规划的基本原理

yhqotfr8  于 2022-10-30  发布在  Python
关注(0)|答案(8)|浏览(184)

我需要建立一个线性规划模型。下面是我使用的不等式(举例):

6x + 4y <= 24
x + 2y <= 6
-x + y <= 1
y <= 2

我需要找到由这些不等式描述的区域,并在图形中对其进行着色,同时跟踪该区域边界线的顶点,并以不同的颜色绘制边界线。请参见下面的图形,以了解我正在寻找的示例。



我使用的是Python 3.2、numpy和matplotlib,Python中有没有更好的线性编程模块?

mwg9r5ms

mwg9r5ms1#

**更新:**在过去4年中,答案已经有些过时了,这里是一个更新。您有很多选择:

  • 如果你不 * 必须 * 使用Python,那么用建模语言做这件事要容易得多,请参见Any good tools to solve integer programs on linux?
  • 我个人最近通过Python API使用**Gurobi**,它是一个商业的、封闭源码的产品,但对学术研究是免费的。
  • 使用**PuLP**,您可以创建MPSLP files,然后使用GLPK、COIN CLP/CBC、CPLEX或XPRESS通过它们的命令行界面来求解它们。这种方法有其优点和缺点。
    ***OR-Tools from Google**是一款开源的优化软件套件,专为解决世界上最棘手的车辆配送、流量、整数和线性规划以及约束规划问题而优化。
    ***Pyomo**是一种基于Python的开源优化建模语言,具有多种优化功能。
  • SciPy提供线性编程:scipy.optimize.linprog.(我从未尝试过此方法。)
  • 显然,**CVXOPT**提供了一个Python接口给GLPK,我不知道这一点。我已经使用GLPK 8年了,我可以强烈推荐GLPK。examples and tutorial of CVXOPT看起来真的很不错!
  • 您可以在维基百科的**GLPK/Python下找到其他可能的方法。**请注意,其中许多方法不一定局限于GLPK。
46qrfjad

46qrfjad2#

我推荐用Python来解决凸优化问题的包cvxopt,cvxopt的文档here中有一个简短的线性规划Python代码示例。

mnowg1ta

mnowg1ta3#

其他的答案在提供求解器列表方面做得很好。然而,只有PuLP被提到作为一个Python库来公式化LP模型。
另一个很棒的选项是Pyomo。和PuLP一样,你可以把问题发送到任何求解器,然后把解读回Python。你还可以操纵求解器参数。我和一个同学在2015年比较了PuLP和Pyomo的性能,我们发现Pyomo为同样的问题生成.LP文件的速度比PuLP快好几倍。

r3i60tvu

r3i60tvu4#

只有在家庭作业问题时才用图来解决线性规划问题,其他情况下,线性规划问题都是通过矩阵线性代数来解决的。
至于Python,虽然有一些纯Python库,但大多数人使用带有Python绑定的原生库。有很多免费和商业的线性编程库。要获得详细列表,请参阅维基百科中的线性编程或今日OR/MS中的Linear Programming Software Survey
免责声明:我目前为Gurobi Optimization工作,以前为ILOG工作,该公司提供了CPLEX。

qcbq4gxm

qcbq4gxm5#

为了解决线性规划问题,你可以使用Scipy中的scipy.optimize.linprog模块,它使用单纯形算法。

dtcbnfnu

dtcbnfnu6#

我建议使用PuLP python包。它有一个很好的界面,你可以使用不同类型的算法来解决LP。

qpgpyjmq

qpgpyjmq7#

lpsolve对我来说是最简单的。不需要安装单独的求解器。它在软件包中附带。

g9icjywg

g9icjywg8#

下面是问题的图形表示,灵感来自How to visualize feasible region for linear programming (with arbitrary inequalities) in Numpy/MatplotLib?

import numpy as np
import matplotlib.pyplot as plt

m = np.linspace(0,5,200)
x,y = np.meshgrid(m,m)
plt.imshow(((6*x+4*y<=24)&(x+2*y<=6)&(-x+y<=1)&(y<=2)&(x>=0)&(y>=0)).astype(int), 
    extent=(x.min(),x.max(),y.min(),y.max()),origin='lower',cmap='Greys',alpha=0.3);

# plot constraints

x = np.linspace(0, 5, 2000)

# 6*x+4*y<=24

y0 = 6-1.5*x

# x+2*y<=6

y1 = 3-0.5*x

# -x+y<=1

y2 = 1+x

# y <= 2

y3 = (x*0) + 2

# x >= 0

y4 = x*0
plt.plot(x, y0, label=r'$6x+4y\leq24$')
plt.plot(x, y1, label=r'$x+2y\leq6$')
plt.plot(x, y2, label=r'$-x+y\leq1$')
plt.plot(x, 2*np.ones_like(x), label=r'$y\leq2$')
plt.plot(x, y4, label=r'$x\geq0$')
plt.plot([0,0],[0,3], label=r'$y\geq0$')
xv = [0,0,1,2,3,4,0]; yv = [0,1,2,2,1.5,0,0]
plt.plot(xv,yv,'ko--',markersize=7,linewidth=2)
for i in range(len(xv)):
    plt.text(xv[i]+0.1,yv[i]+0.1,f'({xv[i]},{yv[i]})')
plt.xlim(0,5); plt.ylim(0,3); plt.grid(); plt.tight_layout()
plt.legend(loc=1); plt.xlabel('x'); plt.ylabel('y')
plt.show()

这个问题缺少目标函数,因此任何阴影点都满足不等式。如果它确实有目标函数(例如Maximize x+y),那么许多有能力的Python求解器都可以处理这个问题。下面是一个GEKKO中的线性规划示例,它也支持混合整数、非线性和微分约束。

from gekko import GEKKO
m = GEKKO(remote=False)
x,y = m.Array(m.Var,2,lb=0)
m.Equations([6*x+4*y<=24,x+2*y<=6,-x+y<=1,y<=2])
m.Maximize(x+y)
m.solve(disp=False)

大规模LP问题以矩阵形式或稀疏矩阵形式求解,稀疏矩阵只存储矩阵的非零值。有一个tutorial on LP solutions,里面有我为大学课程开发的几个例子。

相关问题