最適化アルゴリズム

〜 シンプレックス法 〜

このワークシートでは、良く知られている最適化アルゴリズムのシンプレックス (単体) 法のプログラムを紹介します。
アルゴリズムの内容の詳しい説明は省略し実際例を示し応用の可能性を示します。
ぜひ様々な分野でお役立てください。

>    restart;

はじめに

最適化アルゴリズムは多くありますがどれも一長一短があります。

このシンプレックス法は良く知られたシンプルな方法で極値をシンプレックス(単体)で囲みシンプレックスを小さくして行くことにより極小値を見つけるアルゴリズムです

(極大値を見つける問題は符号の違いだけなので通常極小値問題に限定します)。

線形計画 (LP:Linear Programing) 法では標準的に使われています。

線形であれば極値は境界上に必ずあるので最適化が高速にできるのが理由です。

シンプレックス法は非線型の最適化にも適用できます。変数の数を n とすると設計空間の次元も n となり、その空間内の n 次元シンプレックスで極値を囲みます。

非線型ではシンプレックスを小さくするために繰り返しの回数が必要になります。

一変数すなわち設計空間が一次元の場合は通常の区間 (interval) がシンプレックスです。

極小値を区間の間にはさみ、幅を縮小して極値に近づけます。

充分狭まったらその区間の両端の小さい法を極値とします。

極値が区間の中にあることの判定はシンプレックス(区間)の重心(中点)での評価関数の値を調べ2変数の場合、2次元の設計空間となりますが、2次元のシンプレックスは3角形です。

極値がその3角形の中に有るように囲み3角形を縮小して極値を見つけます。同様に重心での値を評価しながら極値を探します。

3変数の場合は3次元となりますが、3次元のシンプレックスは4面体です。同様に重心を利用します。

シンプレックス

>    with(geom3d):
with(plots):
tetrahedron(t,point(o,1,2,3),3):

Warning, the assigned name polar now has a global binding

Warning, the name changecoords has been redefined

>    p:=NULL:
for angle from 10 by 10 to 190 do
  p:=p,draw(t,orientation=[angle,90]):
end do:

>    display3d(p,insequence=true);

[Maple Plot]

4変数以上になると空間的なイメージが湧きませんが、同様に一般化された n 次元の設計空間内のシンプレックスで同様に極値を探索します。
シンプレックスは独立した n+1 点の点からなります (どの3点も直線上にない)。

プログラム

以下optimizeのソースプログラムです。

>    restart;
with(plots):
with(linalg):

Warning, the name changecoords has been redefined

Warning, the protected names norm and trace have been redefined and unprotected

>    optimize := proc(ndim,f)
  local  simplx,xx,p,ftol,mpts,pp,psum,i,j,k,y,sum,nn,nfunk,kk,
         ilo,inhi,ihi,bunbo,rtol,temp,ytry,ysave;

  simplx := proc(p,y,psum,ndim,ihi,fac)
    local ptry,fac1,fac2,j,ytry;
    ptry:=vector(ndim);
    fac1:=evalf((1-fac)/ndim);
    fac2:=evalf(fac1-fac);
    for j to ndim do
      ptry[j]:=evalf(psum[j]*fac1-p[ihi,j]*fac2)
    end do;
    ytry:=evalf(f(ptry));
    if ytry < y[ihi] then
      y[ihi]:=ytry;
      for j to ndim do
        psum[j]:=evalf(psum[j]+ptry[j]-p[ihi,j]);
        p[ihi,j]:=ptry[j];
      end do;
    end if;
    RETURN(ytry)
  end proc:

  ftol:=1.0e-4;
  mpts:=ndim+1;
  pp:=vector(ndim);
  psum:=vector(ndim);
  y:=vector(mpts);
  p:=matrix(mpts,ndim);
  for i to mpts do
    for j to ndim do
      p[i,j]:=evalf(rand()/10^12)
    end do;
  end do:
  for j to mpts do
    for k to ndim do
      pp[k]:=p[j,k]:
    end do;
    y[j]:=evalf(f(pp));
  end do;
  nfunk:=0;
  for j to ndim do
    sum:=0;
    for i to mpts do
      sum:=evalf(sum+p[i,j]);
    end do:
    psum[j]:=sum;
  end do:
  nn:=2000;
  for kk to nn do
    ilo:=1;
    if y[1] > y[2] then
      inhi:=2;
      ihi:=1;
    else
      inhi:=1;
      ihi:=2;
    end if;
    for i to mpts do
      if y[i] <= y[ilo] then
        ilo:=i
      end if;
      if y[i] > y[ihi] then
        inhi:=ihi;ihi:=i;
      else
        if y[i] > y[ihi] and i <> ihi then
          inhi:=i;
        end if;
      end if;
    end do;
    bunbo:=evalf(abs(y[ihi])+abs(y[ilo]));
    if bunbo = 0 then
      bunbo:=1
    end if;
    rtol:=evalf(2*abs(y[ihi]-y[ilo])/bunbo);
    if rtol < ftol then
      temp:=y[1];
      y[1]:=y[ilo];
      y[ilo]:=temp;
      for i to ndim do
        temp:=p[1,i];
        p[1,i]:=p[ilo,i];
        p[ilo,i]:=temp;
      end do;
      break;
    end if;
    nfunk:=nfunk+2;
    ytry:=simplx(p,y,psum,ndim,ihi,-1.0);
    if ytry <= y[ilo] then
      ytry:=simplx(p,y,psum,ndim,ihi,2.0)
    else
      if ytry >= y[inhi] then
        ysave:=y[ihi];
        ytry:=simplx(p,y,psum,ndim,ihi,0.5);
        if ytry >= ysave then
          for i to mpts do
            if i<> ilo then
              for j to ndim do
                psum[j]:=evalf(0.5*(p[i,j]+p[ilo,j]));
                p[i,j]:=psum[j];
              end do;
              y[i]:=evalf(f(psum));
            end if;
          end do;
          nfunk:=nfunk+ndim;
          for j to ndim do
            sum:=0;
            for i to mpts do
              sum:=sum+p[i,j];
            end do;
            psum[j]:=sum;
          end do;
        end if;
      else
        nfunk:=nfunk-1;
      end if;
    end if:
    if kk mod 50 = 0 then
      for j to ndim do
        pp[j]:=p[ilo,j]
      end do;
      print(`cycle `,kk,` value `,rtol,` simplex`,pp);
    end if;
  end do;
  print(`cycle `,kk,`value `,rtol,` simplex`,pp);

  for j to ndim do
    pp[j]:=p[1,j]
  end do;
  RETURN(pp);
end proc:

使い方

このプログラムはコピーして自由にお使いください。ただしご使用上のトラブルに関しては保障はできませんのでご了承ください。成功した事例などありましたら公開あるいはお知らせいただければ幸いです。

関数名はoptimizeで引数は関数 f と引数の数 ndim です。

引数の関数fは事前に定義しておく必要があります。

例  f:=(x,y,z)->(x-1)^2+(y-2)^2+(z-3)^2;

次のように呼び出し実行いたします。

ans:=optimize(f,ndim)

ansにはベクトルの形で最適な関数値(局所解)を返します。

簡単な例

2変数の例を示します。

>    ff:=(x,y)->abs((x-1)^3)+(y-2)^2;

ff := proc (x, y) options operator, arrow; abs((x-1)^3)+(y-2)^2 end proc

この関数は正 (>= 0) であり { x=1, y=2 } で 0 (ゼロ)となり最小値となります。

>    unprotect(angle):

>    p:=NULL:
for angle from 10 by 30 to 340 do
p:=p,plot3d(ff(x,y),x=-1..3,y=-2..5,orientation=[angle,90]):
od:
display(p,insequence=true);

[Maple Plot]

これをoptimizerで見つけてみましょう。

>    ndim:=2;

ndim := 2

>    f := proc(x)
  RETURN(ff(x[1],x[2]))
end proc;

f := proc (x) RETURN(ff(x[1],x[2])) end proc

>    print(f);

proc (x) RETURN(ff(x[1],x[2])) end proc

>    ndim;

2

>    pp:=optimize(ndim,f):

`cycle `, 50, ` value `, .4373457228, ` simplex`, vector([1.000007666, 2.000000086])

`cycle `, 92, `value `, 0., ` simplex`, vector([1.000007666, 2.000000086])

>    print(pp);

vector([1.000000000, 2.000000000])

みごとに x = 1, y = 2 を見つけました。

もうひとつの2変数の例

同様に次の関数の極値を見つけてみましょう。

>    f1:=(x,y)->abs(x-(y+1)^2)+abs(y-x^2+1);

f1 := proc (x, y) options operator, arrow; abs(x-(y+1)^2)+abs(y-x^2+1) end proc

この関数は { x=(y+1)^2, y=x^2-1 } のとき 0 (ゼロ) となります。従って複数の点で極小となります。optimizer は一度には一つの極値しか求めることはできません。

>    plot3d(f1(x,y),x=-1.3..1.3,y=-1.3..1.1,style=PATCHNOGRID,orientation=[0,0],grid=[50,50],shading=ZHUE,projection=ORTHOGONAL);

[Maple Plot]

>    p:=NULL:
for angle from 10 by 30 to 340 do
  p:=p,plot3d(f1(x,y),x=-1.2..1.2,y=-1.2..1,shading=ZHUE,style=PATCH,orientation=[angle,90]):
end do:
display(p,insequence=true);

[Maple Plot]

この極値を求めてみましょう。

>    ndim:=2;

ndim := 2

>    f := proc(x)
  RETURN(f1(seq(x[kk],kk=1..ndim)))
end proc:
print(f);

proc (x) RETURN(f1(seq(x[kk],kk = 1 .. ndim))) end proc

>    pp:=optimize(ndim,f):

`cycle `, 50, ` value `, .2974186308, ` simplex`, vector([.9999995572, -.9484030966e-6])

`cycle `, 86, `value `, 0., ` simplex`, vector([.9999995572, -.9484030966e-6])

多少の誤差が見られますが一つの解を求めています。初期値は乱数で設定するようにしています。

8変数の例

次に8変数の例を示します。

>    ndim:=8;

ndim := 8

>    f8 := (x1,x2,x3,x4,x5,x6,x7,x8) -> (x1-1)^2+(x2-2)^2+(x3-3)^2+(x4-4)^2+(x5-5)^2+(x6-6)^2+(x7-7)^2+(x8-8)^2;

f8 := proc (x1, x2, x3, x4, x5, x6, x7, x8) options operator, arrow; (x1-1)^2+(x2-2)^2+(x3-3)^2+(x4-4)^2+(x5-5)^2+(x6-6)^2+(x7-7)^2+(x8-8)^2 end proc

>    f := proc(x)
  RETURN(f8(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]))
end proc;

f := proc (x) RETURN(f8(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8])) end proc

>    optimize(ndim,f):

`cycle `, 50, ` value `, .8248971166e-1, ` simplex`, vector([-.681030150, -1.883407068, 5.574095385, 3.521643177, 5.524756658, 5.174605289, 5.945266142, 5.880796918])
`cycle `, 50, ` value `, .8248971166e-1, ` simplex`, vector([-.681030150, -1.883407068, 5.574095385, 3.521643177, 5.524756658, 5.174605289, 5.945266142, 5.880796918])

`cycle `, 100, ` value `, .2371060766, ` simplex`, vector([-.2715399544, .7688980699, 3.321094216, 4.471492766, 6.381348715, 6.174064302, 6.520659186, 5.969498752])
`cycle `, 100, ` value `, .2371060766, ` simplex`, vector([-.2715399544, .7688980699, 3.321094216, 4.471492766, 6.381348715, 6.174064302, 6.520659186, 5.969498752])

`cycle `, 150, ` value `, .1882184118, ` simplex`, vector([1.080585007, .799748722, 2.992683047, 4.634644118, 5.610807752, 6.088344564, 6.082447456, 7.125984048])
`cycle `, 150, ` value `, .1882184118, ` simplex`, vector([1.080585007, .799748722, 2.992683047, 4.634644118, 5.610807752, 6.088344564, 6.082447456, 7.125984048])

`cycle `, 200, ` value `, .3160888416e-1, ` simplex`, vector([1.153126147, 1.091784148, 2.584352725, 4.758234129, 4.930866695, 6.382087228, 6.320941242, 7.194899160])
`cycle `, 200, ` value `, .3160888416e-1, ` simplex`, vector([1.153126147, 1.091784148, 2.584352725, 4.758234129, 4.930866695, 6.382087228, 6.320941242, 7.194899160])

