Rešitev: Kromosomi (simulirano ohlajanje) (Mathematica)

Iz MaFiRaWiki

Naloga: Kromosomi (simulirano ohlajanje)


Najprej definiramo funkciji one[] in f[].

 one[x_] := StringCount[x, "1"];
 f[x_] := Abs[11 one[x] - 150];

Sosed 30-mestnega kromosoma je kromosom (prav tako 30-mestni), ki ima spremenjeno vrednost na enem (naključno izbranem) mestu.

 sosed[x_String] := Module[{p, b},
     p = Random[Integer, {1, StringLength[x]}];
     If[StringTake[x, {p, p}] == "1",
       b = "0",
       b = "1"
     ];
     StringReplacePart[x, b, {p, p}]
     ]

Za začetni kromosom bi lahko izbrali katerega koli. Ker se ne moremo odločiti, izberemo naključni kromosom dolžine 30.

 zacetni := StringJoin[Table[ToString[Random[Integer, {0, 1}]], {30}]]

Sestavimo funkcijo, ki reši problem Kromosoma. Poskrbimo tudi za primeren izpis rešitve.

 maksSO[n_, m_] := Module[{v, t0, t, i, j, s},
     v = zacetni;
     t0 = 1;
     t = t0;
     For[i = 1, i < n,
       For[j = 1, j < m,
         s = sosed[v];
         If[f[s] > f[v],
           v = s,
           If[Random[] < Exp[(f[v] - f[s])/t],
             v = s
           ];
         j++
       ];
       t = t - 1/n t0;
       i++
       ];
     ];
     Print["Maksimum funkcije je ", f[v], ", dosezen pa je pri izrazu ", v]
     ]

Delovanje preverimo na različnih primerih:

 In[1]:= maksSO[5,8]
 Out[1]:= Maksimum funkcije je 62, dosezen pa je pri izrazu 000001001001100100000100001010

 In[2]:= maksSO[50,80]
 Out[2]:= Maksimum funkcije je 158, dosezen pa je pri izrazu 111111111111111100111111111111

 In[3]:= maksSO[500,800]
 Out[3]:= Maksimum funkcije je 180, dosezen pa je pri izrazu 111111111111111111111111111111

 In[4]:= maksSO[5000,8000]
 Out[4]:= Maksimum funkcije je 180, dosezen pa je pri izrazu 111111111111111111111111111111
Osebna orodja