⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _evec3v2.pas

📁 微分进化法的pascal程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
                 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 + -