当给定一组线性方程(等式和不等式)时,是否有任何工具可以可视化可行区域。如果没有,任何人都可以提出一种可视化的方法吗?如果我要自己使用 Python 来做,我应该使用哪些库。我找到了 sympy,但我不能让它画出不等式,也不能只画出交叉点。
我也找到了 wolfram,但我只能看到预先构建的可视化,而无法可视化我自己的系统。
我可以使用 Gurobi 本身以图形方式向我展示它在做什么吗?
我知道这是一个非常基本的问题,但我是这方面的初学者,所以请放轻松
当给定一组线性方程(等式和不等式)时,是否有任何工具可以可视化可行区域。如果没有,任何人都可以提出一种可视化的方法吗?如果我要自己使用 Python 来做,我应该使用哪些库。我找到了 sympy,但我不能让它画出不等式,也不能只画出交叉点。
我也找到了 wolfram,但我只能看到预先构建的可视化,而无法可视化我自己的系统。
我可以使用 Gurobi 本身以图形方式向我展示它在做什么吗?
我知道这是一个非常基本的问题,但我是这方面的初学者,所以请放轻松
对于 Wolfram 语言,您可以使用ImplicitRegion
、ContourPlot
和RegionPlot
.
为一个system
system =
{
y >= 2
, 2 y <= 25 - x
, 4 y >= 2 x - 8
, y <= 2 x - 5
};
ImplicitRegion
和它的(RegionBounds
用于绘图)可以通过
fregion = ImplicitRegion[system, {x, y}];
rbounds = RegionBounds@fregion;
plotbounds = Transpose[{.9, 1.1} Transpose@rbounds];
fregion
如果您需要有关可行区域的其他信息,可以将其与所有区域属性和度量一起使用。
的不等式system
可以通过ing来ContourPlot
编辑。用于在将表达式传递给之前解析表达式;只需要因为转换不等式并动态确定边界。Apply
Equal
Evaluate
ContourPlot
frplot =
Show[
ContourPlot[
Evaluate[Equal @@@ system]
, Evaluate[Sequence @@ MapThread[Prepend, {plotbounds, {x, y}}]]
, PlotLegends -> system
, AspectRatio -> Automatic
]
, RegionPlot[fregion, BoundaryStyle -> None]
]
我们可以检查几个反对函数解决方案。
objectives = {x y, x - 2 y};
sols = Maximize[{#, system}, {x, y}] & /@ objectives
{{625/8, {x->25/2, y->25/4}}, {4, {x->8, y->2}}}
splot =
ListPlot[
MapIndexed[
Callout[{x, y} /. Last@#, "Max" <> ToString@objectives[[#2]]] &,
sols]
]
然后Show
情节在一起。
Show[frplot, splot]
希望这可以帮助。
您可以使用 python matplotlib 和 numpy 库绘制可行区域。
import numpy as np
import matplotlib.pyplot as plt
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);
x = np.linspace(0, 16, 2000)
# y >= 2
y1 = (x*0) + 0
# 2y <= 25 - x
y2 = (25-x)/2.0
# 4y >= 2x - 8
y3 = (2*x-8)/4.0
# y <= 2x - 5
y4 = 2 * x -5
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$')
输出:
您也可以查看运筹学堆栈交换上的这篇文章,了解如何可视化优化问题。他们使用 Lingo、GCG、MIPLIB、strIPlib 你可以选择。我使用 python 是因为我可以为 Pyomo 调整我的环境。
参考: