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

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

昨天运行C-TAEA算法死循环,查出原因是以下代码类似下面2段代码,没有生效,即从集合里删除1个或多个个体没有效果,S的总长度还是不变

  1. x_wrost=F_last(index(1:delete_n));
  2. S=setdiff(S,x_wrost);
  3. x_wrost=St(order);
  4. S=setdiff(S,x_wrost)

解决办法

1.先定义一个种群类

  1. classdef MySolution < handle
  2. properties
  3. dec; % 决策变量,决策变量里元素个数即维度D
  4. obj; % 目标值,目标值里元素个数即目标函数个数M
  5. con; % 约束值,
  6. end
  7. methods
  8. % 构造函数,批量初始化种群
  9. function result = MySolution(PopDec,PopObj,PopCon)
  10. if nargin > 0
  11. N = size(PopObj, 1); % 行数
  12. result(1, N) = MySolution;
  13. for i = 1 : N
  14. result(i).dec = PopDec(i,:);
  15. result(i).obj = PopObj(i,:);
  16. result(i).con = PopCon(i,:);
  17. end
  18. end
  19. end
  20. % 重写
  21. function isEqual = eq(obj1, obj2)
  22. isEqual = isequal(obj1.dec, obj2.dec) && isequal(obj1.obj, obj2.obj) && isequal(obj1.con, obj2.con);
  23. end
  24. end
  25. end

2.问题解决完整demo如下

  1. clc;clear;
  2. cd(fileparts(mfilename('fullpath')));
  3. addpath(genpath(cd));
  4. % 假如有一个2维的三目标函数
  5. % 一般多目标共享决策空间,即每个目标函数对应的决策变量个数是一样的,即D是常量
  6. % 三个目标函数
  7. % f1(x1, x2) = (x1 - 2) ^2 + (x - 3) ^ 2;
  8. % f2(x1, x2) = x1 ^ 2 + x2 ^2;
  9. % f3(x1, x2) = -(x1 + 2x2);
  10. % 两个个约束条件函数
  11. % g1(x1, x2) = x1 + x2 -5 % x1 + x2 <= 5 , g1(x1, x2) <=0 说明没有违反约束
  12. % g2(x1, x2) = x1 ^ 2 + x2 ^ 2 - 10
  13. PopDec = [0 0; 1 1; 2 2; 3 3]; % 定义了4组数据
  14. PopObj = [13 0 0; 5 2 -3; 1 8 -6; 1 18 -9]; % 定义了4组数据
  15. PopCon = [-5 -10; -3 -8; -1 -2; 1 8]; % 定义了4组数据
  16. % 批量手动定义1个种群,保护4个个体
  17. P1 = MySolution(PopDec, PopObj, PopCon);
  18. % 删除其中一个个体
  19. P2 = setdiff(P1, P1(1)); % 没有效果
  20. disp(length(P2))
  21. % 删除多个个体
  22. P3 = setdiff(P1, P1(1:3)); % 没有效果
  23. disp(length(P3))
  24. % -------------------------------------------------------
  25. % 删除1个的元素的,解决办法
  26. % 1, 转成
  27. P2 = setdiff(P1', P1(1), 'rows')'; % 加了一个参数,然后将矩阵由列形式(4x1)转成行形式(1x4)处理
  28. disp(length(P2))
  29. % 2
  30. isEqualArray = arrayfun(@(x) x ~= P1(1), P1); % 比较 S 中每个元素与 x_wrost 是否不相等
  31. P2 = P1(isEqualArray); % 只保留不等于 x_wrost 的解
  32. disp(length(P2))
  33. % -------------------------------------------------------
  34. % 删除多个的元素的,解决办法
  35. % 1
  36. % wrost_x = P1(1:3);
  37. % for i = 1:length(wrost_x)
  38. % P1 = setdiff(P1', wrost_x(i), 'rows')'; % 加了一个参数,然后将矩阵由列形式(4x1)转成行形式(1x4)处理
  39. % end
  40. % disp(length(P1))
  41. % 2
  42. wrost_x = P1(1:3);
  43. for i = 1:length(wrost_x)
  44. isEqualArray = arrayfun(@(x) x ~= P1(1), P1); % 比较 S 中每个元素与 x_wrost 是否不相等
  45. P1 = P1(isEqualArray); % 只保留不等于 x_wrost 的解
  46. end
  47. disp(length(P1))

 

 
 

 

 

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

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

发表评论

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

  

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