数学建模:Yalmip求解线性与非线性优化问题

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

线性优化

使用 Yalmip 求解线性规划最优值:

m i n { − x 1 − 2 x 2 + 3 x 3 } x 1 + x 2 ⩾ 3 x 2 + x 3 ⩾ 3 x 1 + x 3 = 4 0 ≤ x 1 , x 2 , x 3 ≤ 2 \begin{gathered}min\{-x_1-2x_2+3x_3\} \\x_1+x_2\geqslant3 \\x_2+x_3\geqslant3 \\x_1+x_3=4 \\0\leq x_1,x_2,x_3\leq2 \end{gathered} min{−x1−2x2+3x3}x1+x2⩾3x2+x3⩾3x1+x3=40≤x1,x2,x3≤2

  • 使用 sdpvar 来构建实数解 ,如果要求解整数类型,则使用 intvar;如果是01类型,使用binvar
  • 构建目标函数
  • 构建约定与LB,UB上下限,其中 ≥ ≤ == 等约束直接照抄即可
  • optimize求解最优值
  • 打印结果...
matlab 复制代码
clc;clear;
%
p = sdpvar(3,1);
%% 构建目标函数
Objective = -p(1)-2*p(2)+3*p(3);
%% 构建约束
Constraints = [0<=p<=2,(p(1)+p(2)>=3),(p(2)+p(3)>=3),(p(1)+p(3)==4)];
%% 求解最优值
optimize(Constraints,Objective);
%%
% 三个变量的解
P=double(p);
% 目标优化值
Obj=double(Objective);
objstr=['目标函数最优值:',num2str(Obj)];
disp(objstr)
for i=1:length(P)
    xstr=['x',num2str(i),'的值为:',num2str(P(i))];
    disp(xstr)
end

整数规划

在 optimize 函数中添加如下参数来实现 01整数规划

  • options = sdpsettings('solver', 'bnb', 'bnb.solver', 'fmincon');
  • options = sdpsettings('solver','bmibnb', 'bmibnb.uppersolver', 'fmincon'); 全局最优,但是速度慢

案例(1)

matlab 复制代码
clc;clear;

p = binvar(6,4); % 01整数规划
%%
c = [4,2,3,4;
    6,4,5,5;
    7,6,7,6;
    7,8,8,6;
    7,9,8,6;
    7,10,8,6;
];
%%
f = -sum(sum(p.*c));
%% 构建约束:注意二维矩阵的构建方法
cons = [];
for j = 1:size(c,2)
    cons = [cons,(sum(p(:,j))>=1)];
end
%%
for i = 1:size(c,1)
    cons = [cons,(sum(p(i,:))==1)];
end
%% 整数规划
% options = sdpsettings('solver', 'bnb', 'bnb.solver', 'fmincon');
options = sdpsettings('solver','bmibnb', 'bmibnb.uppersolver', 'fmincon');
%%
optimize(cons,f,options);

%%
% 三个变量的解
P=double(p);
% 目标优化值
Obj=double(-f);
objstr=['目标函数最优值:',num2str(Obj)];
disp(objstr)
disp(P);

案例(2)

matlab 复制代码
clc;clear;

p = intvar(7,1);
%%
f = sum(p);
%%
% 必须写上限制范围
cons = [0<=p,(p(1)+2*p(2)+p(7)>=100),(3*p(3)+2*p(4)+p(5)+p(7)>=100),(4*p(1)+p(2)+2*p(4)+4*p(5)+6*p(6)+p(7)>=100)];
%% 整数规划
% options = sdpsettings('solver', 'bnb', 'bnb.solver', 'fmincon');
% options = sdpsettings('solver','bmibnb', 'bmibnb.uppersolver', 'fmincon');
%%
optimize(cons,f);

%%
% 三个变量的解
P=double(p);
% 目标优化值
Obj=double(f);
objstr=['目标函数最优值:',num2str(Obj)];
disp(objstr)
for i=1:length(P)
    xstr=['x',num2str(i),'的值为:',num2str(P(i))];
    disp(xstr)
end

案例(3)


matlab 复制代码
clc;clear;

