Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Советы по планированию воздушного путешествия, Реализовать на Visual Prolog 5.2 
:(
    Опции темы
Евгенияяяя
  Дата 5.12.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



Написать на языке Visual Prolog 5.2 программу, которая даст советы по планированию воздушного путешествия. Эта программа должна отвечать на вопросы, наподобие приведенных ниже: 
1) По каким дням недели есть прямые рейсы из Лондона в Любляну?
2) Как в четверг можно добраться из Любляны в Эдинбург?
3) Мне нужно посетить Милан, Любляну и Цюрих; вылетать нужно из Лондона в пятницу. В какой последовательности мне следует посещать эти города, чтобы ни разу на протяжении поездки не пришлось совершать более одного перелета в день.
Есть решение задачи чисто теоретически, а запрограммировать я не могу,помогите пожалуйста это всё реализовать:

Решение:
Центральной частью программы будет база  данных, содержащая информацию о рейсах. Эта информация будет представлена в виде трехаргументного отношения:
        расписание( Пункт1, Пункт2, Список_рейсов)
где  Список_рейсов  -  это список, состоящий из структурированных объектов вида:
        Время_отправления / Время_прибытия / Номер_рейса
                                              / Список_дней_вылета
Список_дней_вылета - это либо список дней недели, либо атом "ежедневно". Одно из предложений, входящих в расписание могло бы быть, например, таким:
        расписание( лондон, эдинбург,
                        [ 9:40 / 10:50 / bа4733/ ежедневно,
                        19:40 / 20:50 / bа4833 / [пн, вт, ср, чт, пт, сб]] ).
Время представлено в виде структурированных объектов, состоящих из двух компонент - часов и минут, объединенных оператором ":".
Главная задача состоит в отыскании точных маршрутов между двумя заданными городами в определенные дни недели. Ее решение мы будем программировать в виде четырехаргументного отношения:
        маршрут( Пункт1, Пункт2, День, Маршрут)
Здесь Маршрут - это последовательность перелетов, удовлетворяющих следующим критериям:
(1)        начальная точка маршрута находится в Пункт1;
(2)        конечная точка - в Пункт2;
(3)        все перелеты совершаются в один и тот же день недели - День;
(4)        все перелеты, входящие в Маршрут, содержатся в определении отношения расписание;
(5)        остается достаточно времени для пересадки с рейса на рейс.
Маршрут представляется в виде списка структурированных объектов вида
        Откуда - Куда : Номер_рейса : Время_отправления
Мы еще будем пользоваться следующими вспомогательными предикатами:
(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)        Маршрут с пересадками: маршрут между пунктами Р1 и Р2 состоит из первого перелета из P1 в некоторый промежуточный пункт Р3 и маршрута между Р3 и Р2. Кроме того, между окончанием первого перелета и отправлением во второй необходимо оставить достаточно времени для пересадки.
        маршрут( Р1, Р2, День, [Р1-Р3 : Nр1 : Отпр1 | Маршрут]) :-
              маршрут( Р3, Р2, День, Маршрут ),
              рейс( Р1, Р3, День, Npl, Oтпpl, Приб1),
              вр_отпр( Маршрут, Отпр2),
              пересадка( Приб1, Отпр2).
Вспомогательные отношения рейс, пересадка и вр_отпр запрограммировать легко; мы включили их в полный текст программы планировщика поездки на рис. 4.5. Там же приводится и пример базы данных расписания.
Наш планировщик исключительно прост и может рассматривать пути, очевидно ведущие в никуда. Тем не менее его оказывается вполне достаточно, если база данных о рейсах самолетов невелика. Для больших баз данных потребовалось бы разработать более интеллектуальный планировщик, который мог бы справиться с большим количеством путей, участвующих в перебора при нахождении нужного пути.
Вот некоторые примеры вопросов к планировщику: 
•    По каким дням недели существуют прямые рейсы из Лондона в Любляну?

        ?- рейс( лондон, любляна, День, _, _, _ ).

        День = пт;
        День = сб;

        no                 (нет)
% ПЛАНИРОВЩИК ВОЗДУШНЫХ МАРШРУТОВ
:- ор( 50, xfy, smile.
рейс( Пункт1, Пункт2, День, Np, ВрОтпр, ВрПриб) :-
    расписание( Пункт1, Пункт2, СписРейсов),
    принадлежит( ВрОтпр / ВрПриб / Nр / СписДней, СписРейсов),
    день_выл( День, СписДней).
принадлежит( X, [X | L] ).
принадлежит( X, [Y | L] ) :-
      принадлежит( X, L ).
день_выл( День, СписДней) :-
      принадлежит( День, СписДней).
день_выл( День, ежедневно) :-
      принадлежит( День, [пн, вт, ср, чт, пт, сб, вс] ).
маршрут( P1, P2, День, [Р1-Р2 : Np : ВрОтпр] ) :-
                                                % прямой рейс
      рейс( P1, P2, День, Np, ВрОтпр, _ ).
маршрут( Р1, Р2, День, [Pl-P3 : Np1 : Oтпp1 | Маршрут]) :-
                                                % маршрут с пересадками
      маршрут( Р3, P2, День, Маршрут ),
      рейс( Р1, Р3, День, Npl, Oтпp1, Приб1),
      вр_отпр( Маршрут, Отпр2),
      пересадка( Приб1, Отпр2).
вр_отпр( [Р1-Р2 : Np : Отпр | _ ], Отпр).
пересадка( Часы1 : Минуты1, Часы2 : Минуты2) :-
      60 * (Часы2-Часы1) + Минуты2 - Минуты1 >= 40

% БАЗА ДАННЫХ О РЕЙСАХ САМОЛЕТОВ
расписание( эдинбург, лондон,
      [ 9:40 / 10:50 / bа4733 / ежедневно,
      13:40 / 14:50 / ba4773 / ежедневно,
      19:40 / 20:50 / bа4833 / [пн, вт, ср, чт, пт, вс] ] ).
расписание( лондон, эдинбург,
      [ 9:40 / 10:50 / bа4732 / ежедневно,
      11:40 / 12:50 / bа4752 / ежедневно,
      18:40 / 19:50 / bа4822 / [пн, вт, ср, чт, пт] ] ),
расписание( лондон, любляна,
      [13:20 / 16:20 / ju201 / [пт],
       13:20 / 16:20 / ju213 / [вс] ] ).
расписание( лондон, цюрих,
      [ 9:10 / 11:45 / bа614 / ежедневно,
      14:45 / 17:20 / sr805 / ежедневно ] ).
расписание( лондон, милан,
      [ 8:30 / 11:20 / bа510 / ежедневно,
      11:00 / 13:50 / az459 / ежедневно ] ).
расписание( любляна, цюрих,
      [11:30 / 12:40 / ju322 / [вт,чт] ] ).
расписание( любляна, лондон,
      [11:10 / 12:20 / yu200 / [пт],
       11:25 / 12:20 / yu212 / [вс] ] ).
расписание( милан, лондон,
      [ 9:10 / 10:00 / az458 / ежедневно,
      12:20 / 13:10 / bа511 / ежедневно ] ).
расписание( милан, цюрих,
      [ 9:25 / 10:15 / sr621 / ежедневно,
      12:45 / 13:35 / sr623 / ежедневно ] ).
расписание( цюрих, любляна,
      [13:30 / 14:40 / yu323 / [вт, чт] ] ).
расписание( цюрих, лондон,
      9:00 / 9:40 / bа613 /
      [ пн, вт, ср, чт, пт, сб],
      16:10 / 16:55 / sr806 / [пн, вт, ср, чт, пт, сб] ] ).
расписание( цюрих, милан,
      [ 7:55 / 8:45 / sr620 / ежедневно ] ).
Рис. 4. 5.  Планировщик воздушных маршрутов и база данных о рейсах самолетов.
•    Как мне добраться из Любляны в Эдинбург в четверг?

        ?- маршрут( любляна, эдинбург, чт, R).

        R = [любляна-цюрих : уu322 : 11:30, цюрих-лондон:
        sr806 : 16:10,
        лондон-эдинбург : bа4822 : 18:40 ]
•    Как мне посетить Милан, Любляну и Цюрих, вылетев из Лондона во вторник и вернувшись в него в пятницу, совершая в день не более одного перелета? Этот вопрос сложнее, чем предыдущие. Его можно сформулировать, использовав отношение перестановка, запрограммированное в гл. 3. Мы попросим найти такую перестановку городов Милан, Любляна и Цюрих, чтобы соответствующие перелеты можно было осуществить в несколько последовательных дней недели:

        ?- перестановка( [милан, любляна, цюрих],
                                        [Город1, Город2, Город3] ),

        рейс( лондон, Город1, вт, Np1, Oтпp1, Пpиб1),
        peйc( Город1, Город2, ср, Np2, Отпр2, Приб2),
        рейс( Город2, Город3, чт, Np3, Отпp3, Приб3),
        рейс( Город3, лондон, пт, Np4, Отпр4, Приб4).

        Город1 = милан
        Город2 = цюрих
        Город3 = любляна
        
        Npl = ba510
        Отпр1 = 8:30
        Приб1 = 11:20
        
        Np2 =sr621
        Отпр2 = 9:25
        Приб2 = 10:15
        
        Np3 = yu323
        Отпр3 = 13:30
        Приб3 = 14:40

        Np4 = yu200
        Отпр4 = 11:10
        Приб4 = 12:20



Это сообщение отредактировал(а) Евгенияяяя - 5.12.2011, 17:19
PM MAIL   Вверх
Евгенияяяя
Дата 5.12.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 16.12.2009

Репутация: нет
Всего: нет



Скажите пожалуйста,что значит fail в этой строке:
write("   Time:",Time,"   Day:",Day,"   Race:", A,"->",B),nl,fail.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.