Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.12.2010, 11:44
OniXxX OniXxX вне форума
Прохожий
 
Регистрация: 22.12.2010
Сообщения: 1
Репутация: 10
По умолчанию Расчёт коэффициента напряженности сетевого графика

Столкнулся с необходимостью расчитать коэффициент напряженности для работ сетевого графика. Изначально мы задаем начало и конец для каждой работы и продолжительность. По этим данным поиском в глубину нахожу все возможные пути и вывожу в Label.
Можно задать двумерный массив работ (рёбер графа), есть одномерный массив для критического пути. Что дальше делать, не могу разобраться.

Прикладываю код модуля:
Код:
unit Unit1;

interface

uses Forms,StdCtrls,ExtCtrls,SysUtils,EvalUnit,Graphics,Classes,Controls,
Grids,Menus,Dialogs,Buttons,Windows,Messages,Variants,WinTypes;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
   // procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MasWay: array of array of integer;

implementation

uses MainUnit;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
const N=10;{ кол.-во вершин графа}
var
way:array [1..7]of integer; { путь - номера точек }
incl:array[1..N]of boolean; { incl[i] равно TRUE, если точка с номером i включена в way }
start,finish:integer; { начальная и конечная точки }
found:boolean;
len:integer; { длина найденного маршрута }
c_len:integer; { длина текущего маршрута }
i,j:integer;

procedure step(s,f,p:integer);
var
c:integer;{ номер точки, в которую делаем очередной шаг }
i:integer;
begin
if s=f then begin
//начало и конец совпали
found:=TRUE;
len:=c_len;// сохраняем длину найденного маршрута
Label1.caption:=Label1.caption+#13+'Путь:';
{ вывод найденного маршрута }
for i:=1 to p-1 do
Label1.caption:=Label1.caption+' '+IntToStr(way[i]);
Label1.caption:=Label1.caption+', Путь:'+IntToStr(len)+#13;
end
else
{ выберем очередную точку }
for c:=1 to MainForm.GD.EventCount do { проверяем все вершины от 1-ого, до кол.-ва событий в графике }
if(MainForm.GD.Matrix[s,c]<> 0)and(NOT incl[c])
and((len=0)or(c_len+MainForm.GD.Matrix[s,c]< len))

then begin { точка соединена с текущей, но не включена в маршрут}
way[p]:=c;{ добавим вершину в путь }
incl[c]:=TRUE;{ пометим вершину как включенную }
c_len:=c_len+MainForm.GD.Matrix[s,c]; 
step(c,f,p+1);
incl[c]:=FALSE;
way[p]:=0;
c_len:=c_len-MainForm.GD.Matrix[s,c];
end;
end;{ заканчивается процедура step }

begin
Label1.caption:='';
{ инициализация массивов }
for i:=1 to MainForm.Output.ColCount do way[i]:=0;
for i:=1 to MainForm.Output.ColCount do incl[i]:=FALSE;

len:=0; // 
c_len:=0; // 
start:=0;
finish:=MainForm.GD.EventCount-1;
way[1]:=start;{ внесём точку в маршрут }
incl[start]:=TRUE;{ пометим точку }
step(start,finish,2);{ищем 2-ую точку маршрута }
// проверка, найден ли хотя бы 1 путь
if not found
then Label1.caption:='Путей нет';
end;

end.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025