系列文章目录
基础篇:
1.matlab线性规划问题---------基于问题求解函数optimproblem
2. matlab线性规划系列之基础解题
文章目录
目录
1.matlab线性规划问题---------基于问题求解函数optimproblem
前言
这里将展示一些用我之前发过的关于问题求解函数optimproblem的一些解题方法思路,以及对应的代码,在这里声明一下,本篇文章所用的题目来自于哒哒子前辈的如下文章:数学建模【规划模型--线性规划(整数规划、0-1规划)、非线性规划-附:案例分析、奶制品的生产和销售(详细求解过程)】_厚德载物-CSDN博客
欢迎来到苦幽幽,线性规划解千愁系列。
一、上手实际问题
1.1温习(承上)0-1模型的选课制度-多目标:
若是还没有看过我上一篇文章的小伙伴,记得去看看呀,和上一篇的问题是有联系的哟。这次我将在单目标的基础之上增加一个学分最多的目标,也就是咱们需要实现在选课数量尽可能少的前提下,学分也尽可能多这两个目标。 其实很简单,伙伴们多想一下,代码在最下面呀!同时分析将会在下一期出!
2.开辟新类型- 类型2 - 普通线性规划:
2.1牛奶加工售出计划:
这里和上一篇所讲的题一样用三步法。我们求满足约束条件后,获利最大化
2.2.1 分类问题
文字分析:
关于这道题,首先是先将问题分类,毫无疑问,和我们之前所讲的0-1规划不一样,因为没 有体现出选择的关系,也没有体现出数量值为0-1;这时候看题目显然就是一道普通的线性 规划,就是需要规划你怎么去安排这个制作,三点都是线性的函数,哪三点?看下方。
2.2.2 找对应三
那么接下来就找那三个点:
第一:决策变量,其实就是选择A1还是A2,一桶牛奶是用A1做还是A2做。
第二:约束条件,约束条件是题目所给的,一天所产的牛奶桶数小于等于50;A1,A2加 工时间不超过不超过480h;A1至多不超过100公斤
第三:目标函数,目标函数就是要使得获利最大化。
1. 关于决策变量
文字分析:
这里我们很容易知道,能否获利,是看我们做出了几桶牛奶,并且这几桶牛奶是由A 还是B来做的,因为他们所能制造的牛奶的“转化率”是不同的,所以甚至于后期我们还可 以计算出他们的经济效益(也就是性价比的东西,其实就是1/各自的需求量 再除以各自 的单价,不是利润价阿!!,在这里单价没给,是没有办法求的!到最后面的时候会讲 述2021国赛题目,会给例子的!),但显然单纯的求利益最大化是不需要的。
在这里因为要知道我们要规划用多少桶A1和多少桶A2,所以,我分别设置了x1桶牛 奶用A1和x2桶牛奶用A2故设置两行的列向量即可,然后下界设置为0。
代码分析:
x = optimvar('x',2,'LowerBound',0);
2. 关于约束条件
文字分析:
约束条件感觉没啥好讲的,看题设条件就行,这个比较简单,直接看代码吧。
代码分析:
con1 = 3*x(1) <= 100;%A1的小于100
con2 = 12*x(1) + 8*x(2) <= 480;%时间
con3 = x(1)+x(2) <= 50;
pro.Constraints.con1 = con1;
pro.Constraints.con2 = con2;
pro.Constraints.con3 = con3;
3. 关于目标函数
文字分析:
目标函数无非就是运用A1的公斤数乘以每公斤的利润加上A2的即可,这里需要注意的 是,要知道自己设立的变量是桶数还是公斤数,这样所列出来的目标函数也是不一样 的。
代码分析:
pro.Objective = x(1)*24*3 + 16*x(2)*4;%获利最大化
2.2.3 代码示例
pro = optimproblem('ObjectiveSense','max');%使得获利最大化
x = optimvar('x',2,'LowerBound',0);
%x1桶牛奶用A1制作,x2桶牛奶用A2制作
pro.Objective = x(1)*24*3 + 16*x(2)*4;%获利最大化
con1 = 3*x(1) <= 100;%A1的小于100
con2 = 12*x(1) + 8*x(2) <= 480;%时间
con3 = x(1)+x(2) <= 50;
pro.Constraints.con1 = con1;
pro.Constraints.con2 = con2;
pro.Constraints.con3 = con3;
[sol_LL fval_LL] = solve(pro);
sol_LL.x
fval_LL
可以知道答案分别是A1 = 20,A2 =30 ,利润是3360。
三、多目标0-1的代码答案~
clc
clear
tic
%第二个目标
score = [5;4;4;3;4;3;2;2;3];%按照序号所对应的每一科的学分
pro1 = optimproblem('ObjectiveSense','max');
v = optimvar('v',9,'Type','integer','LowerBound',0,'UpperBound',1);%选课的学分
pro1.Objective = score'*v;
con_LL = [];
con_LL = sum(v) <=6;
% for i =1:9
% con_LL = [con_LL;x(i) <= v(i)];
% end
pro1.Constraints.con1=con_LL;
[solz fval_LLz] = solve(pro1);
solz.v
fval_LLz
toc
答案最终是选择第1、2、3、5、6、9门课呀,然后学分是23分~,答案不唯一呀,如果有错误,还请指正~