Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachment.doc
Скачиваний:
14
Добавлен:
30.07.2019
Размер:
382.98 Кб
Скачать

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.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]