русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

ПОИСК ПУТИ МИНИМАЛЬНОЙ СТОИМОСТИ ОТ A ДО Z


Дата добавления: 2014-09-29; просмотров: 594; Нарушение авторских прав


Вспомним задачу из главы 8 о поиске пути минимальной стоимости. Пути мы получали за счет возвратов, а глобальной переменной, чтобы запоминать текущий минимум, у нас не было.

Для хранения текущего минимального пути заведем предикат динамической БД min_way, первым аргументом которого будет текущий минимальный путь, вторым — его стоимость.

database

dmin_way(list,integer)

При генерации очередного пути воспользуемся следующим методом: прежде, чем добавлять к пути новое ребро, проверим, не станет ли его стоимость больше либо равна стоимости текущего минимального пути. Если да, то этот путь не нужно генерировать до конца (он уже не будет меньше текущего минимума), а следует переходить к генерации следующего пути.

Поэтому рекурсивное правило процедуры way1 изменится:

way1(Z, [X|Was],SW, Sol,S):-

sosed1(X,Y,St),

not(member(Y,Was)),

SW1=SW+St,

dmin_way(_,Stoim),

% сравнеие с минимумом после добавления ребра

Stoim>Sw1,

way1(Z,[Y,X|Was],SW1,Sol,S).

Если проверка Stoim>Sw1 не проходит, то происходит возврат к sosed1, которая находит следующую вершину — соседку для продолжения пути.

Перед началом генерации путей запишем в базу начальное значение минимума:

assert(dmin_way([],1000))

Процедура поиска минимального пути будет иметь следующий вид:

find_min(Z, A):-

% перебор всех путей

way1(Z, [A], 0, Sol, MinS),

% изменение текущего min пути

change_base(Sol,MinS),

fail.

find_min(_, _):-

dmin_way(Sol,St),

% печать окончательного минимума

write(Sol),nl,

write(St),nl.

Все правила изменения текущего минимума спрятаны на уровень ниже, в процедуре change_base:

change_base(Sol,MinS):-

dmin_way(_,St),

St > MinS,

retract(dmin_way(_,_)),

assert(dmin_way(Sol,MinS)),!.

В процедуру передается очередной путь Sol и его стоимость MinS, затем стоимость MinS сравнивается с текущим минимумом St, и, в случае успеха проверки, предикат dmin_way переписывается.



/* Программа 10.1 «Поиск пути от A до Z */

/* минимальной стоимости». Назначение: */

/* демонстрация работы с динамической БД */

 

domains

uzl=integer

list=uzl*

list1=integer*

 

database

dmin_way(list,integer)

 

predicates

 

graph1(list,list1)

show_min

find_min(uzl,uzl)

way1(uzl,list,integer,list,integer)

change_base(list,integer)

sosed1(uzl,uzl,integer)

member1(uzl,list,list1,integer)

member(uzl,list)

 

goal

show_min. % показать минимальный путь

 

clauses

 

% 1-й список — список соседок,

% 2-й список — стоимостей соответствующих ребер.

graph1([1,2,3,4],[3,0,2]).

graph1([2,1,3,5],[3,4,5]).

graph1([3,1,2,4],[0,4,0]).

graph1([4,1,3,5],[2,0,1]).

graph1([5,2,4],[5,1]).

 

show_min:-

write("Начало пути "), readint(A),

write("Конец пути "), readint(Z),

assert(dmin_way([],1000)),

find_min(Z,A),

save("minway.dba").

 

find_min(Z, A):-

% перебор всех путей

way1(Z, [A], 0, Sol, MinS),

% изменение текущего min пути

change_base(Sol,MinS),

fail.

find_min(_, _):-

dmin_way(Sol,St),

% печать минимума

write(Sol),nl,

write(St),nl.

 

way1(Z, [Z|Was],S, [Z|Was],S).

way1(Z, [X|Was],SW, Sol,S):-

sosed1(X,Y,St),

not(member(Y,Was)),

SW1=SW+St,

dmin_way(_,Stoim),

Stoim>Sw1,

way1(Z, [Y,X|Was],SW1, Sol,S).

 

change_base(Sol,MinS):-

dmin_way(_,St),

St > MinS,

retract(dmin_way(_,_)),

assert(dmin_way(Sol,MinS)),!.

 

sosed1(X, Y, St):-

graph1([X|T], LS),

member1(Y, T, LS, St).

 

member1(H,[H|_],[S|_],S).

member1(X,[_|T],[_|ST],S):-

member1(X,T,ST,S).

 

member(H,[H|_]):-!.

member(X,[_|T]):-

member(X,T).

/* конец программы */

Упражнение 10.2.

Найти на нагруженном графе гамильтонов цикл минимальной стоимости с использованием глобальных переменных.



<== предыдущая лекция | следующая лекция ==>
ПОДСЧЕТ ЧЛЕНОВ ПАРТОРГАНИЗАЦИИ | библиографический список


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.809 сек.