
- •Кафедра саприс курсовая работа
- •Воронеж 2007
- •1.Основные определения
- •1.1 Граф. Ориентированный граф
- •1.2 Пути и маршруты
- •1.5 Матричные представления графов
- •1.5.1 Матрица смежности
- •1.5.3 Матрица контрдостижимости
- •1.6 Нахождение сильных компонент
- •1.7 База, антибаза в орграфах
- •2. Описание программы
- •2.1 Назначение программы
- •2.2 Язык программирования
- •2.3 Техническое обеспечение
- •2.4 Запуск программы
- •2.5 Состав программы
- •2.6 Контрольный пример
2.5 Состав программы
Программа состоит из главного модуля Unit_Komponent.
Модуль Unit_Komponent содержит:
Form_Komponent – основная форма программы в виде стандартного окна;
Переменные:
A, SK, K: array[0..9,0..9] of integer – двумерные массивы, хранящие в себе матрицы смежности, конденсации, сильных компонент, необходимые для работы всей программы;
glav: array[1..150,1..150] of integer –оператор, который служит для перехода от матрицы смежности к матрицы достижимости;
R,Q,S:array[1..10,1..10] of integer – массивы, хранящие матрицы достижимости, контрдостижимости, сильной связанности;
polystzah, polystish, antibaza, baza:array[0..10] of integer – массивы для вывода базы, антибазы, сильных компонент.
В программе выполняются следующие процедуры:
procedure Butn2Click(Sender: TObject) – определяется количество вершин графа, выводится соответствующая матрица смежности;
procedure TForm_Component.BitBtn1Click(Sender: TObject)– немедленно завершает работу с программой.
Программа имеет монолитномодульную структуру. Такая структура обеспечивает стабильную работу программы. Кроме того делает более простой отладку программы и уменьшает вероятность логических ошибок, т. к в ней не передаются управляющие параметры. Такая структура проста и наглядна, но применима для реализации простых задач. Учитывая то, что поставленная задача является достаточно простой, вышеописанная структура является оптимальной в данном случае.
2.6 Контрольный пример
Найти сильные компоненты базу и антибазу.
рис.5
Решение:
Матрица достижимости R:
-
1
2
3
4
5
6
7
1
1
1
1
1
1
1
1
2
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
4
0
0
0
1
1
1
1
5
0
0
0
1
1
1
1
6
0
0
0
1
1
1
1
7
0
0
0
1
1
1
1
Матрица контрдостижимости Q:
-
1
2
3
4
5
6
7
1
1
1
1
0
0
0
0
2
1
1
1
0
0
0
0
3
1
1
1
0
0
0
0
4
1
1
1
1
1
1
1
5
1
1
1
1
1
1
1
6
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
Матрица взаимной достижимости S:
-
1
2
3
4
5
6
7
1
1
1
1
0
0
0
0
2
1
1
1
0
0
0
0
3
1
1
1
0
0
0
0
4
0
0
0
1
1
1
1
5
0
0
0
1
1
1
1
6
0
0
0
1
1
1
1
7
0
0
0
1
1
1
1
8
0
0
0
1
1
1
1
Граф конденсации G*(Рисунок 6):
Рисунок 6
Сильные компоненты: {1,2,3}, {4,5,6,7}
Базы: {1,2,3}
Антибазы: {4,5,6,7}
Теперь реализуем тот же граф с помощью программы.
Граф задан с помощью матрицы смежности:
-
1
2
3
4
5
6
7
1
0
1
0
0
0
0
0
2
0
0
1
1
0
0
0
3
1
0
0
0
1
0
0
4
0
0
0
0
0
1
1
5
0
0
0
1
0
1
0
6
0
0
0
0
0
0
1
7
0
0
0
0
1
0
0
В результате работы программа выдает следующие расчетные значения:
Сильные компоненты: {1,2,3}, {4,5,6,7}
Базы: {1,2,3}
Антибазы: {4,5,6,7}
Заключение
В результате выполнения курсовой работы по курсу "Дискретная математика" на тему " Определение сильных компонент, базы и антибазы ориентированного графа " мною была разработана программа, реализующая данный алгоритм, основываясь на графическом изображении графов. Программа удобна, достаточно проста в использовании.
Для стабильной работы программы компьютер должен соответствовать следующим минимальным требованиям:
* Процессор - Intel Pentium 266 MHz или аналогичный ему
* Операционная система - Microsoft Windows 9-x, Me, XP;
* Оперативная память 32 Mb RAM;
* 510 Kb свободного места на диске;
* Монитор
* Клавиатура
В процессе разработки мной были изучены основные положении теории графов, объектно-ориентированного программирования. Эта задача была особенно актуальна сейчас, в связи с широким распространением прикладной реализации теории графов на ЭВМ.
Кроме практических результатов при выполнении работы были изучены теоретические вопросы, связанные с теорией развития графа.
Список литературы
1).Белецкая С. Ю. Комбинаторика. Графы. Алгоритмы: учеб. пособие. Воронеж: Воронеж. гос. техн. ун-т, 2003. 103 с.
2).Кристофедис Н. Теория Графов: алгоритмический подход. М.: Мир, 1978.427 с.
3).Культин Н. Основы программирования в Delphi 7. Санкт - Петербург: БХВ-Петербург,2003.598 с.
Приложение
Листинг программы.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Menus, Grids, ExtCtrls;
type
TForm_Component = class(TForm)
Edit1: TEdit;
Butn1: TBitBtn;
Butn2: TBitBtn;
Label2: TLabel;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
StringGrid4: TStringGrid;
BitBtn1: TBitBtn;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
procedure Butn2Click(Sender: TObject);
procedure Butn1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
E,A,SK,K,A_matr:array[0..9,0..9] of integer;
glav:array[1..150,1..150] of integer;
R,Q,S:array[1..10,1..10] of integer;
polustzah,polustish,antibaza,baza:array[0..10] of integer;
public
{ Public declarations }
end;
var
Form_Component: TForm_Component;
implementation
{$R *.dfm}
procedure TForm_Component.Butn2Click(Sender: TObject);
Var
i,j,k, t,h,g,n,pr,ravno,d,l,z,m,f,vir,b,w,razmer,x,c,u,o: Integer;
razmer,x,t,u,o,w,b: Integer;
razm:array[0..9]of integer;
Label 1,2;
begin
Butn2.Visible:=False; {Видимость и невидимость StringGrid1.Visible:=False; компонентов на фоне}
Label1.Visible:=False;
Label6.Visible:=False;
Label25.Visible:=False;
Label8.Visible:=False;
Label7.Visible:=False;
Label9.Visible:=False;
Label11.Visible:=False;
Label10.Visible:=False;
Label12.Visible:=False;
Label23.Visible:=False;
Label24.Visible:=False;
Label13.Visible:=False;
Label14.Visible:=False;
Label15.Visible:=False;
Label16.Visible:=False;
Label18.Visible:=False;
Label17.Visible:=False;
Label22.Visible:=False;
Label20.Visible:=False;
Label19.Visible:=False;
Label21.Visible:=False;
Label3.Visible:=True;
StringGrid2.Visible:=True;
Label4.Visible:=True;
StringGrid3.Visible:=True;
Label5.Visible:=True;
StringGrid4.Visible:=True;
BitBtn1.Visible:=True;
for j:=0 to i-1 do {Ввод матрицы смежности}
for k:=0 to i-1 do
A[j,k]:= StrToInt(StringGrid1.Cells[j,k]);
for j:=0 to i-1 do
begin
for k:=0 to i-1 do
for i:=0 to i-1 do
if j=i then E[i,j]:=1; {Задаём единичную матрицу}
for k:=0 to i-1 do
for l:=1 to i-1 do
A[k,j]:=A_matr[k,j]; {Умножение матриц, переход от матрицы Sum :=A[i,l]*A_matr[k,j]; смежности к матрице достижимости}
A[k,j]:=Sum +A[k,j];
for i:=0 to i-1 do
for k:=0 to i-1 do
glav:=A[k,j]+E[i,j];
end;
for l:=0 to 10 do {Задаём оператор перехода}
begin
t:=0;
for j:=1 to i do
begin
for h:=1 to 150 do
if glav[h,j]>10 then
begin
t:=h;
goto 1;
end;
1:
for k:=1 to t-1 do
begin
g:=glav[k,j];
for o:=1 to t-1 do
begin
ravno:=0;
for pr:=1 to l do
if glav[n,g]=glav[pr,j] then ravno:=1;
if ravno=0 then
begin
glav[t,j]:=glav[n,g];
t:=l+1;
end;
end;
end;
end;
end;
for j:=1 to i do
for k:=1 to 150 do
begin
R[j,j]:=1;
z:=glav[k,j];
if z<11 then
R[z,j]:=1;
end;
for j:=1 to i do {Транспонируем матрицу достижимости}
for k:=1 to i do
Q[j,k]:=R[k,j];
for j:=1 to i do {Находим матрицу сильной связанности}
for k:=1 to i do
S[k,j]:=Q[k,j]*R[k,j];
j:=0;
d:=0;
for k:=1 to i do {Отбираем сильные компоненты}
begin
j:=0;
vir:=0;
for pr:=2 to i do
if (S[k,t]=S[k,t])and(S[k,t]>1) then
vir:=vir+1;
if vir<>i-1 then
begin
SK[j,d]:=k;
for h:=k+1 to i do
begin
ravno:=0;
for l:=1 to i do
if S[k,t]=S[h,t] then ravno:=ravno+1;
if ravno=i then
begin
j:=j+1;
SK[j,d]:=h;
for f:=1 to i do
S[h,f]:=h;
end;
end;
for f:=1 to i do
S[k,f]:=f;
d:=d+1;
end;
end;
for j:=0 to i-1 do
if SK[0,j]=0 then
begin
x:=j;
goto 2;
end;
2:
for j:=0 to i-1 do {Вывод матрицы сильной компоненты}
begin
t:=0;
for k:=0 to i-1 do
if SK[k,j]<>0 then
begin
StringGrid2.Cells[j,0]:=StringGrid2.Cells[j,0]+IntToStr(siln_comp[k,j]);
t:=l+1;
end;
razm[j]:=l;
end;
razmer:=razm[1];
for j:=0 to i-1 do
if razm[j]>razmer then razmer:=razm[j];
StringGrid2.ColCount:=x;
for j:=0 to x-1 do
for k:=0 to i-1 do
begin
g:=SK[k,j]-1;
for t:=0 to i-1 do
begin
if A[t,g]=1 then {Формируем матрицу конденсации}
begin
for h:=0 to i-1 do
for d:=0 to i-1 do
if SK[d,h]=t+1 then
m:=h;
K[m,j]:=K[m,j]+1;
end;
end;
end;
for j:=0 to x-1 do
for k:=0 to x-1 do
begin
if K[k,j]>1 then K[k,j]:=1;
K[j,j]:=0;
end;
for j:=0 to x-1 do {В зависимости от полустепеней исхода и захода
begin формируем базы и антибазы}
c:=0;
u:=0;
for k:=0 to x-1 do
begin
c:=c+K[j,k];
u:=u+K[k,j];
end;
polystish[j]:=u;
polystzah[j]:=c;
end;
t:=0;
k:=0;
for j:=0 to x-1 do
begin
if polystzah[j]=0 then
begin
baza[k]:=j+1;
k:=k+1;
end;
if polystish[j]=0 then
begin
antibaza[l]:=j+1;
t:=l+1;
end;
end;
for j:=0 to x-1 do {Вывод баз и антибаз}
begin
if baza[j]<>0 then
begin
w:=(antibaza[j]);
StringGrid3.Cells[w,0]:=StringGtid2.Cells[j,0];
end ;
if antibaza[j]<>0 then
b:=(antibaza[j]);
StringGrid4.Cells[q,0]:=StringGrid2.Cells[j,0];
end;
end;
end;
end;
procedure TForm_Component.Butn1Click(Sender: TObject);
var
i,j,k:integer;
begin
Edit1.Visible:=False;
Butn1.Visible:=False;
Label2.Visible:=False;
Butn2.Visible:=True;
StringGrid1.Visible:=True;
Label1.Visible:=True;
Label6.Visible:=True;
Label25.Visible:=True;
Label8.Visible:=True;
Label7.Visible:=True;
Label9.Visible:=True;
Label11.Visible:=True;
Label10.Visible:=True;
Label12.Visible:=True;
Label23.Visible:=True;
Label24.Visible:=True;
Label13.Visible:=True;
Label14.Visible:=True;
Label15.Visible:=True;
Label16.Visible:=True;
Label18.Visible:=True;
Label17.Visible:=True;
Label22.Visible:=True;
Label20.Visible:=True;
Label19.Visible:=True;
Label21.Visible:=True;
if (Edit1.Text='') then i:=0
else i:=StrToInt(Edit1.Text);
if (i<11)and(i>2) then
begin
StringGrid1.ColCount:=i; {Количество строк и столбцов при выводе
StringGrid1.RowCount:=I матрицы смежности, сильных компонент,
StringGrid3.ColCount:=10; баз и антибаз}
StringGrid3.RowCount:=1;
StringGrid4.ColCount:=10;
StringGrid4.RowCount:=1;
for j:=0 to i-1 do
for k:=0 to i-1 do
begin
StringGrid1.Cells[k,j]:='0';
end;
end
end;
procedure TForm_Component.BitBtn1Click(Sender: TObject);
begin {Выход из программы}
Close
end;
end.