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]