如何可视化优化问题的可行域?

数据挖掘 可视化 优化 图形模型 线性模型
2022-03-01 23:33:39

当给定一组线性方程(等式和不等式)时,是否有任何工具可以可视化可行区域。如果没有,任何人都可以提出一种可视化的方法吗?如果我要自己使用 Python 来做,我应该使用哪些库。我找到了 sympy,但我不能让它画出不等式,也不能只画出交叉点。

我也找到了 wolfram,但我只能看到预先构建的可视化,而无法可视化我自己的系统。

我可以使用 Gurobi 本身以图形方式向我展示它在做什么吗?

我知道这是一个非常基本的问题,但我是这方面的初学者,所以请放轻松

2个回答

对于 Wolfram 语言,您可以使用ImplicitRegionContourPlotRegionPlot.

为一个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编辑用于在将表达式传递给之前解析表达式只需要因为转换不等式并动态确定边界。ApplyEqualEvaluateContourPlot

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}}}

ListPlotCallout标签。

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 调整我的环境。

参考:

python Tool/Editor中的线性规划介绍,用于可视化优化问题文件和解决方案