关于线性规划问题,首先要建立数学模型以及线性规划模型。
有基于求解器求解和基于问题求解两种方法。
将线性规划问题转换为MATLAB标准型:(linprog函数是求取最小值,且约束条件要为小于)
基于求解器求解
线性规划的标准形式
其中f,x,b,beq,lb,ub为列向量,f称为价值向量,b为资源向量,A、Aeq为不等式约束和等式约束对应的矩阵。听起来很难,但是结合例题之后会很好理解。
例1.3的标准型中,s.t.约束,第一行为不等式,第二行为等式,第三行为取值范围,可得:
f = [-2,-3,5];
A = [-2,5,-1;1,3,1];b = [-10;12];
Aeq = [1,1,1];beq = 7;
lb = zeros(3,1); % 只有下界
linprog函数
函数调用格式:
[x,fval] = linprog(f,A,b)
[x,fval] = linprog(f,A,b,Aeq,beq)
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
其中x返回的是决策向量的取值,fval返回的是目标函数的最优值,f为价值向量,A、b对应的是线性不等式约束,Aeq、beq对应的是线性等式约束,lb、ub分别对应的是决策向量的下界向量和上界向量。
根据题目,我们选择第三种调用格式即可。
MATLAB程序:
clc,clear
f = [-2,-3,5];
A = [-2,5,-1;1,3,1];b = [-10;12];
Aeq = [1,1,1];beq = 7;
lb = zeros(3,1);
[x,fval] = linprog(f,A,b,Aeq,beq,lb);
x,fval = -fval % 目标函数最大化
基于问题求解
首先需要用变量和表达式构造优化问题,然后用solve函数求解。
MATLAB程序:
clc,clear
prob = optimproblem('ObjectiveSense','max');% 目标函数最大化的优化问题
% 这里ObjectSense 表示目标类型为求最大值的意思
% 如果直接写prob=optimproblem 默认求最小值
x = optimvar('x',3,'LowerBound',0);% 决策变量
% 'x' 为变量名 ,3表示有三个变量
% 'LowerBound'表示下界,即下界为0,此处省略上界'UpperBound'
prob.Objective = 2*x(1) + 3*x(2) - 5*x(3); % 目标函数
prob.Constraints.con1 = x(1) + x(2) + x(3) == 7;% 约束条件
prob.Constraints.con2 = 2*x(1) - 5*x(2) + x(3) >= 10;
prob.Constraints.con3 = x(1) + 3*x(2) + x(3) <=12;
[sol,fval,flag,out] = solve(prob)% fval返回最优值
sol.x % 显示决策变量的值
在MATLAB基于问题的求解方法中,不能把不同类型的约束条件写在同一个约束集合中。
当然还可以将约束范围写成向量的形式:
clc,clear
prob = optimproblem('ObjectiveSense','max');
x = optimvar('x',3,'LowerBound',0);
f = [2,3,-5];
A = [-2,5,-1;1,3,1];b = [-10;12];
Aeq = [1,1,1];beq = 7;
lb = zeros(3,1);
prob.Objective = f*x;
prob.Constraints.con1 = Aeq*x == beq;
prob.Constraints.con2 = A*x <= b;
[sol,fval,flag,out] = solve(prob)
sol.x