Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const n=10;
- type mas = array [1..n] of word;
- arr = array [1..n] of double;
- var
- pop: mas;
- maxkor,i: word;
- flag: boolean;
- maxval1, maxval2: double;
- function F(x : real): real;
- begin
- 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);
- end;
- procedure init(var pop: mas);
- var
- i: integer;
- begin
- randomize;
- maxkor := 0;
- for i := 1 to n do pop[i] := random(65537) + 1;
- end;
- procedure sorting( var a: arr; var pop: mas);
- var i,j,b: integer;
- c: real;
- begin
- for j:=1 to n-1 do
- for i:=1 to n-j do
- if a[i] > a[i+1] then begin
- c:= a[i]; b:=pop[i];
- a[i]:=a[i+1]; pop[i]:=pop[i+1];
- a[i+1]:=c; pop[i+1]:=b
- end;
- end;
- function ver(n: integer): double;
- begin
- randomize;
- ver:= (random(n)+1)/100;
- end;
- procedure skr(var kor1, kor2: word; var ver1,ver2: double);
- var
- pos1,pos2,i,st: integer;
- begin
- randomize;
- if ver(100) <= frac(ver1) then ver1 := trunc(ver1) + 1
- else ver1:= trunc(ver1);
- if ver(100) <= frac(ver2) then ver2 := trunc(ver2) + 1
- else ver2:= trunc(ver2);
- if (ver1 >= 1 ) or (ver2 >= 1 ) then begin
- {Process of mixing}
- randomize;
- pos1:= random(16)+1;
- Repeat
- pos2:= random(16)+1;
- Until pos2 <> pos1;
- if pos1 > pos2 then begin
- i:= pos1;
- pos1:= pos2;
- pos2:= i;
- end;
- for i:= pos1 to pos2 do begin
- st:= round(exp(i*ln(2)));
- if ((kor1 and st) <> 0 ) and ((kor2 and st) = 0) then begin
- kor1 := kor1 - st;
- kor2 := kor2 + st;
- end
- else if ((kor1 and st) = 0) and ((kor2 and st) <> 0) then begin
- kor1 := kor1 + st;
- kor2 := kor2 - st;
- end;
- end;
- ver1:= ver1 - 1;
- ver2:= ver2 - 1;
- end;
- end;
- procedure mutation(var pop: mas);
- var i,j,k,c,start: integer;
- begin
- randomize;
- start:= random(16)+1;
- for i:= 1 to n do
- if ver(100) < 0.3 then begin
- j:= start;
- k:= 16;
- while j < k do begin
- if ( pop[i] and round(exp(j*ln(2))) <> 0) and ( pop[i] and round(exp(k*ln(2))) = 0) then
- pop[i]:= pop[i] - round(exp(j*ln(2))) + round(exp(k*ln(2)))
- else if ( pop[i] and round(exp(j*ln(2))) = 0) and ( pop[i] and round(exp(k*ln(2))) <> 0) then
- pop[i]:= pop[i] + round(exp(j*ln(2))) - round(exp(k*ln(2)));
- j := j + 1;
- k := k - 1;
- end;
- end;
- end;
- procedure selek(var pop: mas);
- var
- a: arr;
- i,j, count: integer;
- sum,midval: double;
- begin
- Repeat
- sum := 0;
- for i:=1 to n do begin
- a[i]:=F(pop[i]/16384);
- if a[i] > maxval2 then
- if a[i] > maxval1 then begin
- maxval2:= maxval1;
- maxval1 := a[i];
- maxkor := pop[i];
- end
- else maxval2 := a[i];
- sum:= sum + a[i];
- end;
- midval:= sum / n;
- for i:=1 to n do a[i] := a[i] / midval;
- mutation(pop);
- sorting(a, pop);
- Repeat
- for i := n downto 2 do begin
- skr(pop[i], pop[i-1], a[i],a[i-1]);
- end;
- Until a[10] = 0;
- if maxval1=maxval2 then count:= count + 1
- else count := 1;
- Until count = 10;
- end;
- begin
- maxval2:=-2;
- maxval1:=-1;
- init(pop);
- for i:=1 to n do write(pop[i], ' ');
- writeln;
- selek(pop);
- writeln(maxkor);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement