Программирование на языке Пролог для искусственного интеллекта | страница 70
>Откуда - Куда : Номер_рейса : Время_отправления
Мы еще будем пользоваться следующими вспомогательными предикатами:
(1) >рейс( Пункт1, Пункт2, День, N_рейса, Вр_отпр, Вр_приб)
Здесь сказано, что существует рейс >N_рейса
между >Пункт1
и >Пункт2
в день недели >День
с указанными временами отправления и прибытия.
(2) >вр_отпр( Маршрут, Время)
>Время
— это время отправления по маршруту >Маршрут
.
(3) >пересадка( Время1, Время2)
Между >Время1
и >Время2
должен существовать промежуток не менее 40 минут для пересадки с одного рейса на другой.
Задача нахождения маршрута напоминает моделирование недетерминированного автомата из предыдущего раздела:
• Состояния автомата соответствуют городам.
• Переход из состояния в состояние соответствует перелету из одного города в другой.
• Отношение >переход
автомата соответствует отношению >расписание
.
• Модель автомата находит путь в графе переходов между исходным и конечным состояниями; планировщик поездки находит маршрут между начальным н конечным пунктами поездки.
Неудивительно поэтому, что отношение >маршрут
можно определить аналогично отношению >допускает
, с той разницей, что теперь нет "спонтанных переходов". Существуют два случая:
(1) Прямой рейс: если существует прямой рейс между пунктами >Пункт1
и >Пункт2
, то весь маршрут состоит только из одного перелета:
>маршрут( Пункт1, Пункт2, День, [Пункт1-Пункт2 : Nр : Отпр]) :-
> рейс( Пункт1, Пункт2, День, Np, Отпр, Приб).
(2) Маршрут с пересадками: маршрут между пунктами >P1
и >Р2
состоит из первого перелета из >P1
в некоторый промежуточный пункт >Р3
и маршрута между >Р3
и >Р2
. Кроме того, между окончанием первого перелета и отправлением во второй необходимо оставить достаточно времени для пересадки.
>маршрут( P1, Р2, День, [P1-Р3 : Nр1 : Отпр1 | Маршрут]) :-
> маршрут( Р3, Р2, День, Маршрут ),
> рейс( P1, Р3, День, Npl, Oтпpl, Приб1),
> вр_отпр( Маршрут, Отпр2),
> пересадка( Приб1, Отпр2).
Вспомогательные отношения >рейс
, >пересадка
и >вр_отпр
запрограммировать легко; мы включили их в полный текст программы планировщика поездки на рис. 4.5. Там же приводится и пример базы данных расписания.
Наш планировщик исключительно прост и может рассматривать пути, очевидно ведущие в никуда. Тем не менее его оказывается вполне достаточно, если база данных о рейсах самолетов невелика. Для больших баз данных потребовалось бы разработать более интеллектуальный планировщик, который мог бы справиться с большим количеством путей, участвующих в перебора при нахождении нужного пути.