`cycle `, 250, ` value `, .8090960878e-1, ` simplex`, vector([1.119799035, 1.201196820, 2.529076413, 4.586245695, 5.264037758, 6.244191754, 6.589814538, 7.146217674])
`cycle `, 250, ` value `, .8090960878e-1, ` simplex`, vector([1.119799035, 1.201196820, 2.529076413, 4.586245695, 5.264037758, 6.244191754, 6.589814538, 7.146217674])

`cycle `, 300, ` value `, .1626264033, ` simplex`, vector([.942011298, 1.476095003, 2.822701897, 4.427619794, 5.370294869, 6.458270590, 6.962047841, 7.435959980])
`cycle `, 300, ` value `, .1626264033, ` simplex`, vector([.942011298, 1.476095003, 2.822701897, 4.427619794, 5.370294869, 6.458270590, 6.962047841, 7.435959980])

`cycle `, 350, ` value `, .4682079514, ` simplex`, vector([1.173391793, 2.017845826, 3.095605962, 3.946250444, 5.104829346, 6.314802342, 7.058154138, 7.853602594])
`cycle `, 350, ` value `, .4682079514, ` simplex`, vector([1.173391793, 2.017845826, 3.095605962, 3.946250444, 5.104829346, 6.314802342, 7.058154138, 7.853602594])

`cycle `, 400, ` value `, .5196436856, ` simplex`, vector([1.093682635, 1.987176556, 2.925286654, 3.858162421, 5.090316582, 6.060549981, 7.048081108, 7.957863104])
`cycle `, 400, ` value `, .5196436856, ` simplex`, vector([1.093682635, 1.987176556, 2.925286654, 3.858162421, 5.090316582, 6.060549981, 7.048081108, 7.957863104])

`cycle `, 450, ` value `, .5161002764, ` simplex`, vector([.970985336, 1.978164345, 2.991251436, 3.974724699, 5.031102745, 5.997048805, 7.041654920, 7.977441250])
`cycle `, 450, ` value `, .5161002764, ` simplex`, vector([.970985336, 1.978164345, 2.991251436, 3.974724699, 5.031102745, 5.997048805, 7.041654920, 7.977441250])

`cycle `, 500, ` value `, .5169699042, ` simplex`, vector([.989586081, 1.997900395, 3.010847193, 3.989778863, 5.021251926, 6.000401845, 7.000203778, 7.998963875])
`cycle `, 500, ` value `, .5169699042, ` simplex`, vector([.989586081, 1.997900395, 3.010847193, 3.989778863, 5.021251926, 6.000401845, 7.000203778, 7.998963875])

`cycle `, 550, ` value `, .7934280684, ` simplex`, vector([1.000378988, 1.999084279, 2.999469481, 4.000456449, 5.000325484, 6.004042881, 7.001112055, 7.99982933])
`cycle `, 550, ` value `, .7934280684, ` simplex`, vector([1.000378988, 1.999084279, 2.999469481, 4.000456449, 5.000325484, 6.004042881, 7.001112055, 7.99982933])

`cycle `, 600, ` value `, .3609470922, ` simplex`, vector([1.000050227, 1.999445782, 3.000881406, 3.999821487, 4.999895242, 6.000858262, 7.000047536, 7.99970228])
`cycle `, 600, ` value `, .3609470922, ` simplex`, vector([1.000050227, 1.999445782, 3.000881406, 3.999821487, 4.999895242, 6.000858262, 7.000047536, 7.99970228])

`cycle `, 650, ` value `, .5829368036e-1, ` simplex`, vector([1.000098802, 1.999734071, 3.000631427, 3.999968076, 4.999659245, 6.000603051, 6.999784211, 8.000020736])
`cycle `, 650, ` value `, .5829368036e-1, ` simplex`, vector([1.000098802, 1.999734071, 3.000631427, 3.999968076, 4.999659245, 6.000603051, 6.999784211, 8.000020736])

