?? xovmp.m
字號:
function NewChrom = xovmp(OldChrom, Px, Npt, Rs);
% 種群大小為Nind and 染色體長度為Lind
[Nind,Lind] = size(OldChrom);
if Lind < 2, NewChrom = OldChrom; return; end
if nargin < 4, Rs = 0; end
if nargin < 3, Npt = 0; Rs = 0; end
if nargin < 2, Px = 0.7; Npt = 0; Rs = 0; end
if isnan(Px), Px = 0.7; end
if isnan(Npt), Npt = 0; end
if isnan(Rs), Rs = 0; end
if isempty(Px), Px = 0.7; end
if isempty(Npt), Npt = 0; end
if isempty(Rs), Rs = 0; end
Xops = floor(Nind/2);
DoCross = rand(Xops,1) < Px;
odd = 1:2:Nind-1;
even = 2:2:Nind;
% 計算每個染色體對的有效長度
Mask = ~Rs | (OldChrom(odd, :) ~= OldChrom(even, :));
Mask = cumsum(Mask')';
% 根據(jù)有效長度和Px來計算每個個體對的交叉位置
xsites(:, 1) = Mask(:, Lind);
if Npt >= 2,
xsites(:, 1) = ceil(xsites(:, 1) .* rand(Xops, 1));
end
xsites(:,2) = rem(xsites + ceil((Mask(:, Lind)-1) .* rand(Xops, 1)) ...
.* DoCross - 1 , Mask(:, Lind) )+1;
% 用0-1表示交叉位置
Mask = (xsites(:,ones(1,Lind)) < Mask) == ...
(xsites(:,2*ones(1,Lind)) < Mask);
if ~Npt,
shuff = rand(Lind,Xops);
[ans,shuff] = sort(shuff);
for i=1:Xops
OldChrom(odd(i),:)=OldChrom(odd(i),shuff(:,i));
OldChrom(even(i),:)=OldChrom(even(i),shuff(:,i));
end
end
%交叉
NewChrom(odd,:) = (OldChrom(odd,:).* Mask) + (OldChrom(even,:).*(~Mask));
NewChrom(even,:) = (OldChrom(odd,:).*(~Mask)) + (OldChrom(even,:).*Mask);
% 如果個體數(shù)目為奇數(shù),則最后一個個體不能被交叉,
%但是必須包含在新一代中
if rem(Nind,2),
NewChrom(Nind,:)=OldChrom(Nind,:);
end
if ~Npt,
[ans,unshuff] = sort(shuff);
for i=1:Xops
NewChrom(odd(i),:)=NewChrom(odd(i),unshuff(:,i));
NewChrom(even(i),:)=NewChrom(even(i),unshuff(:,i));
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -