Kod źródłowy tych funkcji wygląda następująco:
Procesor* symulowane_wyzarzanie(zadania *z, int il, int m,
Procesor *p)
{
double tp,tk;
int i,j,b,t1,t2;
randomize();
Procesor * p1;
p1 = new Procesor [m+1];
p = p1;
// stan początkowy - przydzielenie wszystkich
tp = 0; //zadań pierwszemu procesorowi - punkt 1.
tk = 1;
for (i=0; i<m; i++) p[i].zeruj_licznik();
b=0;
for (;b==0;)
{
for (i=0; i<il; i++) // ↓ funkcja czy_mozna() sprawdza czy
if ((z[i].czy_mozna()) && (!(z[i].przydzielone)))
{ // wszystkie poprzedniki są już przydzielone
p[0].dodaj(z[i].numer,tp,tk,i);
tp++; // ↑ jeśli nie to dodanie zadania do pierwszego procesora
tk++;
z[i].przydziel();
}
b=1;
for (i=0; i<il; i++) // sprawdza czy wszystkie zadania
if (z[i].przydzielone == false) b=0; // są już przydzielone
}
p1 = p;
double T = 1000; // punkt 2.
double Tk = 1;
double r = 0.99;
int nr;
int pr;
double delta = 0;
int M=0, N=0;
while (T >= Tk) // punkt3
{
nr = random(il); // wylosowanie zadania - punkt 3.1
t1 = int(t_kon_poprz(z[nr],p1,m,il));
t2 = int(t_pocz_nast(z[nr],p1,m,il));
z[nr].przydzielone = false;
for (i=0; i<m; i++)
for (j=0; j<p1[i].licznik; j++)
if (nr == p1[i].ind_zad[j])
{ //↓ Usunięcie z procesora zadania o wylosowanym
p1[i].ind_zad[j] = -1; //numerze (zm. Nr)
p1[i].nr_zad[j] = 0;
p1[i].t_kon[j] = 0;
p1[i].t_pocz[j] = 0;
}
b=0;
while (b==0) //przydzielenie tego zadania do
{ //wylosowanego procesora
pr = random(m);
for (i=t1; i<t2; i++s
if (p1[pr].ind_zad[i] == -1)
{ //↑ jeżeli miejsce w procesorze jest puste
p1[pr].dodaj1(i,z[nr].numer,z[nr].index);
z[nr].przydziel(); // to przydziel mu zadanie
b=1;
break;
}
}
delta = J(p1,m) - J(p,m);
if (delta<=0)
{
p = p1;
M++;
}
else if ( (double(random(10000)/10000)) <=
(exp(double(-delta/T))) ) p = p1;
N++;
if ( (N==10) || (M==1) )
{
M = 0;
N = 0;
T = r * T;
}
}
return p;
}
double J(Procesor *p , int m)
{ //wyznacza czas końca wykonywania wszystkich zadań
double max = p[0].max_czas();
for (int i=0; i<m; i++)
if (max<p[i].max_czas()) max = p[i].max_czas();
return max;
}
//czas końca poprzedników
// czas początku następników
// wylosowanie procesora do którego będzie przydzielone zad.
// Szukanie pierwszego wolnego miejsca w procesorze
↓ punkt 3.2 algorytmu S.A. (funkcja J - patrz poniżej
punkt 3.3
//wyznaczenie końca wszystkich zadań
punkt 3.4
punkt 3.5
punkt 3.6