PLATEMO是个比较好用的智能算法的MTALAB包,比如调用遗传算法,NSGA,PSO等,默认的优化问题只能更改所有变量的上下界。本文介绍如何用其求解带多条约束的优化问题。
针对如下的优化问题
max 3x(1)+2x(2);
% 约束条件
x(1)+x(2)<=350
x(1)>=20
2*x(1)+x(2)<=400
x(2)>=0
代码如下:
1、定义这个问题
classdef Test < PROBLEM
% <multiple><real><expensive><constrained>
properties(SetAccess = protected)
initFcn = {}; % Function for initializing a population
decFcn = {}; % Function for repairing invalid solution
objFcn = {}; % Objective functions
conFcn = {}; % Constraint functions
end
methods
%% Default settings of the problem 改动基本的参数
function Setting(obj)
if isempty(obj.M)
obj.M = 1; % 定义你优化问题的目标个数
end
obj.N = 100; % 种群数
obj.maxFE = 100000; % 种群数*最大迭代次数
if isempty(obj.D); obj.D = 2; end % 定义你优化问题的变量个数,
obj.encoding = 'real'; % 定义你优化问题的编码方式,例如实数编码'real',platEMO提供三种编码方式:'binary'二进制编码;'permutation'排列编码以及其他实数编码,根据你的优化问题的实际搜索空间可以自行选择
obj.lower = 0*ones(1,obj.D); % 定义你优化问题的下界
obj.upper = 300*ones(1,obj.D); % 定义你优化问题的上界
end
%% Calculate objective values
function PopObj = CalObj(obj,PopDec)
for i = 1:size(PopDec,1)
PopObj(i,1) = - 3*PopDec(i,1) - 2*PopDec(i,2);
end
%% 这里添加目标函数 PLATEMO默认求得是最小值,需取负号,求出最优目标值 再取负号
end
%% Calculate constraint violations
function PopCon = CalCon(obj,PopDec)
No_Pop = size(PopDec,1);
PopCon(1:No_Pop,1) = PopDec(1:No_Pop,1) + PopDec(1:No_Pop,2) - 350;
PopCon(1:No_Pop,2) = - PopDec(1:No_Pop,1) + 20;
PopCon(1:No_Pop,3) = 2*PopDec(1:No_Pop,1) + PopDec(1:No_Pop,2) - 400;
%% 在这里添加约束 按列排 PLATEMO默认是小于等于0
end
end
end
2、命令行运行PLATEMO指令求解。展示出结果。
platemo('algorithm',@GA,'problem',@Test);