Advertisement
Guest User

пиздец

a guest
Feb 24th, 2018
517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. const n=10;
  2.  
  3. type mas = array [1..n] of word;
  4. arr = array [1..n] of double;
  5.  
  6. var
  7. pop: mas;
  8. maxval: word;
  9.  
  10. function F(x : real): real;
  11. begin
  12. F := x*(x-1.1)*(x-1.1)*(x-1.1)*(x-1.1)*(x-1.1)*(x-1.2)*(x-1.2)*(x-1.2)*(x-1.2)*(x-1.3)*(x-1.3)*(x-1.3)*cos(x+100);
  13. end;
  14.  
  15. procedure init(var pop: mas; var maxval: word);
  16. var
  17. i: integer;
  18. begin
  19. randomize;
  20. maxval := 0;
  21. for i := 1 to n do begin
  22. pop[i] := random(65537) + 1;
  23. if pop[i] > maxval then maxval := pop[i];
  24. end;
  25. end;
  26.  
  27. procedure sorting( var a: arr; var pop: mas);
  28. var i,j,b: integer;
  29. c: real;
  30. begin
  31. for j:=1 to n-1 do
  32. for i:=1 to n-j do
  33. if a[i] > a[i+1] then begin
  34. c:= a[i]; b:=pop[i];
  35. a[i]:=a[i+1]; pop[i]:=pop[i+1];
  36. a[i+1]:=c; pop[i+1]:=b
  37. end;
  38. end;
  39.  
  40. function ver(n: integer): double;
  41. begin
  42. randomize;
  43. ver:= (random(n)+1)/100;
  44. end;
  45.  
  46. procedure skr(var kor1, kor2: word; var ver1,ver2: double);
  47. var
  48. pos1,pos2,i,st: integer;
  49. begin
  50. if ver1*ver2 <> 0 then begin
  51. randomize;
  52. if ver(100) >= frac(ver1) then ver1 := trunc(ver1) + 1
  53. else ver1:= trunc(ver1);
  54. if ver(100) >= frac(ver2) then ver2 := trunc(ver2) + 1
  55. else ver2:= trunc(ver2);
  56. if (ver1 >= 1 ) and (ver2 >= 1) then begin
  57. {Process of mixing}
  58. randomize;
  59. pos1:= random(16)+1;
  60. Repeat
  61. pos2:= random(16)+1;
  62. Until pos2 <> pos1;
  63. if pos1 > pos2 then begin
  64. i:= pos1;
  65. pos1:= pos2;
  66. pos2:= i;
  67. end;
  68. for i:= pos1 to pos2 do begin
  69. st:= round(exp(i*ln(2)));
  70. if ((kor1 and st) = 1 ) and ((kor2 and st) = 0) then begin
  71. kor1 := kor1 - st;
  72. kor2 := kor2 + st;
  73. end
  74. else if ((kor1 and st) = 0) and ((kor2 and st) = 1) then begin
  75. kor1 := kor1 + st;
  76. kor2 := kor2 - st;
  77. end;
  78. end;
  79. ver1:= ver1 - 1;
  80. ver2:= ver2 - 1;
  81. writeln('**');
  82. end;
  83. end;
  84. end;
  85.  
  86.  
  87. procedure selek(var pop: mas);
  88. var
  89. a: arr;
  90. i,j: integer;
  91. sum,midval: double;
  92. begin
  93. sum := 0;
  94. for i:=1 to n do begin
  95. a[i]:=F(pop[i]/16250);
  96. sum:= sum + a[i];
  97. end;
  98. midval:= sum / n;
  99. for i:=1 to n do a[i] := a[i] / midval;
  100. sorting(a, pop);
  101. writeln('*');
  102. Repeat
  103. for i := n downto 2 do if a[i] <> 0 then skr(pop[i], pop[i-1], a[i],a[i-1]);
  104. Until a[1] = 0;
  105. end;
  106.  
  107. procedure mutation(var pop: mas);
  108. var i,j,k,c,start: integer;
  109. begin
  110. randomize;
  111. start:= random(16)+1;
  112. for i:= 1 to n do
  113. if ver(100) > 0.15 then begin
  114. j:= start;
  115. k:= 16;
  116. while j < k do begin
  117. if ( pop[i] and round(exp(j*ln(2))) = 1) and ( pop[i] and round(exp(k*ln(2))) = 0) then
  118. pop[i]:= pop[i] - round(exp(j*ln(2))) + round(exp(k*ln(2)))
  119. else if ( pop[i] and round(exp(j*ln(2))) = 0) and ( pop[i] and round(exp(k*ln(2))) = 1) then
  120. pop[i]:= pop[i] + round(exp(j*ln(2))) - round(exp(k*ln(2)));
  121. j := j + 1;
  122. k := k - 1;
  123. end;
  124. end;
  125. end;
  126.  
  127. begin
  128. init(pop, maxval);
  129. selek(pop);
  130. mutation(pop);
  131. writeln('*');
  132. writeln(pop[1]);
  133. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement