logo search
УП_САОД_2003

Метод ветвей и границ

Перебор, который осуществляет поиск с возвратом, можно уменьшить, используя идею метода «ветвей и границ». Эта идея состоит в том, что можно не искать точную оценку хода, про который стало известно, что он не может быть лучше, чем один из ходов, рассмотренных раньше. Пусть, например, в процессе перебора стало известно, что f(p1) = -10. Отсюда заключаем, что f(p)  10, и потому не нужно знать точное значение f(p2), если каким-либо образом узнали, что f(p2)  -10 (поскольку отсюда следует, что -f(p2)  10). Итак, если p21 допустимый ход из p2 и f(p21)  10, можно не исследовать другие ходы из p2. Говорят, что ход в позицию p2 «опровергается» (ходом в p1), если у противника в позиции p2 есть ответ, по крайней мере, столь же хороший, как его лучший ответ в позиции p1. Ясно, что если ход можно опровергнуть, можно не искать наилучшее опровержение.

Эти рассуждения приводят к методу «ветвей и границ», гораздо более экономному, чем поиск с возвратом. Определим метод «ветвей и границ» как процедуру с двумя параметрами p и bound, вычисляющую f’(pbound). Цель алгоритма – удовлетворить следующим условиям:

f’(pbound) = f(p), если f(p) < bound,

f’(pbound) > bound, если f(p)  bound.

Идею метода ветвей и границ реализует следующий алгоритм.

function B&B(p: position, bound: integer): integer;

{оценивает и возвращает выигрыш F’(p) для позиции p}

label done;

var

m,i,t,d: integer;

begin

Определить позиции p1,...,pd, подчиненные p;

if d = 0 then B&B := f(p) else begin

m := -;

for i:= 1 to d do begin

t := - B&B(pi, -m);

if t > m then m := t;

if m >= bound then goto done;

end;

done: B&B := m;

end;

end;