Matlab遗传算法的部分映射交叉算子(pmx)源码

01.

02.% PMX means Goldberg's Partially Mapped CroSsover)

03.% Procedure :PMX

04.% Step1. Select two positions along the string uniformly at random.

05.%        The substrings defined by the two positions are called the mapping sections.

06.%        Note:(You can write to select a start point and a length) 

07.% Step2. Exchange two substrings between parents to produce proto-children.

08.% Step3. Determine the mapping relationship between two mapping section.

09.% Step4. Legalize offspring with the mapping relationship.

10.function [newVa,newVb]=PMX1(Va,Vb)

11.fprintf('original Va and Vb are:\n')

12.%Va= [ 1 6 10 3  9 4 5 2 7 8 ];

13.%Vb= [ 2 9  1 4 10 5 6 8 3 7 ];

14.%Va=1:9

15.%Vb=[5 4 6 9 2 1 7 8 3]

16.%--------------------------------------------------------------------------------

17.%Step1. Select two positions along the string uniformly at random.

18.startXorPoint=mod(ceil(rand(1)*10),length(Va) );

19.if startXorPoint==0

20.   startXorPoint=startXorPoint+1;

21.end   

22.xorLength=mod(floor(rand(1)*10),length(Va));

23.endXorPoint=startXorPoint+xorLength;

24.while(endXorPoint>length(Vb) )

25.   xorLength=mod(floor(rand(1)*10),length(Va));

26.   endXorPoint=startXorPoint+xorLength;

27.end   

28.fprintf('\n The (startXorPoint,endXorPoint)=(%d,%d)\n',startXorPoint,endXorPoint)

29.%startXorPoint=3

30.%endXorPoint=6

31.%--------------------------------------------------------------------------------

32.% Step2. Exchange two substrings between parents to produce proto-children.

33.temp1=Va(startXorPoint:endXorPoint);

34.temp2=Vb(startXorPoint:endXorPoint);

35.Va(startXorPoint:endXorPoint)=temp2;

36.Vb(startXorPoint:endXorPoint)=temp1;

37.clear temp1;

38.clear temp2;

39.fprintf('The exchanged Va and Vb are:\n')

40.Va

41.Vb

42.%--------------------------------------------------------------------------------

43.% Step3. Determine the mapping relationship between two mapping section.

44.temp1=Va(startXorPoint:endXorPoint);

45.temp2=Vb(startXorPoint:endXorPoint);

46.for ix=1:length(temp1)

47.    rawMapRelation(ix,1:2)=[Va(startXorPoint+ix-1),Vb(startXorPoint+ix-1)];

48.end  

49.rawMapRelation

50.%rawMapRelation=[6 3;9 4;2 5;1 6;3 7]

51.rowIndex=1;

52.colIndex=1;

53.while( rowIndex<=size(rawMapRelation,1) )

54.   while( colIndex<=size(rawMapRelation,2) )

55.      rawMapRelation(rowIndex,colIndex ) 

56.      [i,j]=find(rawMapRelation==rawMapRelation(rowIndex,colIndex ) )  ; 

57.          if(length(i)>1)

58.              if( j(1)<j(2) )

59.                 tempResult=[rawMapRelation(i(2),:), rawMapRelation(i(1),:)];

60.                   k=1

61.                    while k<length(tempResult)

62.                          if tempResult(1,k)==tempResult(1,k+1)

63.                          tempResult(k:k+1)=[];

64.                          end   

65.                    k=k+1;

66.                    end

67.                   tempResult       

68.                  rawMapRelation(i,:)=[];

69.                  rawMapRelation(size(rawMapRelation,1)+1,1:2)=tempResult;                  

70.                  

71.              else 

72.                  tempResult=[rawMapRelation(i(1),:), rawMapRelation(i(2),:)];

73.                   k=1

74.                    while k<length(tempResult)

75.                          if tempResult(1,k)==tempResult(1,k+1)

76.                          tempResult(k:k+1)=[];

77.                          end   

78.                    k=k+1;

79.                    end

80.                   tempResult         

81.                  rawMapRelation(i,:)=[];

82.                  rawMapRelation(size(rawMapRelation,1)+1,1:2)=tempResult;  

83.       

84.              end

85.           end   

86.          if(length(i)==1 & length(j)==1) 

87.             colIndex=colIndex+1;

88.          else

89.             rowIndex=1

90.             colIndex=1;

91.          end   

92.   end 

93.      rowIndex=rowIndex+1;

94.   end   

95.      colIndex=1;%Reset

96.  

97.rawMapRelation

98.tMap=[rawMapRelation;fliplr(rawMapRelation)]

99.Map=tMap'

100.fprintf('\n The (startXorPoint,endXorPoint)=(%d,%d)\n',startXorPoint,endXorPoint)

101.Va

102.Vb

103.%--------------------------------------------------------------------------------

104.% Step4. Legalize offspring with the mapping relationship.

105.if startXorPoint~=1

106.   for i=1:startXorPoint-1      

107.      [r,c]=find(Map(1,:)==Va(1,i)) ;  

108.      if ~isempty(r) & ~isempty(c)

109.         Va(1,i)=Map(r+1,c);

110.      end   

111.      [r1,c1]=find(Map(1,:)==Vb(1,i));   

112.      if ~isempty(r1) & ~isempty(c1)

113.         Vb(1,i)=Map(r1+1,c1);

114.      end   

115.   end

116.end

117.if endXorPoint~=length(Va)

118.   for i=endXorPoint+1:length(Va)

119.      [r,c]=find(Map(1,:)==Va(1,i));   

120.      if ~isempty(r) & ~isempty(c)

121.         Va(1,i)=Map(r+1,c);

122.      end   

123.      [r1,c1]=find(Map(1,:)==Vb(1,i)) ;  

124.      if ~isempty(r1) & ~isempty(c1)

125.         Vb(1,i)=Map(r1+1,c1);

126.      end   

127.   end   

128.end   

129.fprintf('The final Va and Vb are:\n')

130.newVa=Va

131.newVb=Vb

132.
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bryan Ding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值