系列文章目录
基础篇:
1.matlab线性规划问题---------基于问题求解函数optimproblem
前言
这里将展示一些用我之前发过的关于问题求解函数optimproblem的一些解题方法思路,以及对应的代码,在这里声明一下,本篇文章所用的题目来自于哒哒子前辈的如下文章:数学建模【规划模型--线性规划(整数规划、0-1规划)、非线性规划-附:案例分析、奶制品的生产和销售(详细求解过程)】_厚德载物-CSDN博客
欢迎来到-苦幽幽,线性规划解千愁系列。
一、线性规划是什么?
线性规划的内容其实分为很多我自己用思维导图零零散散的整理了一些(还没整理完,之后会慢慢补充),思维导图如下所示(在之后的文章会随着作者不断地学习纠错来更新),如果有误,欢迎读者指正
二、上手实际问题
类型一:0-1模型的选课制度:
线性规划问题就是抓住三个点即目标函数、约束条件以及决策变量。
2.1 分类问题
文字分析:
关于这道题,首先是先将问题分类,毫无疑问,我们的选课要么选要么不选,所以不选是0,选就是1,是标准的0-1规划问题;
代码分析:
0-1规划,也就是说,我们用optimproblem函数中的设置变量x需要设置范围,下限为0 ,上限是1,并且由于只有0、1两个值,所以我们还需要给它调整一下类型,也就是整型integer,同时因为有九门课,所以x是一个9行1列的列向量即x1、x2...x9,到这里,未知数的设定都了解了。代码如下所示。
x = optimvar('x',9,'Type','integer','LowerBound',0,'UpperBound',1);
2.2 找对应三点
文字分析:
那么接下来就找那三个点:
第一:决策变量,其实就是各个选修课程,九个不同的未知数代表气课程是否选;
第二:约束条件,约束条件是题目所给的最少两门数学课,三门统计学以及两门计算机课,在此条件下还需满足如:如果选择最优化方法的话,就需要先选择微积分和线性代数等前提条件;
第三:目标函数,目标函数就是要选修课程尽可能少。
代码分析:
1. 关于决策变量在上一个部分说过了,这里不再继续重复
2. 关于约束条件,约束条件不想看文字可看图,在下方!
前面的最少两门数学课,三门统计学什么的很简单,就是把其中蕴含数学课的课程变量加起来不多于二,统计学的不多于三即可;后面的先选什么才能选什么,可能会要想一下,其实转换一下,就是还是以最优化方法x3为例的话,就是首先要选择微积分x1和线性代数x2,也就是说要x1>0和x2>0作为前提才行,但是你想,x的取值范围全是0-1,所以当x1和x2都选中的时候,它们的取值都为1,加起来就是2,那也就是说需要x1+x2=2的时候我才能选择是否选择x3,那如果用2*x3 - x1 -x2<=0,这样就刚好能满足了,因为刚好,我x3选择了的话就是取值为1,如果x1与x2都没有选择到的话,就都是0,那x3肯定也是0才能满足那个条件,而当x1和x2都选择的话,刚好是2,而如果选择了x3的话,前面则是2,相减也满足条件,所以是刚好的,其他的情况读者可以自行思考一下,也是大概的思路。所对应的约束条件图、思路图以及代码如下所示:
con1 = 2*x(3) - x(1) - x(2) <= 0;
con2 = x(4) - x(7) <= 0;
con3 = 2*x(5) - x(1) - x(2)<=0;
con4 = x(6) - x(7) <= 0;
con5 = x(8) - x(5) <= 0;
con6 = 2*x(9) - x(1) - x(2)<=0;
con7 = sum(x(1:5))>=2;
con8 = x(3)+x(5)+x(6)+x(8)+x(9)>=3;
con9 = x(4)+x(6)+x(7)+x(9)>=2;
cons = [con1;con2;con3;con4;con5;con6];
cons2 = [con7;con8;con9];
pro.Constraints.con1=cons;
pro.Constraints.con2=cons2;
2.3 代码示例
clc
clear
tic
pro = optimproblem('ObjectiveSense','min');
x = optimvar('x',9,'Type','integer','LowerBound',0,'UpperBound',1);
pro.Objective = sum(x);
con1 = 2*x(3) - x(1) - x(2) <= 0;
con2 = x(4) - x(7) <= 0;
con3 = 2*x(5) - x(1) - x(2)<=0;
con4 = x(6) - x(7) <= 0;
con5 = x(8) - x(5) <= 0;
con6 = 2*x(9) - x(1) - x(2)<=0;
con7 = sum(x(1:5))>=2;
con8 = x(3)+x(5)+x(6)+x(8)+x(9)>=3;
con9 = x(4)+x(6)+x(7)+x(9)>=2;
cons = [con1;con2;con3;con4;con5;con6];
cons2 = [con7;con8;con9];
pro.Constraints.con1=cons;
pro.Constraints.con2=cons2;
[sol fval_LL] = solve(pro);
sol.x
fval_LL
toc
最终所需要选择的课程为6门,分别为x1 = x2 = x3 = x5 = x6 = x7 =1。