PLATEMO遗传算法求解带约束优化问题
前言
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);
下一篇:
设计模式结构型装饰模式
