Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по программированию на языке программирования Си..pdf
Скачиваний:
20
Добавлен:
05.02.2023
Размер:
1.39 Mб
Скачать

94

8 ДЕРЕВЬЯ И/ИЛИ

8.1 Основные понятия

Деревом И/ИЛИ является дерево, которое имеет два типа узлов (И­ узел и ИЛИ­узел). Впервые понятие И/ИЛИ дерева появилось в работе Слайгла [ ]. ИЛИ­узел означает, что задача может быть решена, если решать задачу 1, или задачу 2, или задачу 3 (рис. 8.1).

Рис. 8.1 — Узел ИЛИ

И­узел означает, что задачу можно разложить на подзадачи и, решив все задачи из этого списка, получить решение исходной задачи (рис. 8.2).

95

Рис. 8.2 — Узел И

Вариантом дерева И/ИЛИ назовем поддерево, которое получается из заданного путем отсечения выходных дуг кроме одной, у всех ИЛИ­узлов. Вариант в терминах решения задачи задает вариант решения задачи.

Деревья И/ИЛИ получили распространение в исследованиях по ис­ кусственному интеллекту [44–47]. Ниже предлагаются эффективные алго­ ритмы для перечисления вариантов в дереве И/ИЛИ [14].

8.2 Алгоритм подсчета вариантов

Рассмотрим алгоритм подсчета вариантов решений в дереве И/ИЛИ. Для этого запишем следующую рекурсивную функцию:

 

i

äëÿ

ÈËÈ óçëà;

 

n

(sz ),

 

i 1

 

 

 

 

 

n

 

 

 

 

 

(z) ¸ (siz ),

äëÿ

È óçëà;

(2.10)

i 1

 

 

 

 

 

1,

 

 

äëÿ

листа,

 

 

 

 

 

 

 

где z — рассматриваемый узел дерева; { siz } — множество сыновей узла z;

n — количество сыновей.

Подсчитав значение функции для корня дерева, можно получить об­ щее число вариантов подстановок, имеющихся в данном дереве. При этом

 

6

1

В а р и а н т ы

3

2

2

3

 

1

1

1

1

1

 

4

5

 

6

7

8

 

 

 

 

 

 

И

Л И ­ у з е л

 

1

 

1

 

И

­ у з е л

 

9

1

0

 

 

 

 

 

96

будет подсчитано количество вариантов подстановок для каждого узла всего дерева. Пример подсчета вариантов показан на рис. 8.3.

Рис. 8.3 — Пример подсчета вариантов в И/ИЛИ дереве

8.3 Алгоритм нумерации вариантов

Далее, используя значения функции для каждого узла, можно по­ строить алгоритм нумерации вариантов. Этот алгоритм по номеру из данно­ го дерева получает необходимый вариант подстановки. Предварительно за­ дадим две функции нумерации, которые по номеру варианта для рассмат­ риваемого узла вычисляют номера вариантов для сыновей. Для И­узла бу­ дет следующая функция:

 

 

 

i

 

 

 

 

s

z

˜(Lz /

(szj )) mod (siz ),

i 1;

Li

(L ) ˜

j 1

 

 

 

(2.11)

 

 

z

mod

z

),

i 1,

 

 

 

˜L

(si

 

где z — рассматриваемый узел дерева; { siz } — множество сыновей узла z;

(SiZ ) — количество вариантов в поддереве с узлом SiZ .

Примечание. При выполнении операции деления используются алго­ ритмы целочисленной арифметики.

Рассмотрим пример использования этой функции. Пусть задан

И­узел z, у которого имеется три сына

(S1 , S2 , S3 ) , и известно количество

вариантов (z) 6 ,

(S1) 1,

(S2 ) 3

, (S3 ) 2 .

 

Тогда можно записать следующую таблицу значений номеров вариан­

тов для сыновей в зависимости от номера варианта узла z:

 

 

 

 

 

 

 

 

 

Lz

 

L(S1 )

 

 

L(S2 )

 

L(S3 )

0

 

0

 

 

0

 

0

1

 

0

 

 

1

 

0

2

 

0

 

 

2

 

0

3

 

0

 

 

0

 

1

4

 

0

 

 

1

 

1

5

 

0

 

 

2

 

1

97

Для ИЛИ­узла необходимо определить не только номер варианта, но и номер соответствующего сына. Для этого запишем следующую функцию:

 

 

Lz

ï ðè Lz (sz ),

k 0;

 

 

s

z

 

 

 

1

 

 

 

 

 

 

 

 

(2.12)

Lk 1

(L )

z

k

z

s

z

 

 

min(L

(s j ))

ï ðè Lk 1

(L ) 0,

 

 

 

k

 

j 1

 

 

 

 

где z — рассматриваемый узел дерева; { siz } — множество сыновей узла z;

(SiZ ) — количество вариантов в поддереве с узлом SiZ . Рассмотрим пример. Пусть задан ИЛИ­узел с 3 сыновьями и (z) 9

, (S1) 3,

(S2 ) 2 , (S3 ) 4 , (z) (S1 ) (S2 ) (S3 ) .

 

Тогда можно записать следующую таблицу значений для номера сына

и номера варианта в зависимости от значения варианта узла z:

 

 

 

 

 

 

 

Lz

 

K

Lk 1

 

Сын

0

 

0

0

 

S1

1

 

0

1

 

S1

2

 

0

2

 

S1

3

 

1

0

 

S2

4

 

1

1

 

S2

5

 

2

0

 

S3

6

 

2

1

 

S3

7

 

2

2

 

S3

8

 

2

3

 

S3

Алгоритм определения варианта подстановки по заданному номеру будет следующий.

1.Первоначально производится подсчет количества вариантов для каждого узла дерева.

2.В вариант записывается корень дерева, и он становится текущим

узлом.

3.Определяется тип текущего узла. Если это И­узел, то переход на шаг 4, иначе переход на шаг 5.

4.Все сыновья рассматриваемого узла записываются в данный вари­ ант подстановки и для них соответственно с функцией для И­узлов опреде­ ляются номера вариантов для соответствующих поддеревьев (см. 2.11).