我需要为线性编程问题实现一个求解器。所有限制都是<=限制,例如
5x + 10y <= 10
这些限制可以有任意数量。而且,x> = 0 y> = 0隐式地存在。
我需要找到最佳解(max)并在matplotlib中显示可行区域。我已经通过实现单纯形法找到了最佳解决方案,但我不知道如何绘制图形。
一些我发现的方法:
答案 0 :(得分:2)
一种更简单的方法可能是让matplotlib自己计算可行区域(仅提供约束),然后在顶部简单地覆盖“约束”行。
# plot the feasible region
d = np.linspace(-2,16,300)
x,y = np.meshgrid(d,d)
plt.imshow( ((y>=2) & (2*y<=25-x) & (4*y>=2*x-8) & (y<=2*x-5)).astype(int) ,
extent=(x.min(),x.max(),y.min(),y.max()),origin="lower", cmap="Greys", alpha = 0.3);
# plot the lines defining the constraints
x = np.linspace(0, 16, 2000)
# y >= 2
y1 = (x*0) + 2
# 2y <= 25 - x
y2 = (25-x)/2.0
# 4y >= 2x - 8
y3 = (2*x-8)/4.0
# y <= 2x - 5
y4 = 2 * x -5
# Make plot
plt.plot(x, 2*np.ones_like(y1))
plt.plot(x, y2, label=r'$2y\leq25-x$')
plt.plot(x, y3, label=r'$4y\geq 2x - 8$')
plt.plot(x, y4, label=r'$y\leq 2x-5$')
plt.xlim(0,16)
plt.ylim(0,11)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.xlabel(r'$x$')
plt.ylabel(r'$y$')
答案 1 :(得分:2)
这是一个顶点枚举问题。您可以使用函数 lineqs 将不等式系统 A x >= b 可视化为任意数量的线。该函数还将显示绘制图形的顶点。
最后两行表示 x,y >=0
from intvalpy import lineqs
import numpy as np
A = -np.array([[5, 10],
[-1, 0],
[0, -1]])
b = -np.array([10, 0, 0])
lineqs(A, b, title='Solution', color='gray', alpha=0.5, s=10, size=(15,15), save=False, show=True)