Федеральное агентство по образованию РФ
Санкт-Петербургский государственный электротехнический университет
Кафедра МО ЭВМ
Пояснительная записка к курсовой работе
по дисциплине логическое программирование
Преподаватель: Беляев С.А.
Студенты гр. 4351: Мачихин А.
Кузьменко А.
Санкт-Петербург
2007
Постановка задачи (вариант 8).
Раскрашивание графа. Дан граф. Необходимо определить минимальное количество цветов, в которое он может быть раскрашен, при этом соседние вершины не должны быть одного цвета. Размерность задачи не менее 15.
Дополнительные требования:
- Исходные данные (ИД) читаются из внешнего файла. Несколько вариантов ИД.
- Алгоритм решения должен быть «умнее» полного перебора.
2. Описание алгоритма решения.
Вычислить степени вершин (количество ребер). Положить K=1.
Просмотреть вершины в порядке невозрастания степеней и окрасить первую неокрашенную вершину в цвет № K.
Просмотреть вершины в порядке невозрастания степеней и окрасить в цвет №К все вершины, которые не смежны вершинам, уже окрашенным в цвет №К.
Если все вершины окрашены, то К - искомое хроматическое число. Иначе К=К+1 и переход к пункту 2.
Пример решения.
Возможно сформулировать вышеописанный алгоритм с использованием списков:
Составить список 1 вершин графа. N=0 (N-хроматическое число графа). Список 2 пуст.
Упорядочить список 1 вершин графа по неубыванию их степеней.
Удалить первый элемент списка 1 – вершину а.
Переместить все вершины, связанные с вершиной а из списка 1 в список 2.
Если список 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, например, не должно быть самой вершины а.
Текст программы.
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.