Смекни!
smekni.com

Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации (стр. 20 из 25)

Работы сетевой модели могут иметь два вида резервов: полный (Rnij) и свободный (Rcij). Полный резерв показывает, на сколько может быть увеличена продолжительность данной работы или сдвинуто ее начало так, чтобы продолжительность максимального из проходящий через нее путей не превысила критического пути. Полный резерв определяется

Rnij = Tnj - Tpi - tij. (2.6)

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

Rcij = Tpj - Tpi - Tij. (2.7)

Результаты расчета параметров сетевого графика представлены в таблице 2.6

Таблица 2.6 Временные параметры работ сетевого графика.

i-j toij Tрнij Троij Тпнij Tпоij Rnij Rcij
1-2 27 0 27 0 27 0 0
2-3 6 27 33 27 33 0 0
2-4 11 27 38 27 38 0 0
3-5 2 33 35 33 35 0 0
4-6 3 38 41 39 42 1 0
5-7 6 35 41 35 41 0 0
6-8 12 41 53 42 54 1 0
7-9 12 41 53 41 53 0 0
9-10 3 53 56 53 56 0 0
8-10 2 53 55 54 56 1 1
10-12 2 56 58 56 58 0 0
10-11 2 56 58 56 58 0 0
11-13 9 58 67 76 85 18 0
i-j toij Tрнij Троij Тпнij Tпоij Rnij Rcij
10-14 22 56 78 56 78 0 0
12-15 24 58 82 62 86 4 0
12-16 27 58 85 58 95 10 0
13-17 6 67 73 85 91 18 18
14-17 8 78 86 83 91 5 5
15-17 5 82 87 86 91 4 4
16-17 6 85 91 85 91 0 0
17-18 38 91 129 91 129 0 0
18-19 27 129 156 128 156 0 0
19-20 5 156 161 156 161 0 0

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

Коэффициент напряженности пути Кн (L) определяется по формуле

Т (L) - Т’кр (L)

Кн (L) = - ---------- - , (2.8)

Ткр - Т’кр (L)

где Т (L) - продолжительность пути, для которого определяется коэффициент напряженности,

Т’кр (L) - продолжительность работ данного пути (L), совпадающих с работами критического пути.

Коэффициенты напряженности работ данной разработки приведены в таблице 2.7

Найдем вероятность выполнения всего комплекса работ (Рк) за директивный срок 162 дня. Эта вероятность определяется с помощью аргумента нормальной функции распределения вероятностей:

Tд - Tкр

x = - ------- - , (2.9)

Öås tкрij

где n - число работ, лежащих на критическом пути, Тд - директивный срок, s = 0,04 (tmax - tmin) - дисперсия работы i,j критического пути (значения дисперсий приведены в таблице 2.7).

Значение Рк находим по ее аргументу х, используя таблицу интегралов Фурье.

Таблица 2.7 Параметры сетевого графика.

i-j Кн stкрij i-j Кн stкрij
1-2 1,0 1,0 10-12 1,0 0,04
2-3 1,0 0,16 10-14 0,2 0,64
2-4 0,08 0,16 11-13 0,1 0,16
3-5 1,0 0,04 12-15 0,23 0,64
4-6 0,1 0,04 12-16 1,0 0,64
5-7 1,0 0,16 13-17 0,16 0,36
6-8 0, 19 0,64 14-17 0,29 0,16
7-9 1,0 1,0 15-17 0,28 0,04
8-10 0,2 0,04 16-17 1,0 0,16
9-10 1,0 0,04 17-18 1,0 1,96
10-11 0,02 0,04 18-19 1,0 1,44
19-20 1,0 0,16

Аргумент нормальной функции распределения вероятностей равен 0,32. Используя таблицу интеграла Фурье, находим значение функции Рк = 0,63. Так как значение Рк попадает в интервал 0,35 < Рк < 0,65, то сетевой график не нуждается в оптимизации.



Рис.2.1 Сетевой график.

Приложение 1

Тексты программ

// inquiry. prj

// INQUIRY&bsol;inquiry. c

// main (), initsearch (),mem_args ()

// программа обработки запросов

#include <stdio. h>

#include <stdlib. h>

