Advertisement
Guest User

Pizdets

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