`cycle `, 700, ` value `, .6797797538e-1, ` simplex`, vector([.999778984, 1.999928705, 3.000579593, 4.000161564, 4.999753395, 6.000280566, 6.999800988, 7.999847322])
`cycle `, 700, ` value `, .6797797538e-1, ` simplex`, vector([.999778984, 1.999928705, 3.000579593, 4.000161564, 4.999753395, 6.000280566, 6.999800988, 7.999847322])

`cycle `, 750, ` value `, .3043201412, ` simplex`, vector([1.000118983, 2.000159986, 3.000443252, 4.000023510, 5.000012702, 5.999943776, 7.000008072, 7.999794515])
`cycle `, 750, ` value `, .3043201412, ` simplex`, vector([1.000118983, 2.000159986, 3.000443252, 4.000023510, 5.000012702, 5.999943776, 7.000008072, 7.999794515])

`cycle `, 800, ` value `, .7580676700, ` simplex`, vector([1.000059035, 1.999953436, 3.000034941, 4.000034167, 5.000048996, 6.000024170, 6.999942140, 7.999964938])
`cycle `, 800, ` value `, .7580676700, ` simplex`, vector([1.000059035, 1.999953436, 3.000034941, 4.000034167, 5.000048996, 6.000024170, 6.999942140, 7.999964938])

`cycle `, 850, ` value `, .6271057672, ` simplex`, vector([.999992144, 1.999995406, 3.000001889, 4.000023150, 5.000012358, 5.999996408, 6.999996992, 8.000000388])
`cycle `, 850, ` value `, .6271057672, ` simplex`, vector([.999992144, 1.999995406, 3.000001889, 4.000023150, 5.000012358, 5.999996408, 6.999996992, 8.000000388])

`cycle `, 900, ` value `, .2358963292, ` simplex`, vector([.999997563, 2.000004600, 3.000002721, 4.000008495, 5.000003819, 5.999999425, 6.999997974, 7.999992869])
`cycle `, 900, ` value `, .2358963292, ` simplex`, vector([.999997563, 2.000004600, 3.000002721, 4.000008495, 5.000003819, 5.999999425, 6.999997974, 7.999992869])

`cycle `, 950, ` value `, .9232229752, ` simplex`, vector([.999999566, 2.000000426, 3.000000598, 4.000001568, 4.999999415, 5.999998886, 7.000001145, 7.999998590])
`cycle `, 950, ` value `, .9232229752, ` simplex`, vector([.999999566, 2.000000426, 3.000000598, 4.000001568, 4.999999415, 5.999998886, 7.000001145, 7.999998590])

`cycle `, 1000, ` value `, .9789704908, ` simplex`, vector([1.000000113, 2.000000159, 2.999999841, 3.999999982, 4.999999968, 6.000000076, 6.999999921, 8.000000056])
`cycle `, 1000, ` value `, .9789704908, ` simplex`, vector([1.000000113, 2.000000159, 2.999999841, 3.999999982, 4.999999968, 6.000000076, 6.999999921, 8.000000056])

`cycle `, 1050, ` value `, .1055875920, ` simplex`, vector([.999999967, 2.000000062, 2.999999984, 4.000000027, 4.999999971, 6.000000040, 7.000000012, 8.000000032])
`cycle `, 1050, ` value `, .1055875920, ` simplex`, vector([.999999967, 2.000000062, 2.999999984, 4.000000027, 4.999999971, 6.000000040, 7.000000012, 8.000000032])

`cycle `, 1100, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1100, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1150, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1150, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1200, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1200, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1250, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1250, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1300, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1300, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1350, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1350, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1400, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1400, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1450, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1450, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1500, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1500, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1550, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1550, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1600, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1600, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1650, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1650, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1700, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1700, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1750, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1750, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1800, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1800, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1850, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1850, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1900, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1900, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 1950, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 1950, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 2000, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 2000, ` value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

`cycle `, 2001, `value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])
`cycle `, 2001, `value `, .7058428100e-2, ` simplex`, vector([.9999999670, 2.000000056, 2.999999982, 4.000000028, 4.999999969, 6.000000040, 7.000000010, 8.000000030])

4桁くらいの精度が確認できます。
ぜひ最適化アルゴリズムをお楽しみください。

>