Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая.doc
Скачиваний:
10
Добавлен:
01.05.2014
Размер:
148.99 Кб
Скачать

Федеральное агентство по образованию РФ

Санкт-Петербургский государственный электротехнический университет

Кафедра МО ЭВМ

Пояснительная записка к курсовой работе

по дисциплине логическое программирование

Преподаватель: Беляев С.А.

Студенты гр. 4351: Мачихин А.

Кузьменко А.

Санкт-Петербург

2007

  1. Постановка задачи (вариант 8).

Раскрашивание графа. Дан граф. Необходимо определить минимальное количество цветов, в которое он может быть раскрашен, при этом соседние вершины не должны быть одного цвета. Размерность задачи не менее 15.

Дополнительные требования:

- Исходные данные (ИД) читаются из внешнего файла. Несколько вариантов ИД.

- Алгоритм решения должен быть «умнее» полного перебора.

2. Описание алгоритма решения.

  1. Вычислить степени вершин (количество ребер). Положить K=1.

  2. Просмотреть вершины в порядке невозрастания степеней и окрасить первую неокрашенную вершину в цвет № K.

  3. Просмотреть вершины в порядке невозрастания степеней и окрасить в цвет №К все вершины, которые не смежны вершинам, уже окрашенным в цвет №К.

  4. Если все вершины окрашены, то К - искомое хроматическое число. Иначе К=К+1 и переход к пункту 2.

Пример решения.

Возможно сформулировать вышеописанный алгоритм с использованием списков:

  1. Составить список 1 вершин графа. N=0 (N-хроматическое число графа). Список 2 пуст.

  2. Упорядочить список 1 вершин графа по неубыванию их степеней.

  3. Удалить первый элемент списка 1 – вершину а.

  4. Переместить все вершины, связанные с вершиной а из списка 1 в список 2.

  5. Если список 1 не пуст – переход на пункт 3, иначе список 1 = список 2, N=N+1, переход на шаг 1.

При этом непосредственно раскраски графа не происходит, так как по поставленной задаче необходимо только определить хроматическое число графа (минимальное количество цветов). Для упорядочивания списка 1 используем алгоритм сортировки вставками.

3. Формат исходных данных.

Существует много способов представления и задания графа, но так как алгоритм был сформулирован в терминах списков, остановимся на представлении графа в виде списков связности вершин. Исходные данные могут задаваться файлом (например graph1.pl). В нем задан граф из примера выше:

list(1,[8]).

list(2,[8]).

list(3,[8]).

list(4,[8,10]).

list(5,[]).

list(6,[8]).

list(7,[8]).

list(8,[1,2,3,4,6,7,9,10]).

list(9,[6,8]).

list(10,[4,8]).

Ограничения на входные данные: граф должен быть антирефлексивным, то есть не должно быть дуг от вершины к ней самой. В списке связных вершин вершины a, например, не должно быть самой вершины а.

  1. Текст программы.

npaints([],0).

npaints(T,N):-order(T,T1),onepaint(T1,[],T2),npaints(T2,N1),N is N1+1.

onepaint([],L,L).

onepaint([X|T],T1,T2):-delcon(T,X,T1,R,R1),onepaint(R,R1,T2).

delcon(T,X,T1,R,R1):-list(X,S),del(T,S,R,[],L),conc(T1,L,R1).

del([],_,[],L,L).

del([X|S],T,R,R1,L):-memb(X,T),!,del(S,T,R,[X|R1],L).

del([X|S],T,[X|R],R1,L):-del(S,T,R,R1,L).

conc([],L,L).

conc([X|S],T,R):-conc(S,T,R1),R=[X|R1].

memb(X,[X|_]).

memb(X,[_|T]):-memb(X,T).

order([],[]).

order([X|T],S):-order(T,S1),insert(X,S1,S).

insert(X,[Y|S],[Y|S1]):-list(X,T),list(Y,T1),len(T,N),len(T1,N1),N=<N1,!,insert(X,S,S1).

insert(X,S,[X|S]).

len([],0).

len([_|T],N):-len(T,N1),N is N1+1.