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) 59. tempResult=[rawMapRelation(i(2),:), rawMapRelation(i(1),:)]; 60. k=1 61. while k 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 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.