当前位置: 首页 > 工具软件 > PlatEMO > 使用案例 >

PLATEMO遗传算法求解带约束优化问题

东门深
2023-12-01

前言

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);
 类似资料: