Теория графов

Автор работы: Пользователь скрыл имя, 19 Марта 2013 в 18:53, курсовая работа

Краткое описание

Благодаря своей простой формулировке и раздражающей неуловимости она до сих пор остается мощным стимулом исследований различных свойств графов. Настоящее столетие было свидетелем неуклонного развития теории графов, которая за последние десять – двадцать лет вступила в новый период интенсивных разработок. В этом процессе явно заметно влияние запросов новых областей: тео-рии игр и программирования, теории передачи сообщений, электрических сетей и контактных цепей, а также проблем психологии и биологии.

Содержание

ВВЕДЕНИЕ 3
1. ТЕОРИЯ ГРАФОВ. 4
1.1. Историческая справка. 4
1.2. Основные термины и теоремы теории графов. 9
2. ЗАДАЧИ НА ГРАФАХ. 15
2.1. Описание различных задач на графах. 15
2.2. Нахождение кратчайших путей в графе 16
3. ПРОГРАММА ОПРЕДЕЛЕНИЯ КРАТЧАЙШЕГО ПУТИ В ГРАФЕ 19
3.1. Язык программирования Delphi. 19
3.2. Программа «Определение кратчайшего пути в графе» 20
ЗАКЛЮЧЕНИЕ 25
СПИСОК ЛИТЕРАТУРЫ 27
ПРИЛОЖЕНИЕ 28
Текст программы определения кратчайшего пути в графе 28

Вложенные файлы: 1 файл

Теория Графов.doc

— 1.16 Мб (Скачать файл)

Для автоматического ввода длины ребра графа необходимо нажать кнопку .

При включенной кнопке «Выравнивать по сетке» новые вершины будут автоматически выравниваться по координатной сетке.

Если выбрать две различные вершины (щелчком левой кнопки мыши) и нажать на кнопку

, то программа найдет кратчайший путь между вершинами.

Алгоритм определения  кратчайшего пути между вершинами  графа описан следующим модулем  программы:

 

unit MinLength;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,

  StdCtrls,IO,Data,AbstractAlgorithmUnit;

type

  TMinLength = class(TAbstractAlgorithm)

  private

     StartPoint:integer;

     EndPoint:integer;

     First:Boolean;

     Lymbda:array of integer;

     function Proverka:Boolean;

  public

     procedure Make;

  end;

 

var

  MyMinLength: TMinLength;

implementation

 

uses MainUnit, Setting;

procedure TMinLength.Make;

         var i ,j  : integer;

            PathPlace,TempPoint:Integer;

            flag:boolean;

         begin

           with MyData do begin

     StartPoint:=MyIO.FirstPoint;

     EndPoint:=MyIO.LastPoint;

                     SetLength(Lymbda,Dimension+1);

            SetLength(Path,Dimension+1);

           for i:=1 to Dimension do

              Lymbda[i]:=100000;

           Lymbda[StartPoint]:=0;

           repeat

             for i:=1 to Dimension do

                for j:=1 to Dimension do

                   if Matrix[i,j]=1 then

                     if  ( ( Lymbda[j]-Lymbda[i] ) > MatrixLength[j,i] )

                       then Lymbda[j]:=Lymbda[i] + MatrixLength[j,i];

           until Proverka ;

 

           Path[1]:= EndPoint ;

           j:=1;

           PathPlace:=2;

           repeat

             TempPoint:=1;

             Flag:=False;

             repeat

               if ( Matrix[ Path[ PathPlace-1 ],TempPoint] =1  )and (

                  Lymbda[ Path[ PathPlace-1] ] =

                   ( Lymbda[TempPoint] + MatrixLength[ Path[PathPlace-1 ], TempPoint] ) )

                   then Flag:=True

                   else Inc( TempPoint );

             until Flag;

             Path[ PathPlace ]:=TempPoint;

             inc( PathPlace );

             MyIO.DrawPath(Path[ PathPlace-2 ],Path[ PathPlace -1],true);

//            ShowMessage('f');

           until(Path[ PathPlace - 1 ] = StartPoint);

//           MyIO.DrawPath(Path[ PathPlace-1 ],Path[ PathPlace ],true);

           end;

         end;

function TMinLength.Proverka:Boolean;

         var i,j:integer;

             Flag:boolean;

         begin

           i:=1;

           Flag:=False;

           With MyData do begin

           repeat

             j:=1;

             repeat

               if Matrix[i,j]=1 then

               if ( Lymbda[j]-Lymbda[i] )>MatrixLength[j,i]then Flag:=True;

               inc(j);

             until(j>Dimension)or(Flag);

             inc(i);

           until(i>Dimension)or(Flag);

           Result:=not Flag;

           end;

         end;

 

 

end.

 

Рабочее поле программы предназначено для визуального ввода графов.

Рабочее поле с введенным  графом выглядит следующим образом:

 
ЗАКЛЮЧЕНИЕ

Теория графов находит  широкое применение в различных  областях науки и техники:

Графы и информация

Двоичные деревья играют весьма важную роль в теории информации. Предположим, что определенное число  сообщений требуется закодировать в виде конечных последовательностей различной длины, состоящих из нулей и единиц. Если вероятности кодовых слов заданы, то наилучшим считается код, в котором средняя длина слов минимальна по сравнению с прочими распределениями вероятности. Задачу о построении такого оптимального кода позволяет решить алгоритм Хаффмана.

Двоичные кодовые деревья  допускают интерпретацию в рамках теории поиска. Каждой вершине при этом сопоставляется вопрос, ответить на который можно либо "да", либо "нет". Утвердительному и отрицательному ответу соответствуют два ребра, выходящие из вершины. "Опрос" завершается, когда удается установить то, что требовалось.

Таким образом, если кому-то понадобится взять интервью у  различных людей, и ответ на очередной вопрос будет зависеть от заранее неизвестного ответа на предыдущий вопрос, то план такого интервью можно представить в виде двоичного дерева.

Графы и химия

Еще А. Кэли рассмотрел задачу о возможных структурах насыщенных (или предельных) углеводородов, молекулы которых задаются формулой:

CnH2n+2

Молекула каждого предельного  углеводорода представляет собой дерево. Если удалить все атомы водорода, то оставшиеся атомы углеводорода также  будут образовывать дерево, каждая вершина которого имеет степень  не выше 4. Следовательно, число возможных структур  предельных углеводородов, т. е. число гомологов данного вещества, равно числу деревьев с вершинами степени не больше четырех.

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

Графы и биология

Деревья играют большую  роль в биологической теории ветвящихся процессов. Для простоты мы рассмотрим только одну разновидность ветвящихся процессов – размножение бактерий. Предположим, что через определенный промежуток времени каждая бактерия либо делится на две новые, либо погибает. Тогда для потомства одной бактерии мы получим двоичное дерево.

Нас будет интересовать лишь один вопрос: в скольких случаях n-е поколение одной бактерии насчитывает ровно k потомков? Рекуррентное соотношение, обозначающее число необходимых случаев, известно в биологии под названием процесса Гальтона-Ватсона. Его можно рассматривать как частный случай многих общих формул.

Графы и физика

Еще недавно одной из наиболее сложных и утомительных задач для радиолюбителей было конструирование печатных схем.

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

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

Итак, из всего вышесказанного неопровержимо следует практическая ценность теории графов.

 

СПИСОК ЛИТЕРАТУРЫ

 

  1. Белов Теория Графов, Москва, «Наука»,1968.
  2. Новые педагогические и информационные технологии Е.С.Полат, Москва, «Akademia» 1999 г.
  3. Кузнецов О.П., Адельсон-Вельский Г.М. Дискретная математика для инженера. – М.: Энергоатомиздат, 1988.
  4. Кук Д., Бейз Г. Компьютерная математика. – М.: Наука, 1990.
  5. Нефедов В.Н., Осипова В.А. Курс дискретной математики. – М.: Издательство МАИ, 1992.
  6. Оре О. Теория графов. – М.: Наука, 1980.
  7. Исмагилов Р.С., Калинкин А.В. Матеpиалы к пpактическим занятиям по куpсу: Дискpетная математика по теме: Алгоpитмы на гpафах. - М.: МГТУ, 1995
  8. Смольяков Э.Р. Введение в теоpию гpафов. М.: МГТУ, 1992
  9. Hечепуpенко М.И. Алгоpитмы и пpогpаммы pешения задач на гpафах и сетях. - Hовосибиpск: Hаука, 1990
  10. Романовский И.В. Алгоpитмы pешения экстpемальных задач. - М.: Hаука, 1977
  11. Писсанецки С. Технология разреженных матриц. - М.: Мир, 1988
  12. Севастьянов Б.А. Вероятностные модели. - М.: Наука, 1992
  13. Бочаров П.П., Печинкин А.В. Теория вероятностей. - М.: Изд-во РУДН, 1994

 

ПРИЛОЖЕНИЕ

  • Текст программы определения кратчайшего пути в графе

  •  

    Модуль управления интерфейсом  программы:

     

    unit MainUnit;

     

    interface

     

    uses

      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

       StdCtrls,PaintingGraph, ComCtrls, ToolWin, ImgList, Menus,

      ActnList, ExtCtrls;

    const

     

      crMyCursor = 5;

     

    type

      TForm1 = class(TForm)

        SaveDialog1: TSaveDialog;

        OpenDialog1: TOpenDialog;

        ImageList1: TImageList;

        ImageList2: TImageList;

        LoadMenu: TPopupMenu;

        ControlBar1: TControlBar;

        ToolBar3: TToolBar;

        OpenButton: TToolButton;

        SaveButton: TToolButton;

        ToolButton15: TToolButton;

        ClearButton: TToolButton;

        UpdateButton: TToolButton;

        HelpButton: TToolButton;

        ToolButton26: TToolButton;

        RemovePointButton: TToolButton;

        ToolButton28: TToolButton;

        ToolButton32: TToolButton;

        SettingButton: TToolButton;

        ControlBar2: TControlBar;

        AlgoritmToolBar: TToolBar;

        KommiTool: TToolButton;

        ToolButton: TToolButton;

        NotFarButton: TToolButton;

        MinLengthButton: TToolButton;

        ToolButton5: TToolButton;

        MovePointButton: TToolButton;

        ActionList1: TActionList;

        AShowGrig: TAction;

        ASnapToGrid: TAction;

        ASave: TAction;

        ALoad: TAction;

        ADelete: TAction;

        GridToolBar: TToolBar;

        Clock: TLabel;

        Timer1: TTimer;

        ShowGridButton: TToolButton;

        AutoLengthButton: TToolButton;

        SnapToGridButton: TToolButton;

        PaintBox1: TPaintBox;

        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

          Shift: TShiftState; X, Y: Integer);

        procedure FormCreate(Sender: TObject);

        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,

          Y: Integer);

        procedure FormPaint(Sender: TObject);

        procedure FormKeyDown(Sender: TObject; var Key: Word;

          Shift: TShiftState);

        procedure ClearButtonClick(Sender: TObject);

        procedure KommiToolButtonClick(Sender: TObject);

        procedure PaintingToolButtonClick(Sender: TObject);

        procedure SnapToGridButtonClick(Sender: TObject);

        procedure HelpButtonClick(Sender: TObject);

        procedure AutoLengthButtonClick(Sender: TObject);

        procedure SettingButtonClick(Sender: TObject);

        procedure NotFarButtonClick(Sender: TObject);

        procedure MinLengthButtonClick(Sender: TObject);

        procedure MovePointButtonClick(Sender: TObject);

        procedure RemovePointButtonClick(Sender: TObject);

        procedure Timer1Timer(Sender: TObject);

        procedure ALoadExecute(Sender: TObject);

        procedure AShowGrigExecute(Sender: TObject);

        procedure ASaveExecute(Sender: TObject);

        procedure PaintBox1Paint(Sender: TObject);

        procedure UpdateButtonClick(Sender: TObject);

        procedure EilerButtonClick(Sender: TObject);

        procedure ClockClick(Sender: TObject);

     

      private

        procedure MyPopupHandler(Sender: TObject);

        { Private declarations }

      public

        { Public declarations }

      end;

     

    var

      Form1: TForm1;

    implementation

    uses IO,Data,Commercial,DrawingObject,Setting,NotFar,MinLength, Eiler,

      SplashScreen;

    {$R *.DFM}

     

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    begin

    if Button=mbLeft then  begin

      MyIO.FormMouseDown( X, Y);

      if (MyIO.State=msMove)then

          if MyIO.FirstPointActive then

             Cursor := crMyCursor

          else begin

             Repaint;

             Cursor := crDefault;

          end;  

        end

    else

      MyIO.MakeLine(X, Y);

    end;

     

    procedure TForm1.FormCreate(Sender: TObject);

    begin

    Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'Shar');

    MyIO:=TIO.Create(PaintBox1.Canvas);

    MyData:=TData.Create;

    MyDraw:=TDrawingObject.Create(PaintBox1.Canvas);

    SaveDialog1.InitialDir:=ExtractFilePath(Application.ExeName)+'Grafs';

    OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName)+'Grafs';

    end;

     

    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

      Y: Integer);

    begin

    MyIO.DrawLine(x,y);

    end;

     

    procedure TForm1.FormPaint(Sender: TObject);

    begin

    PaintBox1Paint(Sender);

    end;

     

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

      Shift: TShiftState);

    begin

    if (Key=vk_Escape) then

      begin

      MyData.Remove(MyData.Dimension);

      MyDraw.Remove(MyData.Dimension);

      Repaint;

      end;

     

    end;

     

    procedure TForm1.MyPopupHandler(Sender: TObject);

    var s:string;

    begin

      with Sender as TMenuItem do begin

          s:=Caption;

          MyData.Load(s);

          System.Delete(s,length(s)-4,5);

          MyDraw.Load(s+'.pos');

      end;

    Repaint;

    end;

     

    procedure TForm1.ClearButtonClick(Sender: TObject);

    begin

    MyData.Clear;

    MyDraw.Clear;

    Repaint;

    end;

     

    procedure TForm1.KommiToolButtonClick(Sender: TObject);

    begin

    If MyData.Dimension<2 then Exit;

    MyCommercial:=TCommercial.Create;

    MyCommercial.Make;

    MyCommercial.Free;

    end;

    procedure TForm1.EilerButtonClick(Sender: TObject);

    begin

    If MyData.Dimension<2 then Exit;

    EilerC:=TEiler.Create;

    EilerC.Make;

    EilerC.Free;

    MyIO.DrawAll;

    RePaint;

    end;

     

    procedure TForm1.PaintingToolButtonClick(Sender: TObject);

    begin

    If MyData.Dimension<2 then Exit;

    MyPaint:=TPaintingGraphClass.Create;

    MyPaint.Make;

    RePaint;

    MyPaint.Free;

    end;

     

    procedure TForm1.SnapToGridButtonClick(Sender: TObject);

    begin

    MyIO.FSnapToGrid:=SnapToGridButton.Down;

    end;

     

    procedure TForm1.HelpButtonClick(Sender: TObject);

    begin

    Application.HelpContext(10);

    end;

     

    procedure TForm1.AutoLengthButtonClick(Sender: TObject);

    begin

    MyIo.AutoLength:=AutoLengthButton.Down;

    end;

     

    procedure TForm1.SettingButtonClick(Sender: TObject);

    begin

      SettingForm.Show;

    end;

     

    procedure TForm1.NotFarButtonClick(Sender: TObject);

    begin

    If MyData.Dimension<2 then Exit;

    MyNotFar:=TNotFar.Create;

    MyNotFar.Make;

    MyNotFar.Free;

    end;

     

    procedure TForm1.MinLengthButtonClick(Sender: TObject);

    begin

    If MyData.Dimension<2 then Exit;

    MyMinLength:=TMinLength.Create;

    MyMinLength.Make;

    MyMinLength.Free;

    end;

     

    procedure TForm1.MovePointButtonClick(Sender: TObject);

    begin

    if MovePointButton.Down then MyIO.State:=msMove else

      MyIO.State:=msNewPoint;

    if MovePointButton.Down=false then

      Cursor := crDefault;

    end;

     

    procedure TForm1.RemovePointButtonClick(Sender: TObject);

    begin

    if ReMovePointButton.Down then MyIO.State:=msDelete else

      MyIO.State:=msNewPoint;

      Repaint;

    end;

     

    procedure TForm1.Timer1Timer(Sender: TObject);

    begin

      Clock.Caption:=TimeToStr(Time);

    end;

     

    procedure TForm1.ALoadExecute(Sender: TObject);

    var s:string;

    begin

      if OpenDialog1.Execute then

        try

          s:=OpenDialog1.Filename;

          MyData.Load(s);

          Delete(s,length(s)-4,5);

          MyDraw.Load(s+'.pos');

        finally

        end;

    Repaint;

    end;

     

    procedure TForm1.AShowGrigExecute(Sender: TObject);

    begin

    MyIO.FDrawGrid:=ShowGridButton.Down ;

    Repaint;

    end;

     

    procedure TForm1.ASaveExecute(Sender: TObject);

    var s:string;

        m:TMenuItem;

    begin

      if SaveDialog1.Execute then

        try

          s:=SaveDialog1.Filename;

          MyData.Save(s);

          Delete(s,length(s)-4,5);

          MyDraw.Save(s+'.Pos')

        finally

        end;

    Информация о работе Теория графов