作者pk790127 (<>)
看板MATLAB
标题[讨论] 基因演算法 交换问题
时间Fri Oct 28 22:49:56 2016
初学matlab , 想要简单实践基因演算法的逻辑,而不是用套件
我的交配(crossover)逻辑是有参考一篇paper所提供的 以下举例:
1~6个数值
V V V
P1 = [1,2,3,4,5,6]
V V V
P2 = [2,4,1,3,6,5]
我生成C1的方法是固定P2的位置(第2,4,6的位置),然後当作C1的值
V V V
C1 = [X,4,X,3,X,5] ,而剩下的X的值则由P1扣除掉4,3,5的值照顺序填入
P1 = [1,2,3(X),4(X),5(X),6] --> [1,2,6]
C1 = [1,4,2,3,6,5] 就是我求得的C1 子代的值 ,C2也同理
我在matlab上面我可以在固定位置的情况下达成,例如固定2,4,6的位置
P2([2,4,6]) %固定P2位置
P2_X = (P2([2,4,6])) % 令一个值存取叫P2_X
Y1=P1 % 令一个新矩阵叫Y1
for i = 1:3
Y1(Y1==P2_X(i)) = [] % 把Y1里面有P2_X重复的值挑出来
由於我都知道位置 所以
C1 = [Y1(1),P2(2),Y1(2),P2(4),Y1(3),P2(6)] % 我就可以土法炼钢的把C1填出来
但是我想知道的是,当我位置随机给定,不再是2,4,6而是其他随机产生的值
我有什麽方法可以做到我的交换逻辑,因为初学还不是很熟很多语法
我只能用比较笨的方法做...希望各位大大能指点
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.86.113
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1477666199.A.2E5.html
※ 编辑: pk790127 (36.238.93.87), 10/29/2016 01:43:32
1F:推 sunev: ind=[2 4 6];[x,ind2]=setdiff(P1,P2(ind),'stable'); 10/31 21:18
2F:→ sunev: C1=P2;C1(ind2)=x; 10/31 21:18
3F:→ pk790127: 感谢~ 有大概懂matlab矩阵的逻辑,虽然照这方法还是不行 11/02 20:38
4F:→ pk790127: 不过我用for回圈硬灌解决了 但是还是想知道上述的方法 11/02 20:39
5F:推 sunev: 因为没有实机测试过,所以不行也是理所当然的 (咦?) 11/02 20:55
6F:→ linfox: C1=P2;C1(ind2)=x;改成C1=zeros(1,6);C1(ind)=P2(ind); 11/02 21:31
7F:→ linfox: C1(C1==0)=P1(sort(ind2)); 11/02 21:32
8F:→ pk790127: 感谢两位提供的方法 已经成功解决了~ 11/03 02:37