
22.12.2010, 11:44
|
Прохожий
|
|
Регистрация: 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.
|