[C++] Algorytm działa nieoptymalnie

Witam,

napisałem algorytm na podstawie pseudokodu (jest to algorytm wyżarzania), który jednak działa nieoptymalnie (zwracane kryterium jest dużo większe niż optymalne rozwiązanie). Może ktoś będzie miał pomysł, skąd to może się brać:

Pseudokod:

i = 0

wybierz losowo rozwiązanie A

while(T > Tmin)

{

stwórz rozwiązanie B przez zamianę dwóch losowych elementów w A

    if(Kryterium(B) < Kryterium(A)) A = B

    else if(random(0,1) < P()) A = B

    T = G()

    i = i+1

}

Mój kod:

permutuj(); // wyznaczenie rozwiazania poczatkowego, tablica perm


   kopiuj(perm, perm_dodatkowa); // wyznaczenie rozwiazania perm' takiego samego jak w perm


   inicjalizacja(licz(perm, A)); // incjalizacja s, Tk, T0 i alfa. T0 obliczane na podstawie dlugosci drogi dla pierwszego losowania


   while ( T0 > Tk)

   {

      for (int z=0; z 
      {


         k0=rand()%(0+(n-1)+1); // losuje liczbę w przedziale od 1 do n-1

         k1=rand()%(0+(n-1)+1); // losuje liczbę w przedziale od 1 do n-1

         zamien_pozycje(k0, k1, perm_dodatkowa); //zmienia pozycje w perm' na losowych pozycjach


         if (licz(perm_dodatkowa, A) <= licz(perm, A)) // jesli nowa permutacja lepsza uznaj ją za nowe rozwiązanie

         {

            zamien_pozycje(k0, k1, perm); // mniej operacji trzeba wykonac zamieniając te same pozycje co w perm' niz kopiujac cala tablice

         }

         else if( ((rand()%1001)/1000) < (exp(-(( licz(perm_dodatkowa, A) - licz(perm, A ))/T0)))) // e ^ ( - (nowe rozwiazanie - stare rozwiazanie) / T )

         {

            zamien_pozycje(k0, k1, perm);

         }

      }


      T0 = alfa * T0;

   }


      wypisz_permutacje(perm);

      p = licz(perm, A);

      cout << "kryterium wynosi " << p << endl;[/code]

Z rzeczy powierzchownych:

  1. (rand()%1001)/1000 - wszystkie wartości są całkowitoliczbowe, więc wynik będzie 0 albo 1. (rand()%1001)/1000.0f będzie lepsze

  2. (rand()%(n-1)) + 1; // losuje liczbę w przedziale od 1 do n-1