我需要建立一个线性规划模型。下面是我使用的不等式(举例):
6x + 4y <= 24 x + 2y <= 6 -x + y <= 1 y <= 2
我需要找到由这些不等式描述的区域,并在图形中对其进行着色,同时跟踪该区域边界线的顶点,并以不同的颜色绘制边界线。请参见下面的图形,以了解我正在寻找的示例。
。我使用的是Python 3.2、numpy和matplotlib,Python中有没有更好的线性编程模块?
mwg9r5ms1#
**更新:**在过去4年中,答案已经有些过时了,这里是一个更新。您有很多选择:
46qrfjad2#
我推荐用Python来解决凸优化问题的包cvxopt,cvxopt的文档here中有一个简短的线性规划Python代码示例。
mnowg1ta3#
其他的答案在提供求解器列表方面做得很好。然而,只有PuLP被提到作为一个Python库来公式化LP模型。另一个很棒的选项是Pyomo。和PuLP一样,你可以把问题发送到任何求解器,然后把解读回Python。你还可以操纵求解器参数。我和一个同学在2015年比较了PuLP和Pyomo的性能,我们发现Pyomo为同样的问题生成.LP文件的速度比PuLP快好几倍。
r3i60tvu4#
只有在家庭作业问题时才用图来解决线性规划问题,其他情况下,线性规划问题都是通过矩阵线性代数来解决的。至于Python,虽然有一些纯Python库,但大多数人使用带有Python绑定的原生库。有很多免费和商业的线性编程库。要获得详细列表,请参阅维基百科中的线性编程或今日OR/MS中的Linear Programming Software Survey。免责声明:我目前为Gurobi Optimization工作,以前为ILOG工作,该公司提供了CPLEX。
qcbq4gxm5#
为了解决线性规划问题,你可以使用Scipy中的scipy.optimize.linprog模块,它使用单纯形算法。
dtcbnfnu6#
我建议使用PuLP python包。它有一个很好的界面,你可以使用不同类型的算法来解决LP。
qpgpyjmq7#
lpsolve对我来说是最简单的。不需要安装单独的求解器。它在软件包中附带。
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中的线性规划示例,它也支持混合整数、非线性和微分约束。
Maximize x+y
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,里面有我为大学课程开发的几个例子。
8条答案
按热度按时间mwg9r5ms1#
**更新:**在过去4年中,答案已经有些过时了,这里是一个更新。您有很多选择:
***OR-Tools from Google**是一款开源的优化软件套件,专为解决世界上最棘手的车辆配送、流量、整数和线性规划以及约束规划问题而优化。
***Pyomo**是一种基于Python的开源优化建模语言,具有多种优化功能。
46qrfjad2#
我推荐用Python来解决凸优化问题的包cvxopt,cvxopt的文档here中有一个简短的线性规划Python代码示例。
mnowg1ta3#
其他的答案在提供求解器列表方面做得很好。然而,只有PuLP被提到作为一个Python库来公式化LP模型。
另一个很棒的选项是Pyomo。和PuLP一样,你可以把问题发送到任何求解器,然后把解读回Python。你还可以操纵求解器参数。我和一个同学在2015年比较了PuLP和Pyomo的性能,我们发现Pyomo为同样的问题生成.LP文件的速度比PuLP快好几倍。
r3i60tvu4#
只有在家庭作业问题时才用图来解决线性规划问题,其他情况下,线性规划问题都是通过矩阵线性代数来解决的。
至于Python,虽然有一些纯Python库,但大多数人使用带有Python绑定的原生库。有很多免费和商业的线性编程库。要获得详细列表,请参阅维基百科中的线性编程或今日OR/MS中的Linear Programming Software Survey。
免责声明:我目前为Gurobi Optimization工作,以前为ILOG工作,该公司提供了CPLEX。
qcbq4gxm5#
为了解决线性规划问题,你可以使用Scipy中的scipy.optimize.linprog模块,它使用单纯形算法。
dtcbnfnu6#
我建议使用PuLP python包。它有一个很好的界面,你可以使用不同类型的算法来解决LP。
qpgpyjmq7#
lpsolve对我来说是最简单的。不需要安装单独的求解器。它在软件包中附带。
g9icjywg8#
下面是问题的图形表示,灵感来自How to visualize feasible region for linear programming (with arbitrary inequalities) in Numpy/MatplotLib?
这个问题缺少目标函数,因此任何阴影点都满足不等式。如果它确实有目标函数(例如
Maximize x+y
),那么许多有能力的Python求解器都可以处理这个问题。下面是一个GEKKO中的线性规划示例,它也支持混合整数、非线性和微分约束。大规模LP问题以矩阵形式或稀疏矩阵形式求解,稀疏矩阵只存储矩阵的非零值。有一个tutorial on LP solutions,里面有我为大学课程开发的几个例子。