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);
下一篇:
设计模式结构型装饰模式