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;
- maxval: word;
- 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 maxval: word);
- var
- i: integer;
- begin
- randomize;
- maxval := 0;
- for i := 1 to n do begin
- pop[i] := random(65537) + 1;
- if pop[i] > maxval then maxval := pop[i];
- end;
- 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
- if ver1*ver2 <> 0 then 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 ) and (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) = 1 ) and ((kor2 and st) = 0) then begin
- kor1 := kor1 - st;
- kor2 := kor2 + st;
- end
- else if ((kor1 and st) = 0) and ((kor2 and st) = 1) then begin
- kor1 := kor1 + st;
- kor2 := kor2 - st;
- end;
- end;
- ver1:= ver1 - 1;
- ver2:= ver2 - 1;
- writeln('**');
- end;
- end;
- end;
- procedure selek(var pop: mas);
- var
- a: arr;
- i,j: integer;
- sum,midval: double;
- begin
- sum := 0;
- for i:=1 to n do begin
- a[i]:=F(pop[i]/16250);
- sum:= sum + a[i];
- end;
- midval:= sum / n;
- for i:=1 to n do a[i] := a[i] / midval;
- sorting(a, pop);
- writeln('*');
- Repeat
- for i := n downto 2 do if a[i] <> 0 then skr(pop[i], pop[i-1], a[i],a[i-1]);
- Until a[1] = 0;
- 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.15 then begin
- j:= start;
- k:= 16;
- while j < k do begin
- if ( pop[i] and round(exp(j*ln(2))) = 1) 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))) = 1) then
- pop[i]:= pop[i] + round(exp(j*ln(2))) - round(exp(k*ln(2)));
- j := j + 1;
- k := k - 1;
- end;
- end;
- end;
- begin
- init(pop, maxval);
- selek(pop);
- mutation(pop);
- writeln('*');
- writeln(pop[1]);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement