使用nsga-2(gamultiobj)实现matlab多目标规划

gamultiobj函数基本知识点

在这里插入图片描述

  • fun代表的是目标函数

  • nvars代表的是待求变量的个数

  • A为不等式约束的系数项

  • b为不等式约束的常数项

  • Aeq为等式约束的系数项

  • beq为等式约束的常数项

  • lb和ub为变量x取值的上下限

  • 其中非线性等式约束和不等式约束需要创建函数来进行带入,对应上述中的使用部分为nonlcon

  • 在此需要注意一下,这个函数是求目标函数的最小值,如果是最大值时需要装换为求最小值,下面的约束条件也要注意转换。

使用NSGA-II(gamultiobj)求解多目标优化算法-线性规划

% 清除所有变量(非必须)
clc,clear

%% 模型设置
% 获取目标函数的函数句柄
fun = @fitnessfun; % 设置适应度函数句柄
% 变量个数
nvars=4;
% 约束条件形式1:上下界约束(若无取空数组[])
% lb<= X <= ub
lb=[0,0,0,0];
ub=[];

% 约束条件形式2:线性规划不等式约束(若无取空数组[])
% A*X <= b 
A = [0    0 1 1
    -1/3  0 0 0
     0 -1/2 0 0
     0 0 0 0];

b = [48 ; 30 ; 30 ; 0];

% 约束条件形式3:等式约束(若无取空数组[])
% Aeq*X = beq
Aeq=[1 1 0 0;0 0 0 0; 0 0 0 0; 0 0 0 0];
beq=[120;0;0;0];

%% 求解器设置
% 最优个体系数paretoFraction
% 种群大小populationsize
% 最大进化代数generations
% 停止代数stallGenLimit
% 适应度函数偏差TolFun
% 函数gaplotpareto:绘制Pareto前沿 
options=gaoptimset('paretoFraction',0.3,'populationsize',200,'generations',300,'stallGenLimit',200,'TolFun',1e-10,'PlotFcns',@gaplotpareto);

%% 主求解
[x,fval]=gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,options)
function f=fitnessfun(x)
% f是目标函数向量
% gamultiobj是以目标函数分量取极小值为目标,极大值的目标函数注意取相反数
f(1)=-(x(1)*100/3 + x(3)*90/3  + x(2)*80/2+x(4)*70/2);
f(2)=x(3)+x(4);
end

使用NSGA-II(gamultiobj)求解多目标优化算法-非线性规划

在这里插入图片描述

clc;clear;
%% 模型设置
%% 求解器设置
% 最优个体系数paretoFraction
% 种群大小populationsize
% 最大进化代数generations
% 停止代数stallGenLimit
% 适应度函数偏差TolFun
% 函数gaplotpareto:绘制Pareto前沿 
options=gaoptimset('paretoFraction',0.3,'populationsize',200,'generations',300,'stallGenLimit',200,'TolFun',1e-10,'PlotFcns',@gaplotpareto);
fun = @fitnessfun; % 设置适应度函数句柄
nonlcon = @nonlconfun; % 设置非线性约束函数句柄
nvars = 4; % 自变量个数
%% 线性规划系数和右端列向量
A = [];  
b = [];
Aeq = [];  
beq = [];
%% 自变量上下界
lb = [2;17;17;17];  
ub = [];
%% 主求解
[x,fval]=gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options)
function f = fitnessfun(x)
% 目标函数:多目标
f(1) = pi/60*x(1)*(2*x(3)+x(4))
f(2) = pi/2*x(1)^2*x(3)*x(4);   
end
function [c,ceq] = nonlconfun(x)
	% 非线性约束:c即不等式约束的函数值,是列向量(可以存在多个约束)。ceq即等式约束函数的函数值,同样是列向量(可以存在多个约束)
    % x:为自变量的行向量
    % c:非线性不等式约束的函数值.
    % ceq:非线性等式约束的函数值.   
     c(1,1) = x(1)*(x(2)-x(4));
     c(2,1) = 3.222*10^9/(x(1)^3*x(2)*(2*x(3)+x(4)))-450;
     c(3,1) = x(1)*(x(4)-pi*x(3));
     ceq(1,1)=pi*(2*x(1)*x(3)+x(4))-3000;  
end

参考文献

MATLAB遗传算法工具箱的使用及实例(非线性规划)
其中ga函数得调用只能使用一个目标函数,不适合多目标规划
【MATLAB】多目标优化算法 NSGA-II (gamultiobj) 的使用
Matlab利用NSGA2算法求解多目标优化

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值