#include <string. h>

#include <fcntl. h>

#include <sys/stat. h>

#include <io. h>

#include <dos. h>

#include <alloc. h>

#include "pxengine. h"

TABLEHANDLE tblh; // дескриптор таблицы

RECORDNUMBER low,high; // границы интервала поиска

int nflds; // кол-во полей в таблице

int nformat; // формат результата

int handle; // дескриптор файла

void interval (long date1,long date2,char *time1, char *time2); // определение границ интервала поиска

void search3 (char *argv [], int *x); // поиск с перечислениями

void search2 (char *argv [], int *x, int n); // поиск без перечислений

void search1 (void); // поиск только по дате и времени

void initsearch (char *argv [], int *x, int p, int n); // выбор варианта поиска

void recprint (int nformat); // расшифровка записи БД в строку и запись этой строки в файл

char sag [7] [81] ={

"ДАТА ВРЕМЯ ТЕКСТ СООБЩЕНИЯ &bsol;r&bsol;n",

"ДАТА ВРЕМЯ НАПР-Е А N РР ИСТ ВС ТЕКСТ СООБЩЕНИЯ &bsol;r&bsol;n",

"ДАТА ВРЕМЯ НАПР-Е N РР ТЕКСТ СООБЩЕНИЯ &bsol;r&bsol;n",

"ДАТА ВРЕМЯ НАПР-Е К-ВО ВС 1СЛ 2СЛ 3СЛ 4СЛ ТЕКСТ СООБЩЕНИЯ &bsol;r&bsol;n",

"ДАТА ВРЕМЯ ТИП-У П ВС ТЕКСТ СООБЩЕНИЯ &bsol;r&bsol;n",

"ДАТА ВРЕМЯ КСУМ0 КСУМ1 КСУМ2 КСУМ3 &bsol;r&bsol;n",

"ДАТА ВРЕМЯ КСУП1 КСУС1 КСУП2 КСУС2 КСУП3 КСУС3 &bsol;r&bsol;n"

}; // шапки таблиц

char *inqstr; // строки запроса

/* строка аргументов функции main:

argv [1] - имя файла БД; или "!", означающий, что строка аргументов передается через память;

argv [2] - вариант поиска; 0 - поиск по всей БД, 1 - поиск в едином интервале по дате и времени, 2 - поиск в интервале времени по каждому дню интервала дат, 3 - поиск за один день в интервале времени;

argv [3] - дата;

argv [4] - время;

argv [5] и далее - искомые значения полей БД (argv [5] - третьего поля, argv [6] - четвертого поля и т.д.); "-" обоз-

начает любое значение данного поля; в случае нескольких искомых значений по одному полю (перечисление) они разделяются запятыми; пробелы в значениях заменены на '_'. */

voidmain (intargc,char *argv [])

