Об одном наблюдении.
Базовое распределение:
-количество клеток, через которые проходят
линий.
Базовому распределению соответствует оценка схемы
min.
Ищется распределение, которое должно иметь оценку
min+top.
При росте
top количество таких распределений быстро растет.
Я попробовал рассматривать только часть подобных распределений, а именно, только такие, которым соответствует не более одного обмена между соседними уровнями
u и
(u-1).
Запуск перебора:
set_top(top,1)Код:
procedure set_top(x,y:integer);
var k,u,v,i,j,b:integer;
begin
if x=0 then begin cop(m0,m);run;exit;end;
if y>4 then exit;
if opt then begin u:=y-1;v:=y end else begin u:=y;v:=y-1 end;
set_top(x,y+1);
for k:=1 to x do
for i:=0 to a[u]-1 do for j:=0 to a[v]-1 do
if (m0[v,j]-m0[u,i])=k then begin
b:=m0[v,j];m0[v,j]:=m0[u,i];m0[u,i]:=b;
set_top(x-k,y+1);
b:=m0[v,j];m0[v,j]:=m0[u,i];m0[u,i]:=b;
end;
end;
здесь:
m,m0 - рабочее и базовое распределения,
m[
u-уровень,
i-индекс от
0 до
a[u]-1].
cop(m0,m) - копирование распределения
m0 в распределение
m, которое затем обрабатывается процедурой поиска решения
run.
При поиске максимального решения используется та же процедура, только меняется базовое распределение
и задается значение opt=true. Как видно из текста, рекурсия начинается с уровня 1 до 4. Я пробовал и обратное направление с уровня 4 до 1, но результат был печальным. При малых
top можно просмотреть все распределения и, поэтому, разницы нет. При больших
top число распределений может превышать несколько тысяч. Так вот, при рекурсии от 1 до 4, как показал эксперимент, хорошие распределения выдаются в начале перебора.
Дело за малым
- нужна хорошая процедура поиска решений
run.