要想学好运筹学,除了要熟练掌握相关的知识点以外,还要具备解决问题的能力,即要用什么样的方法借助什么样的工具对运筹学问题进行求解。基于此,本期小编将带领大家走进运筹学算法的学习之旅。
根据运筹学教程对运筹学的分支划分、以及结合教程介绍的内容板块,我们绘制了《运筹学算法图》,共包括13大部分。
与上期介绍的知识点同步,本期算法介绍主要是对图解法进行详细讲解,包括涉及到的基本概念、适用范围、操作步骤以及重点介绍如何使用相关的软件平台实现算法。
1、基本概念
在正式介绍本期内容之前,小编先带大家了解一下图解法中涉及到的一些相关概念。
(1)可行解:满足线性规划问题约束条件的一组决策变量值。
(2)可行解集:满足约束条件的全部可行解的集合。
(3)可行域:平面上所有可行解的点的集合。
(4)最优解:可行解集中使目标函数达到最优值的可行解。
2、适用范围
由于三维作图的困难性,图解法只适用于求解只包含两个决策变量的线性规划问题。
3、操作步骤
求解思路:先将约束条件加以图解,求得满足约束条件的解的集合(即可行域),然后找出最优解,具体的求解步骤如下图所示。
4、平台实现
由于线性规划图解问题普遍借助Matlab平台进行求解,因此,接下来小编为大家详细介绍如何使用Matlab求解线性规划问题。以上一期推文中图解法的例题为例,借助R2018b版本的Matlab软件编辑代码。其中绿色字体为代码注释,此外,小编还在代码中插入了实时图片以方便读者理解代码的含义。需要注意的是在Matlab中标点符号一定要在英文状态下输入。
步骤一:
L1=[5,0;0,2.5]
% x1+2x2=5与x1轴、x2轴的交点坐标
plot(L1(:,1),L1(:,2),'k');
% 根据(5,0)、(0,2.5)两点画出直线
hold on
% 保持当前轴及图像不被刷新
text(3,1.2,'x_1+2x_2=5','color','k');
% 在(3,1.2)的位置显示x1+2x2=5的表达式
图示结果
步骤二
% 同理做出直线2x1+x2=4(红色)
L2=[2,0;0,4]
plot(L2(:,1),L2(:,2),'r');
hold on
text(0.7,3,'2x_1+x_2=4','color','r');
%同理做出直线4x1+3x2=9(蓝色)
L3=[2.25,0;0,3]
plot(L3(:,1),L3(:,2),'b');
hold on
text(0.6,1,'4x_1+3x_2=9','color','b');
图示结果
步骤三
% 标出可行域,并用紫色填充
x = [0 0 0.6 1.5 2]';
y = [0 2.5 2.2 1 0]';
fill(x, y, 'o');
% 将横轴和纵轴分别命名为x1和x2
xlabel('x_1')
ylabel('x_2')
% 将作图区域定义为(0,0)至(5.3,4)的矩形框内
axis([0 5.3 0 4])
图示结果
步骤四
% 根据可行域顶点及目标函数斜率做第一条渐近线z0
z0=[0,2.5;5/3,0];
%用黑色的短虚线画出z0,同时线的粗细规定为2
plot(z0(:,1),z0(:,2),'k- -','LineWidth',2);
图示结果
步骤五
% 同样的道理画出z1渐近线
z1=[0.2,2.8;6.2/3,0];
plot(z1(:,1),z1(:,2), 'k- -','LineWidth',2);
图示结果
步骤六
% 观察图形,可以发现包含最优解的直线的位置,即z2
z2=[0.5,5.3/2;6.5/3,0];
% 用绿色的短虚线画出z2,同时线的粗细仍规定为2
plot(z2(:,1),z2(:,2),'g- -','LineWidth',2);
% 用字号为20、颜色为红色的字母A标出最优解的位置
text(1.5,1,'A','color','r','fontsize',20);
图示结果
5、注意事项
使用Matlab求解线性规划图解问题时需注意以下几点:
(1)若函数的约束原型就是等式,则其代表的区域仅为一条直线,而且问题的整个可行域(若存在)也必然在此直线上。
(2)在画目标函数等值线时,需要考虑可行域顶点以及目标函数的斜率问题,等值线不需要画太多,利用好关键顶点,表达出移动方向即可。
(3)在找出最优点后,观察Matlab画出的图形,将鼠标放置最优点即可得到相应的坐标值。
作者|陈怡敏、曹贵玲
责编|何洋洋
审核|徐小峰