{

int *x; // x [i] - количество искомых значений по i-му полю

int n=0; // количество полей, для которых заданы значения для поиска

int p=0; // количество полей c перечислениями

// значения x,n,p определяются без учета полей даты и времени

char *name [] ={"all_inf","opi","shk","sbkdg","fk","ksum","ksum0"};

// имена баз данных

long date1,date2; // граничные значения интервала дат

int a, i,j,k;

char *c;

char **mem_args (void);

RECORDHANDLE rech;

RECORDNUMBER num;

// Получение аргументов в случае их передачи через память

if (argv [1] [0] =='! ')

{

argv=mem_args ();

for (argc=0; argv [argc] ! =NULL; ++argc);

}

// определение формата записи для базы данных, к которой

// произведен запрос

for (i=0; i<=6; ++i)

if (! strcmp (name [i],argv [1]) ||! strcmp (name [i],argv [1] +5))

{ nformat=i; break; }

// открытие файла результатов запроса (inquiry. res) и

// запись в него строк запроса и шапки таблицы

for (i=argc-1; argv [i] [0] =='-'; - -i) argc--;

handle=open ("inquiry. res",

O_CREAT | O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE);

for (i=1,j=0; i<argc;)

{

inqstr= (char *) calloc (82,1);

memset (inqstr+1,' ',79);

inqstr [79] ='&bsol;r';

inqstr [80] ='&bsol;n';

inqstr [81] ='&bsol;0';

for (c=inqstr; i<argc; ++i)

{

if (strlen (inqstr) +strlen (argv [i]) >78+j)

{

if (strlen (argv [i]) >50 && (strlen (inqstr) <70 || strlen (argv [i]) >78))

{

for (k=j+77-strlen (inqstr); argv [i] [k] ! =','; - -k);

strcat (c," ");

strncat (c,argv [i] +j,k+1-j);

j=k+1;

}

break;

}

strcat (c," ");

strcat (c,argv [i] +j);

j=0;

}

inqstr [strlen (inqstr)] =' ';

_write (handle, inqstr,81);

free (inqstr);

}

_write (handle,sag [nformat],81);

// инициализация работы с БД

j=coreleft () /1024-50;

if (j>256) j=256;

if (a=PXSetDefaults (j,1,30,MAXLOCKHANDLES,3,SortOrderAscii)) printf ("&bsol;n%s",PXErrMsg (a));

if (a=PXInit ()) printf ("&bsol;n%s",PXErrMsg (a));

if (a=PXTblOpen (argv [1],&tblh,0,0)) printf ("&bsol;n%s",PXErrMsg (a));

PXRecNFlds (tblh,&nflds);

x= (int *) calloc (argc+1,sizeof (int));

// разбор аргументов запроса

for (i=5; i<argc; ++i)

{

if (argv [i] [0] =='-') continue;

++n;

for (c=argv [i],j=1; *c! ='&bsol;0'; ++c)

{

if (*c==',') ++j;

if (*c=='_') *c=' ';

}

x [i-2] =j;

if (j>1) ++p;

}

// главный блок

switch (argv [2] [0])

{

case '0': low=1; PXTblNRecs (tblh,&high);

initsearch (argv,x,p,n);

break;

case '1':

PXDateEncode (atoi (argv [3]),atoi (argv [3] +3),atoi (argv [3] +6),&date1);

PXDateEncode (atoi (argv [3] +11),atoi (argv [3] +14),atoi (argv [3] +17),&date2);

interval (date1,date2,argv [4],argv [4] +9);

initsearch (argv,x,p,n);

break;

case '2':

PXDateEncode (atoi (argv [3]),atoi (argv [3] +3),atoi (argv [3] +6),&date1);

PXDateEncode (atoi (argv [3] +11),atoi (argv [3] +14),atoi (argv [3] +17),&date2);

interval (date1,date2,argv [4],argv [4] +9);

if (low==1 &&! high) break;

if (low==1)

{

PXRecBufOpen (tblh,&rech);

PXRecGet (tblh,rech);

PXGetDate (rech,1,&date1);

PXRecBufClose (rech);

}

PXTblNRecs (tblh,&num);

if (high==num)

{

PXRecBufOpen (tblh,&rech);

PXRecLast (tblh);

PXRecGet (tblh,rech);

PXGetDate (rech,1,&date2);

PXRecBufClose (rech);

}

for (; date1<=date2; ++date1)

{

interval (date1,date1,argv [4],argv [4] +9);

if (low>high) continue;

initsearch (argv,x,p,n);

}

break;

case '3':

PXDateEncode (atoi (argv [3]),atoi (argv [3] +3),atoi (argv [3] +6),&date1);

interval (date1,date1,argv [4],argv [4] +9);

initsearch (argv,x,p,n);

}

free (x);

if (a=PXTblClose (tblh)) printf ("&bsol;n%s",PXErrMsg (a));

PXExit ();

close (handle);

}

// initsearch

// выбор функции поиска

void initsearch (char *argv [], int *x, int p, int n)

{

if (low>high) return;

if (p) search3 (argv+5,x);

else if (n) search2 (argv,x,n);

else search1 ();

}

// Функция mem_args возвращает адрес строки параметров в случае ее передачи через память

#include "conn_mem. h"

char **mem_args ()

{

char ***dat;

dat= (char ***) conn_mem ();

return dat [ARGS_OFF/4] ;

}

// bs2_inq. prj

// INQUIRY&bsol;interval. c

// interval ()

// определение граничных номеров интервала поиска