📄 _evec3v2.pas
字号:
transmata[i] := rot[i] + ind[4];
tempmata[i] := transmata[i]/NP;
rt[i] := trunc(tempmata[i]);
rt[i] := transmata[i] - NP * rt[i]; {* rotate indices by ind[1] position *}
end;
for i := 1 to NP do
begin
k := rt[i] + 1;
a5[i] := a4[k];
end;
{%%%%%% a5}
{%%%%%% pm1}
for i := 1 to NP do
begin
k := a1[i];
for j := 1 to D do
pm1[i,j] := popold[k,j]; {* shuffled population 1 *}
end;
{%%%%%% pm1}
{%%%%%% pm2}
for i := 1 to NP do
begin
k := a2[i];
for j := 1 to D do
pm2[i,j] := popold[k,j]; {* shuffled population 2 *}
end;
{%%%%%% pm2}
{%%%%%% pm3}
for i := 1 to NP do
begin
k := a3[i];
for j := 1 to D do
pm3[i,j] := popold[k,j]; {* shuffled population 3 *}
end;
{%%%%%% pm3}
{%%%%%% pm4}
for i := 1 to NP do
begin
k := a4[i];
for j := 1 to D do
pm4[i,j] := popold[k,j]; {* shuffled population 4 *}
end;
{%%%%%% pm4}
{%%%%%% pm5}
for i := 1 to NP do
begin
k := a5[i];
for j := 1 to D do
pm5[i,j] := popold[k,j]; {* shuffled population 5 *}
end;
{%%%%%% pm5}
{%%%%%% bm}
for i := 1 to NP do
for j := 1 to D do
bm[i,j] := bestmemiter[1,j]; {* population filled with *}
{%%%%%% bm} {* the best member of the last iteration *}
{%%%%%% mui<CR}
for i := 1 to NP do
for j := 1 to D do
begin
teval := rand;
if teval < CR {* all random numbers < CR are 1, 0 otherwise *}
then mui[i,j] := 1
else mui[i,j] := 0;
end;
{%%%%%% mui<CR}
{%%%%%% strategy<5}
if strategy > 5
then st := strategy - 5
else
begin
st := strategy;
for i:= 1 to NP do {* transpose, collect 1's in each column *}
for j := 1 to D do
muitrans[j,i] := mui[i,j];
end;
for j := 1 to NP do
begin
ip:=0;
ik:=D+1;
for i := 1 to D do
begin
if muitrans[i,j]=0 then
begin
ip:=ip+1;
muitratm[ip,j]:=0; {* shuffle locations of vectors *}
end
else
begin
ik:=ik-1;
muitratm[ik,j]:=1;
end;
end;
end;
for j := 1 to NP do
for i := 1 to D do
muitrans[i,j]:=muitratm[i,j];
for i := 1 to D do
rotd[i] := i-1;
for j := 1 to NP do
begin
teval := rand * D;
n := trunc(teval);
if n > 0 then
begin
for i:=1 to D do
begin
transmata[i] := rotd[i] + n;
tempmata[i] := transmata[i]/D;
rtd[i] := trunc(tempmata[i]);
rtd[i] := transmata[i] - D * rtd[i]; {* rotate column i by n *}
end;
for i :=1 to D do
begin
k := rtd[i] + 1;
muitratm[i,j] := muitrans[k,j];
end;
end;
end;
for i:= 1 to D do {* transpose back *}
for j := 1 to NP do
mui[j,i] := muitratm[i,j];
{%%%%%% strategy<5}
{%%%%%% mpo}
for i :=1 to NP do
for j := 1 to D do
if mui[i,j] = 1
then mpo[i,j] := 0
else mpo[i,j] := 1; {* inverse mask to mui *}
{%%%%%% mpo}
{%%%%%% st=1}
if st = 1 {* DE/best/1 *}
then
for i := 1 to NP do
for j := 1 to D do
ui[i,j] := (popold[i,j] * mpo[i,j]) + ((bm[i,j] + F * (pm1[i,j] - pm2[i,j])) * mui[i,j])
else
{%%%%%% st=2}
if st = 2 {* DE/rand/1 *}
then
for i := 1 to NP do
for j :=1 to D do
ui[i,j] := (popold[i,j] * mpo[i,j]) + ((pm3[i,j] + F * (pm1[i,j] - pm2[i,j])) * mui[i,j])
else
{%%%%%% st=3}
if st = 3 {* DE/rand-to-best/1 *}
then
for i := 1 to NP do
for j :=1 to D do
ui[i,j] := (popold[i,j] * mpo[i,j]) + (popold[i,j] +
(F * (bm[i,j] - popold[i,j])) + (F * pm1[i,j] - pm2[i,j]))
else
{%%%%%% st=4}
if st = 4 {* DE/best/2 *}
then
for i := 1 to NP do
for j :=1 to D do
ui[i,j] := (popold[i,j] * mpo[i,j]) + ((bm[i,j] +
F * (pm1[i,j] - pm2[i,j] + pm3[i,j] - pm4[i,j])) * mui[i,j])
else
{%%%%%% st=5}
if st = 5 {* DE/rand/2 *}
then
for i := 1 to NP do
for j :=1 to D do
ui[i,j] := (popold[i,j] * mpo[i,j]) + ((pm5[i,j] +
F * (pm1[i,j] - pm2[i,j] + pm3[i,j] - pm4[i,j])) * mui[i,j]);
{*-----Select which vectors are allowed to enter the new population-----*}
for i := 1 to NP do
begin
sqall := 0.0;
for k := 1 to XY do
begin
ger := (ydata[k] - (pop[i,1]*xdata[k]*xdata[k])) * (ydata[k] - (pop[i,1]*xdata[k]*xdata[k])); {***}
sqall := sqall + ger;
end;
memberval[i] := sqall;
end;
for i := 1 to NP do
begin
sqall := 0;
for k := 1 to XY do
begin
ger := (ydata[k] - (ui[i,1]*xdata[k]*xdata[k])) * (ydata[k] - (ui[i,1]*xdata[k]*xdata[k])); {***}
sqall := sqall + ger;
end;
membervalui[i] := sqall;
end;
for i := 1 to NP do
if membervalui[i] < memberval[i]
then
begin
for j := 1 to D do
pop[i,j] := ui[i,j];
memberval[i] := membervalui[i];
end;
bestval := memberval[1];
for i := 1 to D do
bestmemiter[1,i] := pop[1,i];
for i := 2 to NP do
begin
if memberval[i] < bestval
then
begin
for j := 1 to D do
bestmemiter[1,j] := pop[i,j];
bestval := memberval[i];
end;
end;
for i := 1 to D do
bestmem[1,i] := bestmemiter[1,i];
bestvalev := bestval;
{*-----Output section-----*}
writeln(res);
writeln(res,'---------------------------------------------------');
writeln(res);
writeln(res,' Generation: ',cur_gen,'.');
writeln(res);
for i := 1 to NP do
begin
write(res,i,'. [');
begin
for j := 1 to D - 1 do
write(res,pop[i,j],' ');
end;
writeln(res,pop[i,D],' ], value: ',memberval[i]);
end;
writeln(res);
write(res,' Best member: ');
write(res,'[ ');
for j := 1 to D - 1 do
write(res,bestmem[1,j],' ');
writeln(res,bestmem[1,D],' ]');
writeln(res,' Value of best member ever: ',bestvalev);8.662275022361430E-01 2.376290447900800E-02
8.672744361683730E-01 2.382872969917100E-02
8.683117249165660E-01 2.389455491933410E-02
8.693394660367630E-01 2.396038013949730E-02
8.703577558626420E-01 2.402620535966030E-02
8.713666899711820E-01 2.409203057982340E-02
8.723663628916260E-01 2.415785579998660E-02
8.733568681054750E-01 2.422368102014960E-02
8.743382983375340E-01 2.428950624031270E-02
8.753107452066620E-01 2.435533146047590E-02
8.762742995168080E-01 2.442115668063890E-02
8.772290510241870E-01 2.448698190080190E-02
8.781750886701050E-01 2.455280712096510E-0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -