MATLAB setdiff 删除对象报错解决方案

avatar 2024年10月12日17:08:38 0 340 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

昨天运行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))

 

 
 

 

 

  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0