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


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

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

    多目标优化

    分别求权重方法

    算法流程:

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

    min ⁡ x ∑ i = 1 m w i F i ( x )  s.t.  g ( x ) ⩽ 0 h ( x ) = 0

    minxi=1mwiFi(x) s.t. g(x)0h(x)=0" role="presentation">minxi=1mwiFi(x) s.t. g(x)0h(x)=0
    minx s.t. i=1mwiFi(x)g(x)0h(x)=0

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    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

    minγ,xγ s.t. Fi(x)wiγFi for i=1,,mg(x)0h(x)=0" role="presentation">minγ,xγ s.t. Fi(x)wiγFi for i=1,,mg(x)0h(x)=0
    minγ,xγ s.t. Fi(x)wiγFi for i=1,,mg(x)0h(x)=0

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    (附源码)ssm基于SSM的南昌旅游网站管理系统设计与实现 毕业设计 101407
    Semantic Kernel入门系列:通过依赖注入管理对象和插件
    SpringBoot-快速搭建并快速验证是否可用
    C语言入门(一)常量、变量
    爬虫实战+数据分析:全国消费支出分析及未来预测
    9. Java枚举和注解
    算法通关村第十九关——最少硬币数
    MySQL基本语句操作
    MFC静态编译,出现链接错误-库冲突(libcmt.lib和libcmtd.lib)
    uniapp 使用 z-paging组件
  • 原文地址:https://blog.csdn.net/jj6666djdbbd/article/details/132645998