数学建模:多目标优化算法

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

数学建模:多目标优化算法

多目标优化

分别求权重方法

算法流程:

  1. 两个目标权重求和,化为单目标函数,然后求解最优值

min ⁡ x ∑ i = 1 m w i F i ( x ) s.t. g ( x ) ⩽ 0 h ( x ) = 0 \begin{array}{ll}\min {x} & \sum{i=1}^{m} {w_{i} F_{i}(x)} \\\\\text { s.t. } & g(x) \leqslant 0 \\\\& h(x)=0\end{array} minx s.t. ∑i=1mwiFi(x)g(x)⩽0h(x)=0

matlab 复制代码
clc;clear;

%% 指定初始解
x0 = zeros(3,1);
% <线性>不等约束
A = [2,1,3];
B = [6];
% <线性>等式约束
Aeq = [];
Beq = [];
% 变量上下限
LB = zeros(3,1);
UB = 1*ones(3,1);
%% 乘以权重,化为单目标求最优值
% 有几个目标函数,就写几个权重,然后依次相乘再相加
W1 =0.5;
W2 = 0.5;
fun = @(x) (-x(1)^2+x(2)^2-x(2)*x(3)^2)*W1 + (2*x(1)^2-x(2)^3+2*x(2)*x(3))*W2;

%% 取得非线性不等式约束函数
nonlcon = @noLinearLimited;
%% 求解fun单目标最优值
[x,fval] = fmincon(fun,x0,A,B,Aeq,Beq,LB,UB,nonlcon);

objstr=['目标函数最优值:',num2str(-fval)];
disp(objstr)
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end

%% 非线性不等式约束的表达式,如果有多个,则在C后面加; 补充即可
function [C,Ceq] = noLinearLimited(x)
    C = [x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6];
    Ceq = [];
end

Goal attain方法求解

  1. 使用Goal attain求解目标最优化问题,可以调用matlab中的函数:fgoalattain

min ⁡ γ , x γ s.t. F i ( x ) − w i γ ⩽ F i ∗ for i = 1 , ... , m g ( x ) ⩽ 0 h ( x ) = 0 \begin{array}{ll}\min {\gamma, x} \gamma \\\\\text { s.t. } & F{i}(x)-w_{i} \gamma \leqslant F_{i}^{*} \quad \text { for } i=1, \ldots, m \\\\& g(x) \leqslant 0 \\\\& h(x)=0\end{array} minγ,xγ s.t. Fi(x)−wiγ⩽Fi∗ for i=1,...,mg(x)⩽0h(x)=0

matlab 复制代码
clc;clear;

%% 指定初始解
x0 = zeros(3,1);
% <线性>不等约束
A = [2,1,3];
B = [6];
% <线性>等式约束
Aeq = [];
Beq = [];
% 变量上下限
LB = zeros(3,1);
UB = 1*ones(3,1);
%% 分两个(n个)非线性目标的最优值
% 两个目标函数
fun1 = @(x) -x(1)^2+x(2)^2-x(2)*x(3);
fun2 = @(x) 2*x(1)^2-x(2)^3+2*x(2)*x(3);

%% fun1的最优化:
nonlcon = @noLinearLimited;
[x1,fval1] = fmincon(fun1,x0,A,B,Aeq,Beq,LB,UB,nonlcon);

objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
    xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
    disp(xstr)
end

% fun2的最优化:
[x2,fval2] = fmincon(fun2,x0,A,B,Aeq,Beq,LB,UB,nonlcon);

objstr=['目标函数最优值:',num2str(fval2)];
disp(objstr)
for i=1:length(x2)
    xstr=['x',num2str(i),'的值为:',num2str(x2(i))];
    disp(xstr)
end
%% 多目标优化
goal = [fval1,fval2]; % 目标是接近于单目标的最优值
func = @(x) [-x(1)^2+x(2)^2-x(2)*x(3);2*x(1)^2-x(2)^3+2*x(2)*x(3)];
W = [1,1];% 自己赋值权重,两个(n个)非线性
[x,fval] = fgoalattain(func,x0,goal,W,A,B,Aeq,Beq,LB,UB,nonlcon);

disp('在两个目标的优化结果为')
disp(func(x))
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end

%% 非线性不等式约束的表达式,如果有多个,则在C后面加; 补充即可
function [C,Ceq] = noLinearLimited(x)
    C = [x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6];
    Ceq = [];
end
相关推荐
曦月逸霜44 分钟前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
海的诗篇_2 小时前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法
自动驾驶小卡2 小时前
A*算法实现原理以及实现步骤(C++)
算法
Unpredictable2222 小时前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉
编程绿豆侠2 小时前
力扣HOT100之多维动态规划:1143. 最长公共子序列
算法·leetcode·动态规划
珂朵莉MM2 小时前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
fail_to_code3 小时前
递归法的递归函数何时需要返回值
算法
C137的本贾尼3 小时前
(每日一道算法题)二叉树剪枝
算法·机器学习·剪枝
BUG收容所所长5 小时前
栈的奇妙世界:从冰棒到算法的华丽转身
前端·javascript·算法