昨天运行C-TAEA算法死循环,查出原因是以下代码类似下面2段代码,没有生效,即从集合里删除1个或多个个体没有效果,S的总长度还是不变
x_wrost=F_last(index(1:delete_n));
S=setdiff(S,x_wrost);
x_wrost=St(order);
S=setdiff(S,x_wrost)
解决办法
1.先定义一个种群类
classdef MySolution < handle
properties
dec; % 决策变量,决策变量里元素个数即维度D
obj; % 目标值,目标值里元素个数即目标函数个数M
con; % 约束值,
end
methods
% 构造函数,批量初始化种群
function result = MySolution(PopDec,PopObj,PopCon)
if nargin > 0
N = size(PopObj, 1); % 行数
result(1, N) = MySolution;
for i = 1 : N
result(i).dec = PopDec(i,:);
result(i).obj = PopObj(i,:);
result(i).con = PopCon(i,:);
end
end
end
% 重写
function isEqual = eq(obj1, obj2)
isEqual = isequal(obj1.dec, obj2.dec) && isequal(obj1.obj, obj2.obj) && isequal(obj1.con, obj2.con);
end
end
end
2.问题解决完整demo如下
clc;clear;
cd(fileparts(mfilename('fullpath')));
addpath(genpath(cd));
% 假如有一个2维的三目标函数
% 一般多目标共享决策空间,即每个目标函数对应的决策变量个数是一样的,即D是常量
% 三个目标函数
% f1(x1, x2) = (x1 - 2) ^2 + (x - 3) ^ 2;
% f2(x1, x2) = x1 ^ 2 + x2 ^2;
% f3(x1, x2) = -(x1 + 2x2);
% 两个个约束条件函数
% g1(x1, x2) = x1 + x2 -5 % 即 x1 + x2 <= 5 , 当 g1(x1, x2) <=0 说明没有违反约束
% g2(x1, x2) = x1 ^ 2 + x2 ^ 2 - 10
PopDec = [0 0; 1 1; 2 2; 3 3]; % 定义了4组数据
PopObj = [13 0 0; 5 2 -3; 1 8 -6; 1 18 -9]; % 定义了4组数据
PopCon = [-5 -10; -3 -8; -1 -2; 1 8]; % 定义了4组数据
% 批量手动定义1个种群,保护4个个体
P1 = MySolution(PopDec, PopObj, PopCon);
% 删除其中一个个体
P2 = setdiff(P1, P1(1)); % 没有效果
disp(length(P2))
% 删除多个个体
P3 = setdiff(P1, P1(1:3)); % 没有效果
disp(length(P3))
% -------------------------------------------------------
% 删除1个的元素的,解决办法
% 法1, 转成
P2 = setdiff(P1', P1(1), 'rows')'; % 加了一个参数,然后将矩阵由列形式(4x1)转成行形式(1x4)处理
disp(length(P2))
% 法2
isEqualArray = arrayfun(@(x) x ~= P1(1), P1); % 比较 S 中每个元素与 x_wrost 是否不相等
P2 = P1(isEqualArray); % 只保留不等于 x_wrost 的解
disp(length(P2))
% -------------------------------------------------------
% 删除多个的元素的,解决办法
% 法1
% wrost_x = P1(1:3);
% for i = 1:length(wrost_x)
% P1 = setdiff(P1', wrost_x(i), 'rows')'; % 加了一个参数,然后将矩阵由列形式(4x1)转成行形式(1x4)处理
% end
% disp(length(P1))
% 法2
wrost_x = P1(1:3);
for i = 1:length(wrost_x)
isEqualArray = arrayfun(@(x) x ~= P1(1), P1); % 比较 S 中每个元素与 x_wrost 是否不相等
P1 = P1(isEqualArray); % 只保留不等于 x_wrost 的解
end
disp(length(P1))
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