Понимаю, что вопрос, возможно, глупый, столкнулся с алгоритмом отжига, немного суть понял, но не до конца смог разобраться в алгоритме, помогите, пожалуйста, вывести кол-во комбинаций...
Program Otzig;
const N = 20; (*размер доски и число ферзей*)
Tn = 30.0; (*начальная температура*)
Tk = 0.5; (*конечная температура*)
Alfa = 0.98; (*скорость охлаждения*)
ST = 100; (*число итераций при смене T*)
type TMember = record (*решение*)
Plan :array[1..N] of word; (*кодировка*)
Energy :word; (*энергия*)
end;
var Current :TMember; (*текущее решение*)
Working :TMember; (*рабочее решение*)
Best :TMember; (*лучшее решение*)
T :double; (*температура*)
Delta :double; (*разница энергий*)
P :double; (*вероятность допуска*)
fNew :boolean; (*флаг нового решения*)
fBest :boolean; (*флаг лучшего решения*)
Time :longint; (*этап поиска*)
Step :longint; (*шаг на этапе поиска*)
Accepted :longint; (*число новых решений*)
procedure Swap(var M:TMember); (*модификация решения*)
var x,y,v :word;
begin
x:=Random(N)+1;
Repeat
y:=Random(N)+1;
Until x<>y;
v:=M.Plan[x]; M.Plan[x]:=M.Plan[y]; M.Plan[y]:=v;
end;
12
procedure New(var M:TMember); (*инициализация решения*)
var i:word;
begin
for i:=1 to N do M.Plan[i]:=i;
for i:=1 to N do Swap(M);
end;
procedure CalcEnergy(var M:TMember); (*расчет энергии*)
const dx:array[1..4] of integer = (-1,1,-1,1);
dy:array[1..4] of integer = (-1,1,1,-1);
var j,x,tx,ty :word;
error :word;
begin
error:=0;
for x:=1 to N do begin
for j:=1 to 4 do begin
tx:=x+dx[j]; ty:=M.Plan[x]+dy[j];
While (tx>0)and(tx<=N)and
(ty>0)and(ty<=N) do begin
if M.Plan[tx]=ty then inc(error);
tx:=tx+dx[j]; ty:=ty+dy[j];
end;
end;
end;
M.Energy:=error;
end;
procedure Copy(var MD,MS:TMember); (*копирование решения*)
var i:word;
begin
for i:=1 to N do MD.Plan[i]:=MS.Plan[i];
MD.Energy:=MS.Energy;
end;
procedure Show(M:TMember); (*отображение на экране*)
var x,y :word;
begin
writeln('Решение:');
for y:=1 to N do begin
for x:=1 to N do
if M.Plan[x]=y then write('Q')
else write('.');
writeln;
end;
writeln;
end;
13
begin
Randomize; T:=Tn; fBest:=false;
Time:=0; Best.Energy:=100;
New(Current);
CalcEnergy(Current);
Copy(Working,Current);
While T>Tk do begin
Accepted:=0;
for Step:=0 to ST do begin
fNew:=false;
Swap(Working);
CalcEnergy(Working);
if Working.Energy<=Current.Energy then
fNew:=true
else begin
Delta:=Working.Energy-Current.Energy;
P:=exp(-Delta/T);
if P>random then begin
Accepted:=Accepted+1;
fNew:=true;
end;
end;
if fNew then begin
fNew:=false; Copy(Current,Working);
if Current.Energy<Best.Energy then begin
Copy(Best,Current); fBest:=true;
end;
end else begin
Copy(Working,Current);
end;
end;
writeln('Temp=',T:6:2,' Energy=',best.Energy:4);
T:=T*Alfa;
Time:=Time+1;
end;
if fBest then Show(Best);
end.