p = binvar(5,8);
%%
c = [ 30 25 18 32 27 19 22 26;
    29 31 19 18 21 20 30 19;
    28 29 30 19 19 22 23 26;
    29 30 19 24 25 19 18 21;
    21 20 18 17 16 14 16 18];

%% 
f = sum(sum(c.*p));

%%
constraints = [];
for j = 1:size(c,2)
    constraints = [constraints,(sum(p(:,j))<=1)];
end

for i = 1:size(c,1)
    constraints = [constraints,(sum(p(i,:))==1)];
end
%%
options = sdpsettings('solver','bmibnb', 'bmibnb.uppersolver', 'fmincon');

%% 
optimize(constraints,f,options);

%%
% 三个变量的解
P=double(p);
% 目标优化值
Obj=double(f);
objstr=['目标函数最优值:',num2str(Obj)];
disp(objstr)
disp(P);

非线性规划

max ⁡ f ( x ) = 2 x 1 + 3 x 1 2 + 3 x 2 + x 2 2 + x 3 , s. t. { x 1 + 2 x 1 2 + x 2 + 2 x 2 2 + x 3 ⩽ 10 , x 1 + x 1 2 + x 2 + x 2 2 − x 3 ⩽ 50 , 2 x 1 + x 1 2 + 2 x 2 + x 3 ⩽ 40 , x 1 2 + x 3 = 2 , x 1 + 2 x 2 ⩾ 1 , x 1 ⩾ 0 , x 2 , x 3 不约束 . \max f(x)=2x_1+3x_1^2+3x_2+x_2^2+x_3,\\\text{s. t.}\quad\begin{cases}x_1+2x_1^2+x_2+2x_2^2+x_3\leqslant10,\\x_1+x_1^2+x_2+x_2^2-x_3\leqslant50,\\2x_1+x_1^2+2x_2+x_3\leqslant40,\\x_1^2+x_3=2,\\x_1+2x_2\geqslant1,\\x_1\geqslant0,x_2,x_3\text{ 不约束}.\end{cases} maxf(x)=2x1+3x12+3x2+x22+x3,s. t.⎩ ⎨ ⎧x1+2x12+x2+2x22+x3⩽10,x1+x12+x2+x22−x3⩽50,2x1+x12+2x2+x3⩽40,x12+x3=2,x1+2x2⩾1,x1⩾0,x2,x3 不约束.

matlab 复制代码
clc;clear;

p = sdpvar(3,1);
%% 
f = -2*p(1)-3*p(1)^2-3*p(2)-p(2)^2-p(3);

%%
Cons = [(p(1)>=0),(p(1)+2*p(1)^2+p(2)+2*p(2)^2+p(3)<=10),(p(1)+p(1)^2+p(2)+p(2)^2-p(3)<=50),(2*p(1)+p(1)^2+2*p(2)+p(3)<=40),(p(1)^2+p(3)==2),(p(1)+2*p(2)>=1)];
%%
% options = sdpsettings('solver','bmibnb', 'bmibnb.uppersolver', 'fmincon');
%% 
optimize(Cons,f);
%%
% 三个变量的解
P=double(p);
% 目标优化值
Obj=double(-f);
objstr=['目标函数最优值:',num2str(Obj)];
disp(objstr)
disp(P);
相关推荐
Ricciflows15 小时前
MIT线性代数教材:Linear Algebra and Its Applications
人工智能·学习·线性代数·机器学习·数学建模·矩阵
大写-凌祁2 天前
2024国赛A题第一问
线性代数·算法·机器学习·数学建模
数小模.2 天前
数学建模两篇小文
数学建模
chhanz2 天前
MATLAB符号计算-符号表达式基础运算操作
数学建模·matlab
chhanz2 天前
MATLAB符号计算-初步认识符号对象
数学建模·matlab
m0_689618282 天前
数学建模助力干细胞研究,配体纳米簇如何影响干细胞命运
笔记·数学建模
数小模.2 天前
数学建模与数学建模竞赛
数学建模
gang_unerry5 天前
量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多
人工智能·python·算法·机器学习·数学建模·矩阵·量子计算
C灿灿数模7 天前
备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!
数学建模
数模竞赛Paid answer8 天前
2023年西南大学数学建模C题天气预报解题全过程文档及程序
算法·数学建模·数据分析