Статистичне моделювання сітьового графіка побудови судна

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

20

7.080401. 5142.06. КП

МІНІСТЕРСТВО ОСВІТИ  І НАУКИ УКРАЇНИ

УКРАЇНСЬКИЙ ДЕРЖАВНИЙ МОРСЬКИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

імені адмирала Макарова

Кафедра Інформаційних Технологій



ЗАВДАНЯ

На курсову роботу з курсу

“Моделювання виробничих процесів у суднобудуванні”



Студент  5142 групи       Ковальов Д.В.

	1)	Тема курсової роботи : Cтатистичне моделювання сітьового графіка побудови судна           . 

2)	Основні початкові дані наведено у таблиці 1.

3)	Структура розрахунково-пояснювальної записки:

	a)	Титульний лист;

b)	Завдання на курсову роботу;

c)	Анотація (українською, російською, англійською);

d)	Зміст;

e)	Перелік умовних означень;

f)	Вступ;

g)	Загальна частина (Розділ 1);

Спеціальна частина (Розділ 2, 3);

i)	Висновки;

j)	Список використаної  літератури;

k)	Додатки.



	4)	Дата видачі завдання “     ”           ___            2006 року



	5)	Строк здачі студентом готової роботи   “     ”           ____            2006 року 



Керівник курсової роботи  Шнейдер  О. Б.



Студент                          н


 Таблиця 1 - Початкові дані

Коди робіт

Найменування робіт

Оцінка тривалості





Варіант





6

1-2

Підготовка стапеля до закладення судна 

1	1.5

2-5

Зборка і зварювання днищевих секцій 1 будівельного району (79-134 шп.) 

13	14

2-3

Зборка і зварювання днищевих секцій у районі 75-79 шп.

4          4.3

3-6

Зборка і зварювання секцій  перегородок , бортів і палуб у районі 75-79 шп.

20	21

3-4

Зборка і зварювання днищевих секцій у районі 71-75 шп.

5	5.1

5-8

Іспит на непроникливість міждонних відсіків 1 будівельного району

8.7	8,8

6-12

Монтаж систем (вантажний, зачистний і обігріву) у районі 75-79 шп.

16	16.6

6-7

Залежність

0	

4-7

Зборка і зварювання секцій  перегородок , бортів і палуб у районі 71-75 шп. 

15	16

4-10

Зборка і зварювання секцій у районі 67-71 шп. 

5	5.8

7-12

Монтаж систем у районі 71-75 шп.

13	14

7-11

Залежність

0

10-11

Зборка і зварювання секцій  перегородок , бортів і палуб у районі 67-71 шп. 

18	19

10-13

Зборка і зварювання днищевих секцій у районі 63-67 шп. 

7	8

11-12

Монтаж систем у районі 67-71 шп.

17	18

11-14

Залежність

0

12-20

Іспит на непроникливість вантажних танків у районі 67-79 шп.

6	7

13-16

Зборка і зварювання днищевих секцій у районі 59-63 шп. 

9	10

13-14

Зборка і зварювання секцій  перегородок , бортів і палуб у районі 63-67 шп. 

15	16

14-19

Монтаж систем у районі 63-67 шп.

15	17

14-17

Залежність

0

16-17

Зборка і зварювання секцій  перегородок , бортів і палуб у районі 59-63 шп. 

20	25

17-19

Монтаж систем у районі 59-63 шп.

20	23

8-22

Фарбування підводної частини корпусу в районі 79 шп. – корми

30	35

20-22

Фарбування підводної частини корпусу в районі 67-79 шп. 

4	7

19-21

Іспит на непроникливість вантажних танків у районі 59-67 шп.

8	12

21-22

Фарбування підводної частини корпусу в районі 59-67 шп. 

2	8


АННОТАЦИЯ



В данном курсовом проекте моделируется сетевой график (СГ) построения судна методом статистических испытаний. 

В работе проводится разработка программного обеспечения, решающего две задачи:

		реализующего модель сетевого графика и позволяющего расчитывать временные параметры проекта, а также изображать модель в виде диаграммы Гантта;

		моделирующего  сетевой граф методом статистических испытаний.

Курсовой проект изложен на 41 страницах машинописного текста, содержит 5 рисунков, 3 таблицы, 1 приложение.

Работа выполнена на украинском языке.



АНОТАЦІЯ

В даному курсовому проекті моделюється сітьовий графік (СГ) побудови судна методом статистичних випробувань. 

В роботі проводиться розробка двох типів програмного забезпечення:

		того, що реалізує модель сітьового графіка і дозволяє розрахувати часові параметри проекту, а також зобразити модель у виді діаграми Гантта;

		того, що моделює  сітьовий графік методом статистичних випробувань.

Курсовий проект виконано на 41 сторінках друкованого тексту, містить 5 рисунка, 3 таблиці, 1  доданок. 

Робота виконана українською мовою.



ANOTATION

The shipbuilding net graph modeling was done in the term work. It’s introduced with the purpose of reception of the maximal profit from work of some enterprise.

The work is done on 41 pages of the printed text, contains 5 illustrations. The work also has 1 appendices, which contain the text and results of performance of the program. For creation of this work were used three sources of information.

    The work is done in the Ukrainian language.


ЗМІСТ





		Перелік умовних означень 	4 

		Вступ 	6 

	 Загальна характеристика предметної області	6

		1.1   Дослідження процесу побудови судна ……………………………………….7

	Аналіз процесу побудови судна як об’єкта управління…...……………7

	Поняття технологічного та виробничого процесів у суднобудуванні…………………………………….…………………..….8

		1.1.3   Особливості виробничого процесу  у суднобудуванні............................8

		1.1.4   Принципи формування планово-облікових одиниць…...........................9

		Етапи побудови суден.................................................................................9

1.1.6   Причини використання СУПС………………………………………..…10

1.2   Аналіз методів управління проектами………………………………………..10

                    1.2.1    Метод критичного шляху…………………………………………….…11

                    1.2.2    Метод критичного шляху та основні параметри сітьового графіка…12

1.3   Вітчизняний і закордонний досвід використання СУПС…………………...13

1.4   Змістовна постановка задачі………………………………………………….16

		2.   Розробка детермінованої моделі сітьового графіка і моделювання ……………17 

	2.1 Розробка програмного забезпечення для моделювання детермінованої моделі………………………………………………………………………….....17 

		3.  Моделювання сітьового графіка методом статистичних випробувань …………19 

	3.1 Описання теоретичної суті методу …………………………………………...19 

	3.2 Розробка програмного забезпечення для моделювання……………………..23 

	3.3 Результати розрахунків…………………………………………………….…..24 

		Висновки ………………………………………………………………………………..29   

	Список використаної літератури ……………………………………………………...30 

Додаток А - Текст програми …………………………………………………………..31


ПЕРЕЛІК УМОВНИХ ОЗНАЧЕНЬ



В курсовій роботі використовуються наступні умовні означення:

	СУПС – система управління проектами у суднобудуванні

	СГ – сітьовий граф

	СПК – сітьове планування і керування

	CPM – Critical Path Method

	PERT – Program Evolution and Review Technique

	ВП – виробничий процес


ВСТУП



Собівартість судна як виду продукції багато в чому визначається прийнятими конструктивними рішеннями. У силу зростання ролі вартості проектних і конструкторських робіт у виробничих витратах варто прагнути до прийняття конструкторами раціональних рішень за мінімальний час. Для цього використовується спеціальне ПЗ, що дозволяє планувати роботи у побудові судна - система управління проектами у суднобудуванні (СУПС). В свою чергу СУПС використовує технологію сітьового планування і керування.

Для дослідження моделювання виробничих процесів у суднобудуванні темою цієї курсової роботи було обрано розробка сітьових графіків побудови судна та їх дослідження методом статистичних випробувань. В ході роботи буде розроблене алгоритмічне та програмне забезпечення.

Для досягнення вказаної мети потрібно зробити наступні кроки:

	проаналізувати предметну область дослідження;

	виконати змістовну постановку задачі, що розв’язується у роботі;

	описати теоретичну суть та послідовність розрахунків імовірнісних
              характеристик параметрів проекту для методу статистичних випробувань; 

	розробити детерміновану модель сітьового графіка, що дозволяє розрахувати
              часові параметри проекту і зобразити модель у виді діаграми Гантта і 
              провести моделювання за початковими даними;

	розробити програмне забезпечення для статистичного моделювання сітьового 
              графіка  за початковими даними;

	зробити висновки по роботі та досягнутим результатам.

			


1    ЗАГАЛЬНА ХАРАКТЕРИСТИКА ПРЕДМЕТНОЇ ОБЛАСТІ



1.1 Дослідження процесу побудови судна



1.1.1  Аналіз процесу побудови судна як об’єкта управління



Структура виробничого процесу Р(I) виготовлення виробу I   у машинобудуванні і приладобудуванні визначена державними стандартами Єдиної системи технологічної документації (ЕСТД) і є, як і структура виробу, ієрархічною.

Структуризація виробничого процесу Р(I) і визначаючої його організаційної і технологічної документації полягає у побудові графа типу „дерево", у якому Р(I) є коренем (нульовий ступінь входження):

,     ;   

де n - змінна: n  2; Г(Р(I)) визначає сукупність технологічних процесів Тi, що складають нульову ступінь входження структури виробничого процесу;

,

,  ;  ,  де n, m - зміннi: n, m  2;

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

При побудові певного типу судів складається сітьовий граф технологічних операцій, які формують виробничий процес. В графі фіксуються зв’язки між цими операціями та їх час виконання.

Розмаїтість типів судів, значні номенклатура і число (десятки, сотні тисяч) деталей корпуса судна (середньо -, крупнотоннажного) вимагає автоматизації всіх стадій їхнього створення, що здійснюється інтеграцією систем різного функціонального призначення: автоматизованих систем наукових досліджень, систем автоматизованого проектування судів, систем автоматизованого проектування технологічної підготовки виробництва верфі, нормування трудомісткості, систем управління проектами у суднобудуванні (СУПС).

Проект – сукупність дій, спрямованих на досягнення мети з заданими характеристиками в обмежені строки та з обмеженою множиною ресурсів. В основі методів управління проектами полягає технологія сітьового планування. Системи сітьового планування та управління – методи оптимізації планування та управління комплексом робот, математичною основою яких є теорія графів. Системи сітьового планування та управління відносяться до автоматизованих систем управління та призначені для управління комплексом робот різноманітного ступеня складності. 

Робота – деяка діяльність, яка потрібна для досягнення конкретних результатів на самому низькому рівні. Є дискретною компонентою проекту на самому низькому рівні деталізації та є основою для організації даних.

Веха(подія) – визначена дата в процесі виконання проекту. Використовується для відображення стану завершеності тих чи інших дій.

Принцип інтеграції систем можна реалізувати при створенні й експлуатації єдиної бази даних, що включає два види інформації: загального призначення, що не залежить від проектів споруджуваних судів і виробничих умов підприємства-будівельників і специфічної, що формується в процесі функціонування систем і характеризує конструктивні особливості проектів судів і технологічні особливості їхнього будування.



		Поняття технологічного та виробничого процесів у суднобудуванні.



Виробничий процес – сукупність усіх дій, спрямованих на перетворення матеріалів та напівфабрикатів в кінцеву продукцію – предмет виробництва.

ВП побудови судна включає отримання та обробку матеріалів для корпуса та обладнання, зборку та зварювання частин корпуса, виготовлення та монтаж різноманітних пристроїв, систем, апаратів та приборів, обробку приміщень, налагодження різноманітних технічних засобів, іспити та здачу судна замовнику. Велика кількість дій зводиться в єдину систему для правильного координування та управління.

Частина виробничого процесу, яка пов’язана  зі зміною та наступним визначенням станів предмету виробництва, називається технологічним процесом.

Технологічний процес – сукупність дій необхідних безпосередньо для виробництва або ремонту судна.

У ході технологічного процесу виконуються трудові дії. Вони призводять до зміни форми, зовнішнього виду чи внутрішніх якостей предмету праці.

Технологічний процес ділиться на операції.

Операція – це закінчена  частина  технологічного процесу, яка виконується на одному робочому місці. Операція є основною частиною при плануванні та обліку процесі виробництва.



1.1.3 Особливості виробничого процесу  у суднобудуванні.



Виробничий процес у суднобудуванні має відмінності порівняно з іншими промисловостями. Це обумовлено специфікою об’єкту виробництва. Виробничий процес складається з великою кількості операцій та має наступні особливості:

		Проектування та побудова судів ведеться паралельно з робочим проектуванням та побудовою головного судна.

		Число конструктивних елементів та кількість технологічних змін досягає декількох тисяч.

		Необхідність в використанні спеціальних побудовочних місць.

		Число контрагентів (поставників), які приймають участь в побудові досягає декількох сотен.

		Номенклатура найменованій деталей та зборочних одиниць  досягає 106.

		Нерівномірність споживання матеріальних та трудових ресурсів.

		Конструктивна складність виробу та як висновок необхідність використання планово-облікових одиниць.

 




1.1.4 Принципи побудови планово-облікових одиниць.



Так як судно це складний об’єкт, то планово-облікові одиниці будуються методом “з веху – до низу”. Тобто починаючи з кінцевого продукту і до дрібних операцій. Схема побудови  планово-облікових одиниць:  

Судно (замовлення).

Технологічний етап – відносно крупний, кінцевий комплекс робіт, що характеризує досягнення визначеного ступеня фізичної готовності.

Цехоетап – комплекс робіт, що виконуються цехом в технологічному етапі.

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

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

Бригадо-комплект – сукупність робіт, що виконуються бригадою.

Дослідження показали, що на кожному підприємстві існує своя система, яка не задовольняє принципам формування планово-облікових одиниць. Методологічною основою для автоматизації календарного планування є методи та системи управління проектами.



1.1.5 Періоди побудови суден.



Так як час побудови судна досить тривалий, то для зручного обліку виконання робіт прийнято поділяти його на періоди. Хоча періоди досить обособлені але вони можуть виконуватись паралельно, але більш раціонально щоб вони виконувались послідовно. 

Виробничий цикл побудови судна поділяється на періоди:

Заготовчий період – частина ВВ, що включає роботи, які виконуються від початку обробки метала до початку зборки секцій та блоків. На протязі заготов чого періоду виготовлюють деталі корпуса судна, вузлові секції корпуса, труби, елементи систем, пристроїв, обладнання суднових приміщень.

Блочний період – частина ВВ, включає роботи, які виконуються від початку зборки блоків до початку формування корпуса. В цьому періоді збирають блоки, секції, встановлюють в них механізми, ділянки трубопроводів, елементи суднових систем та пристроїв.

Стапельний період – частина ВВ, включає роботи, які виконуються від початку формування корпуса на стапелі до спуску судна на воду. На протязі цього періоду формується корпус, іспитується на непроникливість блоки секцій, виконується монтаж головних та частини допоміжних механізмів, монтаж валопроводів, систем та пристроїв, монтаж ізоляції.

Добудовчий період – частина ВВ, включає роботи, які виконуються після спуску судна на воду та до початку швартових випробувань, закінчується монтаж механізмів, систем, вентиляції та систем кондиціювання, робіт по обладнанню та обробці приміщень.

Здаточний період – роботи, що виконуються від початку швартових випробувань та до здачі  замовнику. 





Причини використання СУПС.



Відомо, що терміни розробки проектної документації як у цілому так і для окремих етапів будівництва судна, істотно впливають на величину витрат виробництва і ціну судна. Справді, собівартість судна як виду продукції багато в чому визначається прийнятими конструктивними рішеннями. Більш того, вплив цих рішень зростає в міру реалізації проекту судна, тому що вони лежать в основі організації постачань і закупівель комплектуючих виробів, що дуже важко змінити, а також у виготовлені суднові конструкції, які дуже складно переробляти. Роботи ці дорогі, оскільки конструкторські рішення альтернативні, важливо переконатися, що всі основні рішення оптимальні і прийняті настільки вчасно, наскільки це дозволяє специфіка проекту судна. 

Радикальні конструкторські зміни, що виникли в ході реалізації проекту судна, впливають на витрати не пропорційно часу просування робіт, а по експонентному законі. Цим підтверджується необхідність прийняття на можливо ранньої стадії максимально можливого числа основних конструкторських рішень. У силу зростання частки вартості проектних і конструкторських робіт у виробничих витратах варто прагнути до прийняття конструкторами раціональних рішень за мінімальний час. 

Цього можна досягти за допомогою систем, що дозволяють проаналізувати весь проект і його окремі частини, що забезпечують швидкий доступ до точної інформації. Саме таку можливість надають системи управління проектами у суднобудуванні, яка включає велику кількість підсистем, що контролюють окремі задачі.



1.2 Аналіз методів управління проектами



Технологія сітьового планування і керування (СПК), що є основою систем управління проектами у суднобудуванні, складається з наступних методів: метод діаграм Гантта і мережні методи планування. 

Діаграма Гантта (рис. 1) уявляє собою лінійний графік, що задає терміни початку і закінчення взаємозалежних дій, що складають єдиний технологічний процес, який потрібно виконати для досягнення мети проекту.  Основні недоліки методу діаграм Гантта: складність формалізації процедур їх (діаграм) аналізу; відсутність можливості встановлення залежностей між різними діями. 



Рисунок 1 - Діаграма Гантта



До позитивних якостей варто віднести простоту і наочність. Сучасні системи планування використовують модифіковані діаграми Гантта, у яких перелічені вище недоліки більшою мірою усунуті. 

До класичних методів у групі мережних методів планування відносяться: 

- метод критичного шляху (Critical Path Method - CPM); 

- метод аналізу й оцінки програм (Program Evalution and Review Techique-PERT). 



1.2.1 Метод критичного шляху та основні параметри сітьового графіка



Застосування методу CPM дозволяє представити комплекс взаємозалежних дій у вигляді графічної нотації сітьової моделі - сітьового графіка. Сітьовий графік - це орієнтований граф без контурів. Орієнтовані дуги графа інтерпретують роботи. Вершини графа, з'єднані дугами, називають подіями (віхами). Та сама подія-вершина може служити початком одних і кінцем інших дуг-робіт. Подія виражає готовий результат: усі роботи, що входять у подію, кінчені. Вона також виражає логічний зв'язок між роботами, що полягає в тому, що роботи, що входять у дану подію, безпосередньо передують роботам, що виходять з нього; жодна вихідна з даної події робота не може починатися до закінчення всіх робіт, що входять у цю подію. Якщо робота не має попередньої, то вона виходить з події, що є початком проекту, тобто з події, що не має вхідних дуг. Роботи, що не передують ніяким іншим, входять у подію, що є кінцем проекту, тобто в подію, що не має вихідних дуг. Будь-яка інша подія має вхідні і вихідні дуги.

Основним параметром сітьового графіка є тривалість критичного шляху - самого тривалих зі шляхів від вихідної події до завершальної. Важливість критичного шляху визначається тим, що у випадку затримки виконання дій, що складають критичний шлях, затримується термін виконання всього проекту. Отже, щоб це не відбулося, виконанню даних дій варто приділити більш пильну увагу. 

Сітьовий графік  наочне зображення проекту, що відображає технологічний взаємозв'язок між роботами. Початкова інформація про проект повинна містити перелік усіх робіт, послідовність їхнього виконання і тривалість кожної роботи.

До основних розрахункових параметрів сітьового графіка відносяться: t(Lкр) - довжина критичного шляху; tp(i) - можливий ранній термін настання події i; tn(i) - пізній припустимий термін настання події i; P(i) - резерв часу події; tр.н.(ij) - можливий ранній термін початку роботи (ij); tп.н.(ij) - пізній припустимий термін початку роботи (ij); tр.о.(ij) - можливий ранній термін закінчення роботи (ij); tп.о.(ij) - пізній припустимий термін закінчення роботи (ij); Pп(i) - повний резерв часу роботи (ij); Pс(i) - вільний резерв часу роботи (ij).

Найбільш ранній термін здійснення події - це термін, необхідний для виконання всіх робіт, що передують даній події. Цей час знаходиться шляхом вибору максимального значення тривалості всіх шляхів, що передують даній події:

 ,

де t(L’max) - тривалість максимального з попередніх події i шляхів.

Пізній припустимий термін настання події i - це такий термін здійснення  події, перевищення якого викликає аналогічну затримку настання завершального події. Іншими словами, пізній термін настання події - це різниця між довжиною критичного шляху і максимальним по тривалості шляхом, що виходить з цієї подієї:

tn(i) = t(Lкр) - t(L”max),

де t(L”max) - тривалість максимального з усіх шляхів, що починаються з події i.

Резервом часу події називається різниця між пізнім і раннім терміном настання цієї події:

P(i) = tn(i) - tp(i).

Резерв часу події показує, на який гранично припустимий період часу модно відстрочити настання цієї події без порушення термінів завершення розробки в цілому.

Вихідна і завершальна події сітьового графіка у всіх випадках не мають резервів часу. Крім того, резерв часу дорівнює нулю для всіх подій, що лежать на критичному шляху.

Ранній термін початку роботи (ij) дорівнює ранньому терміну настання події і:

tр.н.(ij) = tp(i)

Знаючи ранній термін початку роботи і її очікувану тривалість t(ij), визначають ранній термін закінчення роботи:

tр.о.(ij) = tp.н(ij) + t(ij).

Пізній термін закінчення роботи (ij) визначається як пізній термін настання події j, тобто події, що є кінцевою для даної роботи:

tп.о.(ij) = tп.(j).

Знаючи пізній термін закінчення роботи й очікувану тривалість, можна визначити пізній термін початку цієї роботи: 

tп.н.(ij) = tп.o.(ij) - t(ij).

Повний резерв часу роботи - це різниця між пізнім і раннім термінами початку чи, відповідно, закінчення цієї роботи. Він показує, на яку наявну величину запасу часу може бути збільшена тривалість даної роботи без зміни тривалості критичного шляху:

Pn(ij) = tn(j) - tp(i) - t(ij).

Вільний резерв часу роботи - це максимальна кількість часу, на яке можна збільшити тривалість роботи, не змінюючи при цьому термінів початку наступних робіт. Вільний резерв визначається по формулі

Pс(ij) = tр(j) - tp(i) - t(ij).





1.2.2  Метод аналізу й оцінки програм 

Методи сіткового планування - методи, основна мета яких полягає в тім, щоб скоротити до мінімуму тривалість проекту. Ґрунтуються на розроблених практично одночасно і незалежно методі критичного шляху МКП і методі оцінки і перегляду планів PERT (Program Evaluation and Review Technique). Перший метод розроблений у 1956 році для складання планів-графіків великих комплексів робіт з модернізації заводів фірми "Дюпон". Другий метод розроблений корпорацією "Локхид" і консалтинговою фірмою "Буз, Аллен энд Гамильтон" для реалізації великого проекту розробки ракетної системи "Поларис". 

Якщо в методі CPM тривалості планованих дій характеризуються детермінованими величинами, тобто час виконання дії відомо, то в методі PERT - випадковими, що характеризуються трьома видами оцінок: оптимістична, песимістична, найбільш ймовірна тривалість. Тимчасові параметри сітьового графіка визначаються за аналогією з методом CPM, з тією лише різницею, що за час виконання робіт приймається середнє значення. 

Описані вище методи CPM і PERT є класичними і спочатку використовувалися незалежно друг від друга. Зараз вони складають єдиний метод сітьового планування і керування, що включає наступні три етапи: структурне планування, календарне планування, оперативне керування планом. 

Етап структурного планування починається зі складання переліку (упорядкованого) робіт, виконання яких приведе до досягнення мети проекту. Потім визначаються тривалості робіт і будується сітьовий графік, що є основою календарного планування.



1.3  Вітчизняний і закордонний досвід використання СУПС



 Як відомо, у створенні сучасного судна бере участь значна кількість різних підрозділів, що виконують свої функції у відведені тимчасові періоди, створюють матеріальний і/чи інформаційний продукт, передача якого іншим підрозділам створює умови для спільної цілеспрямованої діяльності суднобудівного підприємства (об'єднання). Очевидно, що рівень взаємодії підрозділів істотно впливає на оптимальну тривалість створення судна, а також на величину витрат виробництва.

Досягти реального скорочення термінів проектування при використанні локальних систем автоматизації неможливо. Відповідно до основної специфікації на створення інтегрованої системи коло розв'язуваних задач повинне охоплювати всі стадії проектування, починаючи від передконтрактної документації, генерації тривимірної моделі корпуса, оббудовування приміщень, мехчастини, трубопроводів і систем, электрочастини і т.і., випуску двох- і тривимірних робочих креслень, суднової звітної документації по всім спеціалізаціям, технологічну підготовку виробництва аж до видачі керуючих програм для верстатів із ЧПУ, а також вирішення задач по організації і керуванню виробництвом.

Комплексна (інтегрована) інформаційна система (КІС) — це сукупність технічних і програмних засобів підприємства, що реалізують ідеї і методи автоматизації. Комплексна автоматизація має на увазі переклад у площину комп'ютерних технологій всіх основних ділових процесів організації. Структура виробничого підприємства (об'єднання) дозволяє здійснити системний підхід у забезпеченні високого рівня взаємодії підрозділів на основі наскрізної комп'ютеризації всіх стадій створення судна шляхом розробки і впровадження інтегрованої системи автоматизованого проектування, технологічної підготовки, організації і керування суднобудівним виробництвом з використанням єдиної бази даних. 

Уведення системи керування проектами (СКП) до складу КІС дозволяє здійснювати стратегічне планування і керування підприємством. Сучасні системи керування процесами дозволяють інтегрувати навколо себе різне програмне забезпечення, формуючи єдину інформаційну систему. Тим самим зважуються проблеми координації діяльності співробітників і підрозділів, забезпечення їхньою необхідною інформацією і контролю виконавської дисципліни, а керівництво одержує своєчасний доступ до достовірних даних про хід виробничого процесу і має засіб для оперативного прийняття і втілення в життя своїх рішень. І, що саме головне, отриманий автоматизований комплекс являє собою гнучку відкриту структуру, яку можна перебудовувати і доповнювати новими чи модулями зовнішнім програмним забезпеченням.

Прикладом вітчизняних розробок є складова частина інтегрованої системи – система нормування трудомісткості САНТ (розробник Г. І. Карпов).

Система автоматизованого нормування трудомісткості (САНТ) формує в єдиній базі дані нормативи трудомісткостей технологічних операцій у різних видах суднобудівного виробництва. В окремому випадку ці нормативи разом з розмірами (нормообразуючі показники) деталей корпусних конструкцій (САПР ТПП верфі) складуть основу автоматизованого розрахунку норм часу виконання технологічних операцій за допомогою гнучких виробничих модулів обробки деталей з листового і профільного прокату.

Інформаційні масиви САНТ у єдиній базі даних містять аналітичні залежності нормативів часу, упорядкованих по ключових реквізитах, а також необхідні зварювальні дані. Визначено ключові реквізити (позначення - технологічних операцій, нормативів часу, причин зміни трудомісткостей, коефіцієнтів серійності судна), що забезпечують однозначну ідентифікацію нормативів часу кожної технологічної операції, а також інформаційний взаємозв'язок із САПР ТПП верфі.

Основним вихідним масивом САНТ у єдиній базі даних є масив трудомісткостей технологічних операцій, структура якого забезпечує збереження і відновлення інформації на будь-яке серійне судно даного проекту з урахуванням усіх коректувань, починаючи з головного. Таким чином, дублювання інформації при переході з одного серійного судна на інше в масиві виключено. Структура масиву дозволяє по запиту автоматизовано проводити вибірку інформації про трудомісткості будь-яких робіт верфі, забезпечує інформаційний зв'язок з АСУ підприємств - будівельників судів.

У той же час як показав аналіз можливостей САПР реалізованих у вітчизняній суднобудівній промисловості, а також технічних можливостей апаратних засобів вітчизняного виробництва, необхідно орієнтуватися на закордонних постачальників апаратного і програмного забезпечення при розробці і впровадженні інтегрування системи на базі закуплених апаратних і програмних засобів, адаптованих до умов кожного суднобудівного підприємства (об'єднання) і використовуючих наявні власні розробки.

Досить популярною СКП є російське ПЗ Spider Projects. Проте ця програма має досить багато недоліків, що обмежує її застосування у суднобудівництві.

З зарубіжних СУП поширені Microsoft Project, Symantec Time Line, Open Plan, Primavera. Так  в українському судобудівництві досить часто використовують Microsoft Project.

На базі аналізу ринку ПЗ СКП, виконаного консалтінговою компанією Gather, була складена порівняльна таблиця (табл. 2).



Таблиця 1 – порівняння MS Project, Primavera и Spider  



Критерий оценки

Microsoft Project 2002 Professional

Primavera P3e

Spider Project

Планирование проекта

Интерфейс аналогичен MS Office

Да

Нет

Нет

Интерактивный самоучитель

Да

Нет

Нет

Трудоемкость разработки структур работ

Низкая

Высокая

Низкая

Более чем 1 связь между работами

Нет

Да

Нет

Планирование от "Объема"
("реалии управления в 80-х годах прошлого века")

Требуется знать методику
использования

Нет

Да

Структуры ресурсов

Да

Да

Да

Мастера предоставления и оптизации ресурсов для проекта

Да

Нет

Нет

Профили загрузки

Да

Да

Нет

Разделяемые пулы
(Управление ресурсами проектного подразделения в целом)

Да

Да

Нет

Управление портфелями проектов

Да

Да

Нет

Планирование затрат

Да

Да

Да

Сверхурочные затраты

Да

Да

Нет

Оценка влияния рисков через имитационное моделирование 
"а что если?"

Да

Да

Нет

Анализ вероятности окончания проекта по условиям

Нет

Нет

Да

Интерактивная оптимизация планов проекта

Да

Да

Нет

Автоматическая оптимизация без интерактивности

Да

Да

Да

Отслеживание и управление проектом

План/фактный анализ

Да

Да

Да

Профессиональная проектная статистика на базе промышленного OLAP-сервера

Да

Нет

Нет

Автоматический запрос о статусе работе исполнителям

Да

Да

Нет

Информирование о статусе работ топ-менджеров

Да

Да

Нет

Отслеживание объемов

Требуется знать методику  использования

Нет

Да

Освоенный объем

Да

Да

Да

Коллективная работа

Работа на основе промышленной СУБД (SQL Server)

Да

Да

Нет

Web-доступ к проектной информации

Да

Да

Нет

Web-анализ состояния ресурсов

Да

Да

Нет

Поддержка мобильных средств класса Palm

Нет

Да

Нет

Взаимодействие с исполнителями

Да

Да

Нет

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

Да

Да

Нет

Средства для принятия стратегических решений 
топ-менеджерами

Да

Да

Нет

Отслеживание запросов по контролю качества

Да

Нет

Нет

Интегрированная поддержка проектного документооборота

Да

Нет

Нет

Поддержка высшего руководства

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

Да

Да

Нет

Средства для принятия стратегических решений 
топ-менеджерами

Да

Да

Нет

Оценки применимости

Оптимальное сочетание цена/качество

Да

Нет

Нет

Сеть внедренцев

Широкая

Узкая

Узкая

Консалтинговая поддержка

Широкая

Узкая

Узкая

"Сегмент успеха" 

Лидерство в малых и средних компания

Ниша:
решения       свыше 350  раб. мест.

Компании с советскими методиками управления

1.4 Змістовна постановка задачі



На основі проведеного аналізу предметної області можна зрозуміти, що в ході курсової роботи для досягнення поставленої мети потрібно виконати три наступні підзадачі:



I. Розробка детермінованої моделі сітьового графіка, що дозволяє розрахувати часові параметри проекту та зобразити модель у виді діаграми Ганта, та проведення моделювання за отриманими початковими даними. Цю підзадачу можна розбити на такі кроки: 

	1.	Розробити програмні структури для обраного представлення сітьового графа (СГ).

2.	Розробити програмне забезпечення для топологічного аналізу СГ на наявність обривів та контурів.

3.	Розробити програмне забезпечення для розрахунку критичного шляху, визначення ранніх і пізніх термінів настання подій, ранніх і пізніх термінів початку і закінчення робіт, повних і вільних резервів часу виконання робіт.

4.	Результати розрахунків представити у виді таблиці.

5.	Розробити програмне забезпечення для графічного представлення СГ у  вигляді діаграми Ганта.



II. Розробка алгоритмічного та програмного забезпечення для статистичного моделювання сітьового графіка методом статистичних випробувань за отриманими початковими даними. Друга підзадача поділяється на два кроки: 

	1.	Описати теоретичну суть та послідовність розрахунків імовірнісних характеристик параметрів проекту.

	2.	Навести алгоритми основної програми, структуру вхідних і вихідних даних.



III. Основні висновки по роботі та аналіз досягнутих результатів. 


2   РОЗРОБКА   ДЕТЕРМІНОВАНОЇ   МОДЕЛІ   СІТЬОВОГО   ГРАФІКА  І ПРОВЕДЕННЯ  МОДЕЛЮВАННЯ



2.1 Розробка програмного забезпечення для моделювання детермінованої моделі



Розробка програмних структур для СГ

Маємо орієнтований граф G =(V, E), кожній дузі vw цього графа відповідає невід’ємна ціна С [v, w]. Загальна задача знаходження найдовших шляхів полягає в знаходженні для кожної вершини впорядкованої пари вершин (v, w) любого шляху від вершини v до вершини w, довжина якого максимальна серед усіх можливих шляхів від v до w.

Існує прямий спосіб розв’язання цієї задачі, використовуючий алгоритм Флойда (R. W. Floyd).  Для визначеності установимо, що вершини графа послідовно пронумеровани від 1 до n. Алгоритм Флойда використовує матрицю А розміру nхn, в якій обчислюються довжини найдовших шляхів. На початку А[i, j]=C[i, j] для усіх i≠j. Якщо дуга i j відсутня, то C[i, j]=-∞. Кожний діагональний елемент матриці А дорівнює 0.

Над матрицею А виконується n ітерацій. Після k-тої ітерації A[i, j] містить значення шляхів найменшої довжини з вершини i в вершину j, які не проходять через вершини з номером, більшим за k. Іншими словами, між кінцевими вершинами шляху i и  j можуть знаходитися вершини, номера яких менше чи рівні k. 

На k-тій ітерації для обчислення матриці А застосовується наступна формула:

Ak[i, j] = min(Ak-1[i, j], Ak-1[i, k] + Ak-1[k, j]).

Нижній індекс k позначає значення матриці А після k-тої ітерації, однак це означає, що існує n різних матриць, цей індекс використовується для скорочення запису. 

Для обчислення Ak[i, j] проводиться порівняння вершини Ak-1[i, j] (тобто ціна от шляху від вершини i до вершини j без участі вершини k чи іншої вершини з більш високим номером) з величиною Ak-1[i, k] + Ak-1[k, j] (ціна шляху від вершини i до вершини k плюс шляху від вершини k до вершини j). Якщо шлях через вершину k дорожче, ніж Ak-1[i, j], то величина Ak[i, j] змінюється.

Рівності Ak[i, k] = Ak-1[i, k] и Ak[k, j] = Ak-1[k, j] означають, що на  k-тій ітерації елементи матриці А, що стоять в k-тій строці и в k-м стовпці, не змінюються. Усі обчислення можливо проводити лише з однією копією матриці А.

Щоб встановити при необхідності найдорожчі шляхи, можна в алгоритмі Флойда ввести ще одну матрицю P, в якій елемент P[i, j] містить вершину k, отриману при знаходженні найбільшого значення A[i, j]. Якщо P[i, j] = 0, то найдовший шлях з вершини i в вершину j складається з однієї дуги i j. 

Модифікована версія алгоритму Флойда, що дозволяє відновити найдовші шляхи:

private void AlgorithmFloyda(double [,]C, int [,]P)

{

		int i,j,k;

		int nn = (int)Math.Sqrt(C.Length)-1;

		double [,]A = new double[nn+1,nn+1];

		for(i=1; i<=nn; i++)

			for(j=1; j<=nn; j++)

			{

				A[i,j] = C[i,j];

				P[i,j] = 0;

			}

		for(i=1; i<=nn; i++)

			A[i,i] = 0;

		for(k=1; k<=nn; k++)

			for(i=1; i<=nn; i++)

				for(j=1; j<=nn; j++)

					if(A[i,k] + A[k,j] >A[i,j])

					{

						A[i,j]=A[i,k]+A[k,j];

						P[i,j]=k;

					}



}



Програма повинна виконувати топологічний аналіз СГ на існування обривів та контурів. Якщо у СГ існує i-та вершина, з якої не виходить жодна дуга-робота (тобто  i-й рядок матриці містить лише від’ємні числа), то знайден обрив. Тоді вершина, що висить, видаляється з графа шляхом заміни i-го стовпця матриці числами, що символізують  -. Повідомлення про відповідні дії будуть записуватися у вихідний файл. Аналіз на існування контурів буде проводиться під час знаходження максимального шляху між вершинами: СГ є топологічно відсортованим, тому виявлення зворотної дуги vw (v>w) свідчить про наявність контуру. У цьому разі для попередження зациклювання виконання програми буде припинятися.

Розрахунок часових параметрів проекту буде виконуватися на основі наведеного алгоритму Флойда, що знаходить найдовші шляхи між парами вершин.

Застосовуючи цей алгоритм до прямої/інвертованної матриці СГ, можна отримати дані про шляхи максимальної тривалості, що передують кожній події/ слідують за кожною подією.

Розрахунок критичного шляху, визначення ранніх і пізніх термінів настання подій, ранніх і пізніх термінів початку і завершення робіт, повних и вільних резервів часу виконання робіт буде виконуватися на базі інформації, отриманої алгоритмом Флойда,  за формулами, що наведенні в I розділі.

Результати розрахунків будуть записуватися до файлу у вигляді таблиць, що містять часові параметри СГ.

Також програма буде формувати графічне представлення СГ - діаграму  Ганта. На діаграмі кожній роботі буде відповідати два часових параметра: безпосередньо тривалість роботи та її повний резерв.

Структура файлу вхідних даних: кожній роботі графа буде відповідати рядок, що складається з двох цілих та одного/двох дійсних чисел, вигляду 

i j Назва роботи C_min C_max.






3   МОДЕЛЮВАННЯ СІТЬОВОГО ГРАФІКА МЕТОДОМ СТАТИСТИЧНИХ ВИПРОБУВАНЬ



3.1 Описання теоретичної суті методу



Системи сітьового планування і керування в загальному випадку застосовуються для комплексів робіт, тривалість більшості яких не має нормативів.

У суднобудівній промисловості до них відносяться різні роботи на передпроектній і проектній стадіях, науково-дослідницькі, дослідно-конструкторські й експериментальні роботи, а також роботи з виготовлення та іспиту нових експериментальних зразків.

Невизначеність оцінок тривалості багатьох робот у суднобудуванні обумовлює імовірнісний характер виробничих сітей у галузі. У цих умовах застосовуються наступні ймовірносні способи оцінки тривалості кожної роботи:

	по однієї і тієї ж роботи оцінки даються декількома експертами;

	для робіт, що часто повторюються чи типових, установлюються найбільш імовірна tн.і. чи нормативна тривалість tнорм, що у розрахунках сітьового графіка приймається за очікувану тривалість роботи tоч;

	даються дві оцінки тривалості роботи:

	мінімальна tmin, тобто при найбільш сприятливому збігу обставин;

	максимальна tmax, тобто при несприятливому збігу обставин, який характеризується значно більшою, ніж звичайно, кількістю труднощів і затримок, що можуть виникати в процесі виконання цієї роботи;

	даються три оцінки тривалості:

	мінімальна;

	найбільш імовірна;

	максимальна.

Машинна обробка інформації про ймовірносні параметри сітьові моделі зводиться до обчислення:

	математичного сподівання і дисперсії тривалості всього комплексу операцій (Lкр), що описується даною сітьовою моделлю;

	довірчих інтервалів, що утримують значення тривалості комплексу операцій при заданих значеннях надійності;

	довірчої імовірності закінчення комплексу робіт зі створення об'єкта в директивний термін при заданих значеннях довжини довірчих інтервалів;

	математичних сподівань і дисперсій ранніх і пізніх термінів здійснення подій сітьової моделі;

	довірчих інтервалів, що утримують значення  ранніх і пізніх термінів здійснення подій сітьової моделі при заданих значеннях надійності;

	довірчих імовірностей здійснення подій сітьової моделі в запланований термін при заданих значеннях довжини довірчих інтервалів;

У наш час розв’язання перелічених задач здійснюється такими способами:



	зведенням імовірнісної моделі до детермінованого СГ, у якому математичні сподівання тривалості робіт приймаються за їхні детерміновані тривалості;



	дослідженням імовірнісної моделі методом статистичних іспитів (метод Монте-Карло).

У випадку зведення імовірнісної моделі до детермінованого СГ приймаються наступні допущення:

	критичний шлях і максимальні шляхи, що передують кожній події і виходять з неї, є єдиними;

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

Допущення існування в моделі єдиного критичного шляху і по одному максимальному шляху, що передують чи виходять з кожної події, не є точним. Побудова прикладів СГ, виключаючих це допущення, становить досить тривіальну задачу.

Внаслідок цього перше допущення не має теоретико-ймовірносного обґрунтування. При моделюванні за методом Монте-Карло створюється послідовність реалізацій СГ з випадковими тривалостями робіт. При цьому змінюється довжина критичного шляху та іноді список вершин, через які він проходить.

При моделюванні сітьового графіка методом статистичних випробувань       (м.  Монте-Карло) тривалості робіт реалізації СГ дорівнюють фіксованим значенням, отриманим з використанням статистичного моделювання по початковим даним.

Статистичне моделювання систем на ЕОМ є фактично сукупністю формальних процедур, засобами яких відтворюється на ЕОМ будь-які випадкові фактори (випадкові величини, випадкові події, випадкові функції з будь-яким розподілом). Вперше такі методи почали застосовувати для досліджень у галузі ядерної енергетики та військовій сфері наприкінці 40-х рр. XX ст.

Під час випробування вага  кожної дуги, що знаходиться у межах , розраховується за допомогою числа з нормальним розподілом  за формулою . Для отримання випадкових чисел можна використовувати один з наступних методів:

	апаратний - найбільш складний, бо заснований на фізичному явищі;

	табличний - потребує додаткової пам`яті, бо заздалегідь будуються таблиці випадкових чисел;

	програмний - за допомогою спеціальних алгоритмів.

Останні два методи на відміну від першого генерують псевдовипадкові числа. 



Існує програмний метод конгруентних генераторів, що дозволяє отримати числа з рівномірним законом розподілу. У ньому застосовується наступна формула:

					

де коефіцієнти a, b, c  не можуть бути довільними. В цій роботі a=97, b=1113, c=131072. 

Повний період циклу цього генератора буде отриманий в тому разі, якщо коефіцієнти будуть обиратися наступним чином:

C = 2B , B- розрядність використовуємого комп’ютера. Повний період буде 2B; 

a - вибирається за формулою a = 1+4k, де k - ціле число;

b - просте число відносно с (найбільший спільний дільник буде 1).















х

f(х)

fm

0

x1

x2



















Рисунок 3 - Метод вилучення

Метод вилучення (рис. 3) дозволяє отримати випадкове число, якщо ми знаємо щільність розподілу f(x) випадкової величини Х. Його суть полягає в наступних діях:

	спочатку генерується випадкове число x з рівномірним розподілом на сегменті ;

	потім ще одне - число Y, але на сегменті ;

	ці два числа беруться як координати точки, якщо вона підпадає під криву f(x) (тобто в межах кривої щільності імовірності) , то перше число X і є випадковим числом з шуканим розподілом, якщо ні - знову генеруємо пари чисел.

Моделювання сітьового графіка методом статистичних випробувань дає достовірні результати, коли кількість реалізацій перевищує сотню. Треба враховувати, що така велика кількість розрахунків доцільна лише для розріджених графів (не з великою кількістю робіт). Це головний недолік цього методу.

Як вже згадувалося вище при моделюванні тривалість критичного шляху Lкр, ранні і пізні терміни здійснення подій є випадковими величинами, імовірності характеристики яких треба з’ясувати. 



3.2  Знаходження характеристик вибіркового розподілу



При статистичній обробці експериментальних даних випадкової величини X знаходять оцінки числових характеристик, які найбільш часто зустрічаються, себто математичного сподівання і дисперсії:

	         - математичне сподівання (вибіркове середнє);

	 - виправлена (незміщена) дисперсія;

	            - середньоквадратичне відхилення.



Розглянуті оцінки називаються точковими, так як вони визначаються одним числом, зображеним точкою на числовій осі. Але при малому об’ємі вибірки точкова оцінка може значно відрізнятися від оцінюваного параметру а. Тому у ряді задач матстатистики вимагається знайти не тільки параметр а, але  його точність та надійність.

Для визначення точності оцінки  в матстатистиці користуються надійним інтервалом, а для визначення надійності - надійною ймовірністю.

Нехай для параметра а одержана із досліду незсунена  оцінка . Ми хочемо оцінити можливу при цьому помилку. Задаємо деяку велику ймовірність  (наприклад, =0,9; 0,95; 0,99; ...) таку, щоб подію з ймовірністю   можна було б вважати практично вірогідною, і знайдемо таке значення >0, для якого 

                                          (3.1)

Подамо (1) у вигляді міри довіри

                              (3.2)

Рівність (2) показує, що невідомі значення параметра а з ймовірністю  попадають у інтервал                                      					         (3.3)

Відмітимо, що тут невідоме значення параметра а являється випадковою величиною, а інтервал l і випадковою величиною, так як положення інтервалу на вісі залежить від в.п.  (центр інтервалу), довжина також у загальному випадку являється випадковою величиною. Тому ймовірність  у даному випадку тлумачать не як ймовірність попадання випадкової величини а в інтервал l , а як ймовірність того, що випадковий інтервал l  накриває точку а.





  г-            г           г+         а  





Рисунок 4 - Надійний інтервал   

Інтервал l (рис. 4) називається надійним інтервалом, а  - надійною ймовірністю або надійністю. Розглянемо приклад знаходження надійного інтервалу для математичного сподівання.

Треба побудувати надійний інтервал l, що відповідає надійній ймовірності , для математичного сподівання в.в. Х.

 Для цього користуються формулою  .    (3.4)  Зміст співвідношення (4): з надійністю  можна стверджувати, що надійний інтервал  накриває невідомий параметр mx; точність оцінки .

Отже, поставлена вище задача розв’язана. З рівності   або   по таблиці функції Лапласа  знаходимо аргумент t, якому відповідає значення функції Лапласа .

Також необхідно провести групування і побудову гістограми для Lкр, а також з’ясувати чи розподілена дана в.в. за нормальним законом за допомогою критерію Пірсона.

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

Увесь інтервал, одержаних значень хі розбивають на часткові інтервали (як правило рівні): (х1,х2), (х2,х3), ..., (хm+1,хm) і підраховують число nі величини Х, яка попала в інтервал (хі,хі+1). Значення, які  попали на кінець інтервалу, відносять або до правого, або до лівого інтервалу (хі,хі+1). Відмітимо, що . На основі результатів обробки дослідів будуємо таблицю 2, що є групуванням або інтервальний варіаційний ряд.

   Таблиця 2 - Інтервальний варіаційний ряд

Ii

(х1,х2)

(х2,х3)

...

(хk,хk+1)

ni

n1

n2

...

nk

pi*

p1*

p2*

...

pk*

   Відкладемо на вісі ОХ точки х1, х2, х3, ..., хk, хk+1, ... , хm. На відрізку [хі, хі+1] як на основі будуємо прямокутник, площа якого дорівнює рі*. Із способу побудови гістограми випливає, що повна площа її дорівнює 1.

Рисунок 5 - Гістограма і графік щільності випадкової величини Х

Очевидно, що при збільшенні числа  дослідів можна вибирати все більше і більше дрібні інтервали. При цьому гістограма (рис. 5) все більше і більше наближатиметься до деякої кривої, що обмежує площу рівну одиниці. Неважко бачити, що крива уявляє собою графік щільності випадкової величини Х.

Критерій Пірсона для перевірки гіпотези про нормальний розподіл обчислюється наступним чином:

,

де    - теоретичні частоти, що обчислюються як  ;                                       - емпіричні частоти;									    

       - кількість інтервалів варіаційного ряду.

  -  функція щільності для нормального закону.

Якщо , то гіпотеза приймається, в противному разі - відкидається.



3.2 Розробка програмного забезпечення для моделювання



Програмне забезпечення для моделювання сітьового графіка методом статистичних випробувань базується на ПЗ, розробленому в 2 розділі. Під час моделювання, суть якого описана в попередньому підрозділі, на дісплей виводяться діаграми Гантта для кожної реалізації сітьового графа, також заповнюються масиви Tкр, tр, tп. Після цього проводиться аналіз імовірносних характеристик отриманих випадкових величин. Результати аналізу заносяться до текстового файлу.

3.3 Результати розрахунків





Рисунок 1 – Временные параметры для tmin





Рисунок 2 – Диаграмма Ганта для tmin



Рисунок 3 – Временные параметры для tmax



Рисунок 4 – Диаграмма Ганта для tmax



Рисунок 5 – Временные параметры для tavg



Рисунок 6 – Диаграмма Ганта для tavg



Рисунок 7 –Розрахунок імовірностних характеристик L_kp



Рисунок 8 – График статистического распределения T_kp  

Данное распределение можно считать нормальным

Результати виконання прогрими зберігаються у файлах.


ВИСНОВКИ



Моделювання сітьового графіка методом статистичних випробувань можна вважати більш достовірним, ніж детерміноване моделювання, бо отримані параметри СГ розгдядаються в ньому як випадкові величини. Такий підхід дозволяє розробити модель, більш наближену до реальних умов процесу створення судна. Також треба відзначити, що метод Монте-Карло враховує зміну не лише довжини критичного шляху, а  й списку вершин, через які він проходить.

При моделювання сітьового графіка методом статистичних випробувань за початковими данними було з’ясовано, що Tкр є нормально розподіленою випадковою величиною. Це обумовлено тим, що критичний шлях був постійним в кожній з реалізацій. Проте не всі tр i tп подій розподілені за нормальним законом, це викликано недостатньою кількістю випробувань. Таке допущення підтверджується тим, що зі збільшенням числа випробувань, збільшується і кількість tр та tп, розподілених за Гаусом. Однак використаний компілятор не дозволяє збільшити кількість експериментів через перевищення допустимого розміру сегменту даних. Така сітуація характерна для даного методу, бо кількість даних для обробки при достатньо великій кількості робіт накладає певні вимоги до програмних та апаратних засобів. Такі вимоги і є головним недоліком для застосування методу статистичних випробувань.


СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ



Ахо, Альфред, В., Хопкрофт, Джон, Ульман, Джеффи, Д. Структуры данных и алгоритмы.: Пер. с англ.:Уч. пос. – М.: Издательский дом «Вильямс», 2000. – 384 с.: ил. – Парал. тит. англ.

Брехов А. М., Волков В. В. Организация судостроительного производства в условиях рынка. – СПб.: Судостроение, 1992. – 224 с., ил.

Колде Я. К. Практикум по теории вероятностей и математической статистике: Учеб. пособие для техникумов. – М.: Высш. шк., 1991. – 157 с.: ил.

Полковников А.В., Корпоративная система управления проектами, Электронный офис, 1997, Октябрь 

Полковников А.В., Линия на которой побеждают время, Электронный офис, 1997, Октябрь 




Додаток А – Текст программи



using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO;

using System.Diagnostics;

namespace WindowsApplication1

{

	public class Form1 : System.Windows.Forms.Form

	{

		private const int mx=5; 

		private const int ht=8; 

		private const int zz=130;

		private int n,m,k,v;

		static int /*nij,*/n_ij;

		private double Mx,S2x,Sx,X_2;

		private double L_kp_min,L_kp_max,L_kp_avg;

		private double L_kp_mat,L_kp_dsp,L_kp_otk;

		private System.Windows.Forms.MainMenu mainMenu1;

		private System.Windows.Forms.MenuItem menuItem1;

		private System.Windows.Forms.MenuItem menuItem2;

		private System.Windows.Forms.OpenFileDialog openFileDialog1;

		private ArrayList codi,codj,naim,mint,maxt;

		private double []tp_min; private double []tp_max; private double []tp_avg;

		private double []tn_min; private double []tn_max; private double []tn_avg;

		private double []R_min; private double []R_max; private double []R_avg;

		private double []r_min; private double []r_max; private double []r_avg;

		private double [,]tpn_min; private double [,]tpn_max; 

private double [,]tpn_avg;

		private double [,]tnn_min; private double [,]tnn_max; 

private double [,]tnn_avg;

		private double [,]tpo_min; private double [,]tpo_max; 

private double [,]tpo_avg;

		private double [,]tno_min; private double [,]tno_max; 

private double [,]tno_avg;

		private double [,]Rn_min; private double [,]Rn_max; 

private double [,]Rn_avg;

		private double [,]Rcb_min; private double [,]Rcb_max; 

private double [,]Rcb_avg;

		private double [,]C_min; private double [,]C_max; private double [,]C_avg;

		private int [,]P_min; private int [,]P_max; private int [,]P_avg;

		private double [,]C_rev_min; private double [,]C_rev_max; 

private double [,]C_rev_avg;

		private int [,]P_rev_min; private int [,]P_rev_max; 

private int [,]P_rev_avg;

		private System.Windows.Forms.TabControl tabControl1;

		private System.Windows.Forms.TabPage tabPage1;

		private System.Windows.Forms.TabPage tabPage2;

		private System.Windows.Forms.TabControl tabControl2;

		private System.Windows.Forms.TabPage tabPage3;

		private System.Windows.Forms.TabPage tabPage4;

		private System.Windows.Forms.TabPage tabPage5;

		private System.Windows.Forms.TabControl tabControl3;

		private System.Windows.Forms.TabPage tabPage6;

		private System.Windows.Forms.TabPage tabPage7;

		private System.Windows.Forms.TabPage tabPage8;

		private System.Windows.Forms.TabControl tabControl4;

		private System.Windows.Forms.TabPage tabPage9;

		private System.Windows.Forms.TabPage tabPage10;

		private System.Windows.Forms.DataGrid dataGrid1;

		private System.Windows.Forms.DataGrid dataGrid2;

		private System.Windows.Forms.PictureBox pictureBox1;

		private System.Windows.Forms.DataGrid dataGrid3;

		private System.Windows.Forms.PictureBox pictureBox2;

		private System.Windows.Forms.DataGrid dataGrid4;

		private System.Windows.Forms.PictureBox pictureBox3;

		private System.Windows.Forms.Label label1;

		private System.Windows.Forms.Label label2;

		private System.Windows.Forms.Label label3;

		private System.Windows.Forms.MenuItem menuItem3;

		private System.Windows.Forms.MenuItem menuItem4;

		private System.Windows.Forms.Label label4;

		private System.Windows.Forms.Label label5;

		private System.Windows.Forms.Label label6;

		private System.Windows.Forms.TabPage tabPage11;

		private System.Windows.Forms.Label label7;

		private System.Windows.Forms.Label label8;

		private System.Windows.Forms.Label label9;

		private System.Windows.Forms.PictureBox pictureBox4;

		private System.Windows.Forms.Label label10;

		private System.Windows.Forms.Button button1;

		private System.ComponentModel.Container components = null;



		public Form1()

		{

			InitializeComponent();

		}

		protected override void Dispose( bool disposing )

		{

			if( disposing )

			{

				if (components != null) 

				{

					components.Dispose();

				}

			}

			base.Dispose( disposing );

		}

		[STAThread]

		static void Main() 

		{

			Application.Run(new Form1());

		}



		static void Read_Data(string FileName,ArrayList codi,ArrayList codj,

ArrayList naim,ArrayList mint,ArrayList maxt)

		{

			FileStream f = new FileStream(FileName,FileMode.Open);

			StreamReader r = new StreamReader(f);

					

			string delimStr = "\t";

			char [] delimiter = delimStr.ToCharArray();

			string s;

			string [] split = null;

			

			codi.Add(0);

			codj.Add(0);

			naim.Add(0);

			mint.Add(0);

			maxt.Add(0);

			while((s = r.ReadLine())!= null)

			{

				split = s.Split(delimiter,5);	

				codi.Add(split[0]);

				codj.Add(split[1]);

				naim.Add(split[2]);

				mint.Add(split[3]);

				maxt.Add(split[4]);

				

			}

			

			r.Close();

			f.Close();

		}

		

		private void ShowGrid1(DataGrid grid,ArrayList codi, ArrayList codj, 

ArrayList naim, ArrayList mint, ArrayList maxt)

		{

			DataTable tab = new DataTable("tabl");

			DataColumn c0 = new DataColumn("Код работы i"); 

			DataColumn c1 = new DataColumn("Код работы j");

			DataColumn c2 = new DataColumn("Наименование работы");

			DataColumn c3 = new DataColumn("Минимальное время t");

			DataColumn c4 = new DataColumn("Максимальное время t");

			

			tab.Columns.Add(c0);

			tab.Columns.Add(c1);

			tab.Columns.Add(c2);

			tab.Columns.Add(c3);

			tab.Columns.Add(c4);

			for(int i=1; i<codi.Count; i++)

			{

				DataRow row = tab.NewRow();

				row["Код работы i"] = codi[i];

				row["Код работы j"] = codj[i];

				row["Наименование работы"] = naim[i];

				row["Минимальное время t"] = mint[i];

				row["Максимальное время t"] = maxt[i];

								

				tab.Rows.Add(row);

			}

			

			grid.DataSource = tab;



		}



		private void ShowGrid2(DataGrid grid,double [,]C, double [,]tpn, 

double [,]tpo, double [,]tnn, double [,]tno, double [,]Rn, double [,]Rcb)

		{

			int nn = (int)Math.Sqrt(C_avg.Length)-1;

			DataTable tab2 = new DataTable("tabl2");

			DataColumn c0 = new DataColumn("Код i,j"); 

			DataColumn c1 = new DataColumn("t(i,j)"); 

			DataColumn c2 = new DataColumn("tpn(i,j)");

			DataColumn c3 = new DataColumn("tpo(i,j)");

			DataColumn c4 = new DataColumn("tnn(i,j)");

			DataColumn c5 = new DataColumn("tno(i,j)");

			DataColumn c6 = new DataColumn("Rn(i,j)");

			DataColumn c7 = new DataColumn("Rcb(i,j)");

			

			tab2.Columns.Add(c0);

			tab2.Columns.Add(c1);

			tab2.Columns.Add(c2);

			tab2.Columns.Add(c3);

			tab2.Columns.Add(c4);

			tab2.Columns.Add(c5);

			tab2.Columns.Add(c6);

			tab2.Columns.Add(c7);

			

			string str;

			n_ij=0;

			for(int i=1; i<=nn; i++)

				for(int j=1; j<=nn; j++)

					if(C[i,j]>=0)

					{

						DataRow row = tab2.NewRow();

									

						row["Код i,j"] = i.ToString()+"-"+j.ToString();

						str = String.Format("{0:F2}",C[i,j]);

						row["t(i,j)"] = str;

						str = String.Format("{0:F2}",tpn[i,j]);

						row["tpn(i,j)"] = str;

						str = String.Format("{0:F2}",tpo[i,j]);

						row["tpo(i,j)"] = str;

						str = String.Format("{0:F2}",tnn[i,j]);

						row["tnn(i,j)"] = str;

						str = String.Format("{0:F2}",tno[i,j]);

						row["tno(i,j)"] = str;

						str = String.Format("{0:F2}",Rn[i,j]);

						row["Rn(i,j)"] = str;

						str = String.Format("{0:F2}",Rcb[i,j]); 

						row["Rcb(i,j)"] = str;

										

						tab2.Rows.Add(row);		n_ij++;

					}

			grid.DataSource = tab2;



		}



		private void AlgorithmFloyda(double [,]C, int [,]P)

		{

			int i,j,k;

			int nn = (int)Math.Sqrt(C.Length)-1;

			double [,]A = new double[nn+1,nn+1];

			for(i=1; i<=nn; i++)

				for(j=1; j<=nn; j++)

				{

					A[i,j] = C[i,j];

					P[i,j] = 0;

				}

			for(i=1; i<=nn; i++)

				A[i,i] = 0;

			for(k=1; k<=nn; k++)

				for(i=1; i<=nn; i++)

					for(j=1; j<=nn; j++)

						if(A[i,k] + A[k,j] >A[i,j])

						{

							A[i,j]=A[i,k]+A[k,j];

							P[i,j]=k;

						}



		}



		private void Path(int [,]P, double [,]C, int i, int j, ref double l, 

ref int sec)

		{

			int k;

			k=P[i,j];

			if(k!=0)

			{

				sec=k;

				Path(P,C,i, k, ref l, ref sec);

				l=l+C[k,j];

				Path(P,C,k, j, ref l, ref sec);

			}

		}



		private double MaxPath(double [,]C, int [,]P, int i, int j)

		{

			double l;int sec_v;

			

			l=0; 

			sec_v=0;

			Path(P,C,i, j,ref l, ref sec_v);

			if(sec_v!=0) return l+C[i,sec_v];//между ними min одна вершина – 

вторая

			else return C[i,j];

		}



		private double GetMat(double tmin,double tmax,double tver)

		{

			double avg;

			avg = (tmin+4*tver+tmax)/6;

			return avg;

		}



		private double GetDsp(double tmin,double tmax)

		{

			double Ds;

			Ds = 0.4*Math.Pow(tmax-tmin, 2);

			return Ds;

		}



		private double GetOtk(double tmin,double tmax)

		{

			double ot;

			ot = (tmax-tmin)/6;

			return ot;

		}



		private void GetPar(double [,]C, double []tp,double []tn, double [,]tpn, 

double [,]tpo, double [,]tno, double [,]tnn, double [,]Rn, double [,]Rcb)

		{

				

			for(int i=1; i<=n; i++)

				for(int j=1; j<=n; j++)

					if(C[i,j]>=0)

					{

			

						//ранние сроки начала и окончания работы

						tpn[i,j]=tp[i]; tpo[i,j]=tpn[i,j]+C[i,j];

						//поздние сроки начала и окончания работы

						tno[i,j]=tn[j]; tnn[i,j]=tno[i,j]-C[i,j];

						//полный резерв времени работы

						Rn[i,j]=tno[i,j]-tpo[i,j];

						//свободный резерв времени работы

						Rcb[i,j]=tp[j]-tpo[i,j];

					}

			

		}



		private double GetNorm(Random r)

		{

			double U1,U2,V1,V2,S,X1,Norm;

			l1:

			U1 = r.NextDouble();

			U2 = r.NextDouble();

			V1 = 2*U1-1;

			V2 = 2*U2-1;

			S = V1*V1+V2*V2;

			if(S>=1) goto l1;

			X1 = V1*Math.Sqrt(-2*Math.Log(S,Math.E)/S);

			

			Norm = X1;

			return Norm;

		}

		

		private double GetCC(Random r,double mint,double maxt,ref double Norm)

		{

			

			double C;

			Norm = GetNorm(r);

			C = mint+Norm*(maxt-mint);

			return C;

		}

		

		private int GetMax(ArrayList codjj)

		{

			int Max;

			Max=0;

			for(int i=1; i<codi.Count; i++)

				Max=Math.Max(Max,Convert.ToInt32(codjj[i]));

			return Max;

		}



		private double GetMax(double [,]C)

		{

			double Max;

			Max=0;

			int nn = (int)Math.Sqrt(C.Length)-1;

			for(int i=1; i<=nn; i++)

				for(int j=1; j<=nn; j++)

					if(C[i,j]>=0)

						Max=Math.Max(Max,C[i,j]);

			return Max;

		}

		

private void menuItem2_Click(object sender, System.EventArgs e)

		{

			int i,j;

			openFileDialog1.FileName="test.txt";

			openFileDialog1.ShowDialog();

			

			codi = new ArrayList();

			codj = new ArrayList();

			naim = new ArrayList();

			mint = new ArrayList();

			maxt = new ArrayList();

			

			

			Read_Data(openFileDialog1.FileName,codi,codj,naim,mint,maxt);

			

			ShowGrid1(dataGrid1,codi,codj,naim,mint,maxt);

			

		

			n=GetMax(codj);

			

		

			C_min = new double[n+1,n+1]; C_max = new double[n+1,n+1]; 

C_avg = new double[n+1,n+1];

			P_min = new int[n+1,n+1]; P_max = new int[n+1,n+1]; 

P_avg = new int[n+1,n+1];

C_rev_min = new double[n+1,n+1]; C_rev_max = new double[n+1,n+1]; C_rev_avg = new double[n+1,n+1];

			P_rev_min = new int[n+1,n+1]; P_rev_max = new int[n+1,n+1]; 

P_rev_avg = new int[n+1,n+1];

		

			ArrayList Li = new ArrayList();

			for(int c=0; c<zz; c++)

			{

				for(i=1; i<=n; i++)

					for(j=1; j<=n; j++)

					{

						C_min[i,j]=-1000; 

						C_max[i,j]=-1000;

						C_avg[i,j]=-1000;

					}

				Random r = new Random();

				m=codi.Count;	

			

				double nrm=0;

				

				for(i=1; i<m; i++)

				{

					C_min[Convert.ToInt32(codi[i]),

Convert.ToInt32(codj[i])]=Convert.ToDouble(mint[i]);

					C_max[Convert.ToInt32(codi[i]),

Convert.ToInt32(codj[i])]=Convert.ToDouble(maxt[i]);

					

C_avg[Convert.ToInt32(codi[i]),

Convert.ToInt32(codj[i])]=GetCC(r,C_min[Convert.ToInt32(codi[i]),Convert.ToInt32(codj[i])],C_max[Convert.ToInt32(codi[i]),Convert.ToInt32(codj[i])],ref nrm);

					

				}

				for(i=1; i<=n; i++)

					for(j=1; j<=n; j++)

					{

						C_rev_min[n-j+1,n-i+1]=C_min[i,j];

						C_rev_max[n-j+1,n-i+1]=C_max[i,j];

						C_rev_avg[n-j+1,n-i+1] = C_avg[i,j];

//GetMat(C_rev_min[n-j+1,n-i+1],C_rev_max[n-j+1,

n-i+1]);

					}



				AlgorithmFloyda(C_min,P_min);

				AlgorithmFloyda(C_rev_min,P_rev_min);

			

				AlgorithmFloyda(C_max,P_max);

				AlgorithmFloyda(C_rev_max,P_rev_max);



				AlgorithmFloyda(C_avg,P_avg);

				AlgorithmFloyda(C_rev_avg,P_rev_avg);



				tp_min = new double[n+1]; tp_max = new double[n+1]; 

tp_avg = new double[n+1]; 

				tn_min = new double[n+1]; tn_max = new double[n+1]; 

tn_avg = new double[n+1];

				R_min = new double[n+1]; R_max = new double[n+1]; 

R_avg = new double[n+1];

				r_min = new double[n+1]; r_max = new double[n+1]; 

r_avg = new double[n+1];

		

	



				tp_min[1]=0; tp_max[1]=0; tp_avg[1]=0;

				for(i=2; i<=n; i++)

				{

					tp_min[i]=MaxPath(C_min,P_min,1,i);

					tp_max[i]=MaxPath(C_max,P_max,1,i);

					tp_avg[i]=MaxPath(C_avg,P_avg,1,i);

				}



			

				L_kp_min=tp_min[n]; L_kp_max=tp_max[n]; L_kp_avg = tp_avg[n]; 

Li.Add(L_kp_avg);

			}

			label1.Text = "L_kp = "+String.Format("{0:F2}",L_kp_min);

			label2.Text = "L_kp = "+String.Format("{0:F2}",L_kp_max);

			label3.Text = "L_kp = "+String.Format("{0:F2}",L_kp_avg);



			L_kp_mat = GetMat(L_kp_min,L_kp_max,L_kp_avg); L_kp_otk = 

GetOtk(L_kp_min,L_kp_max);

			L_kp_dsp = Math.Pow(L_kp_otk,2);

			tn_min[n]=L_kp_min; tn_max[n]=L_kp_max; tn_avg[n]=L_kp_avg;

			

			for(i=2; i<=n; i++)

			{

				tn_min[n-i+1]=L_kp_min-MaxPath(C_rev_min, P_rev_min, 1, i);

				tn_max[n-i+1]=L_kp_max-MaxPath(C_rev_max, P_rev_max, 1, i);

				tn_avg[n-i+1]=L_kp_avg-MaxPath(C_rev_avg, P_rev_avg, 1, i);

			}



			label4.Text="На критическом пути расположены следующие вершины: ";

			label5.Text="На критическом пути расположены следующие вершины: ";

			label6.Text="На критическом пути расположены следующие вершины: ";

			for(i=1; i<=n; i++)

			{

				R_min[i]=tn_min[i]-tp_min[i];

				R_max[i]=tn_max[i]-tp_max[i];

				R_avg[i]=tn_avg[i]-tp_avg[i];

				

				if(R_min[i]==0)

					label4.Text+=i.ToString()+" ";

				if(R_max[i]==0)

					label5.Text+=i.ToString()+" ";

				if(R_avg[i]==0)

					label6.Text+=i.ToString()+" ";

				

			}

			

			

			

			tpn_min = new double[n+1,n+1]; tpn_max = new double[n+1,n+1]; 

tpn_avg = new double[n+1,n+1];

			tnn_min = new double[n+1,n+1]; tnn_max = new double[n+1,n+1]; 

tnn_avg = new double[n+1,n+1];

            	

tpo_min = new double[n+1,n+1]; tpo_max = new double[n+1,n+1]; 

tpo_avg = new double[n+1,n+1];

			tno_min = new double[n+1,n+1]; tno_max = new double[n+1,n+1]; 

tno_avg = new double[n+1,n+1];

			Rn_min = new double[n+1,n+1]; Rn_max = new double[n+1,n+1]; 

Rn_avg = new double[n+1,n+1];

			Rcb_min = new double[n+1,n+1]; Rcb_max = new double[n+1,n+1]; 

Rcb_avg = new double[n+1,n+1];

			

			/*nij = 

*/GetPar(C_min,tp_min,tn_min,tpn_min,tpo_min,tno_min,tnn_min,

Rn_min,Rcb_min);

			

			ShowGrid2(dataGrid2,C_min,tpn_min, tpo_min, tnn_min, tno_min, 

Rn_min, Rcb_min);

					

			/*nij = 

*/GetPar(C_max,tp_max,tn_max,tpn_max,tpo_max,tno_max,tnn_max,

Rn_max,Rcb_max);

			

			ShowGrid2(dataGrid3,C_max,tpn_max, tpo_max, tnn_max, tno_max, 

Rn_max, Rcb_max);

GetPar(C_avg,tp_avg,tn_avg,tpn_avg,tpo_avg,tno_avg,tnn_avg,

Rn_avg,Rcb_avg);

			

			ShowGrid2(dataGrid4,C_avg,tpn_avg, tpo_avg, tnn_avg, tno_avg, 

Rn_avg, Rcb_avg);

			

			k=(int)(1+3.32*Math.Log10(n));

			

			MainStatistics(Li,out Mx,out S2x,out Sx,out X_2);

			

			label7.Text="Матожидание T_kp="+String.Format("{0:F2}",Mx);

			label8.Text="Дисперсия T_kp = "+String.Format("{0:F2}",S2x);

			label9.Text="Ср. кв. от. T_kp="+String.Format("{0:F2}",Sx);

			label10.Text="Хі квадрат ="+String.Format("{0:F2}",X_2)+

", число ступеней свободы v="+v.ToString();

			

		}

		

		private void MainStatistics(ArrayList x,out double Mx,out double 

S2x,out double Sx,out double X_2)

		{

			int i, j;

			double /*m2, m4,*/ x_max, x_min, h;

			FileStream f = new FileStream("test.xls",FileMode.Create);

			StreamWriter w = new StreamWriter(f);

			

			int []n_ = new int[k+1];

			double []p_ = new double [k+1];

			double []x_cp = new double [k+1];

			

			Mx=0; S2x=0; Sx=0;

			x_max=Convert.ToDouble(x[0]); 

			x_min=Convert.ToDouble(x[0]);

			

			for(i=0; i<x.Count; i++) 

			{

				if( x_max < Convert.ToDouble(x[i])) 

x_max=Convert.ToDouble(x[i]);

				if( x_min > Convert.ToDouble(x[i])) 

x_min=Convert.ToDouble(x[i]);

			}

			h=(x_max-x_min)/k;

			for(j=1; j<=k; j++)

			{

				p_[j]=0; 

				n_[j]=0;

				x_cp[j]=x_min+h*(j-1)+h/2;

			}

			n_[1]=1;

			for(i=0; i<x.Count; i++)

				for(j=1; j<=k; j++)

					if ((Convert.ToDouble(x[i]) > x_min+(j-1)*h) && 

(Convert.ToDouble(x[i]) <= x_min+j*h) )

					{

					  n_[j]++;

					  break;

					}

			for(i=1; i<=k; i++)

				Mx=Mx+x_cp[i]*n_[i];

			Mx=Mx/x.Count;

			for(i=1; i<=k; i++)

				S2x=S2x+Math.Pow(x_cp[i]-Mx,2)*n_[i];

			S2x=S2x/(x.Count-1);

			Sx=Math.Sqrt(S2x);

			X_2=0;

			for(j=1; j<=k; j++)

			{

				p_[j]=h*Math.Exp(-Math.Pow(x_cp[j]-Mx,2)/(2*S2x))/(

Math.Sqrt(2*Math.PI)*Sx);

				w.WriteLine(x_cp[j].ToString()+"\t"+p_[j].ToString());

				X_2=X_2+Math.Pow(n_[j]-p_[j]*x.Count,2)/(p_[j]*x.Count);

			}

			v = k-3;

			w.Close(); f.Close();

		}

		

		private void DrawGant(Graphics g,/*int n_ij,*/double [,]C,

double [,]tpn,double [,]tpo,double [,]tno,double [,]tnn)

		{

			int i,j;

			Pen pn = new Pen(Color.Black);

			Pen p = new Pen(Color.Black);

			Pen p1 = new Pen(Color.Green,ht);

			Pen p2 = new Pen(Color.Red,ht);

			Font fnt = new Font("Courier New",ht);

			SolidBrush sbr = new SolidBrush(Color.Black);

			int dy=17;

			float y0,y1,y2,x0,x1,x2,yn,xn;

			x0=10; y0=10;

			x1=x0; y1=y0;

			double max = GetMax(tno);

			double dx = max/ 10;

			double sx=0;

			xn=x0+(float)max*mx;

			yn=m-1+dy*n_ij;

			pn.EndCap = LineCap.ArrowAnchor;

		

			g.DrawLine(pn,x0,yn,xn,yn);

			g.DrawString("Работы",fnt,sbr,x0,y0-10);

			//g.DrawString(max.ToString(),fnt,sbr,x0+(float)max*mx,yn);

						

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

			{

				if(i<10)g.DrawLine(p,x0+(float)sx*mx,yn-2,

x0+(float)sx*mx,yn+2);

				

g.DrawString(String.Format("{0:F2}",sx),fnt,sbr,

x0+(float)sx*mx,yn);

				sx+=dx;

			}

		

			g.DrawLine(pn,x0,yn,x0,y0);

			g.DrawString("Время",fnt,sbr,xn+(float)dx*mx,yn);

			for(i=1; i<=n; i++)

				for(j=1; j<=n; j++)

					if(C[i,j]>=0)

					{

						x1=x0+(float)tpn[i,j]*mx;

						x2=x1+(float)C[i,j]*mx;

						y1+=dy; y2=y1;

						g.DrawLine(p1,x1,y1,x2,y2);

						

						if(tpo[i,j]!=tno[i,j])

						{

							x1=x2;

							x2=x1+(float)(tno[i,j]-tpo[i,j])*mx;

							g.DrawLine(p2,x1,y1,x2,y2);

						}

						

						g.DrawString(i.ToString()+"-

"+j.ToString(),fnt,sbr ,x2,y2-ht);

						

					}

		}

	

		private void pictureBox1_Paint(object sender, 

System.Windows.Forms.PaintEventArgs e)

		{

			

			Graphics g = e.Graphics;

			DrawGant(g,/*nij,*/C_min,tpn_min,tpo_min,tno_min,tnn_min);

			

		}



		private void pictureBox2_Paint(object sender, 

System.Windows.Forms.PaintEventArgs e)

		{

			

			Graphics g = e.Graphics;

			DrawGant(g,/*nij,*/C_max,tpn_max,tpo_max,tno_max,tnn_max);

			

		}



		private void pictureBox3_Paint(object sender, 

System.Windows.Forms.PaintEventArgs e)

		{

			Graphics g = e.Graphics;

			DrawGant(g,/*nij,*/C_avg,tpn_avg,tpo_avg,tno_avg,tnn_avg);

		}





		private void button1_Click(object sender, System.EventArgs e)

		{

			Process.Start("test.xls");

		}



		private void button2_Click(object sender, System.EventArgs e)

		{

			int n = (int)Math.Sqrt(C_avg.Length)-1;

			FileStream f =new FileStream("tavg.xls",FileMode.Create);

			StreamWriter w = new StreamWriter(f);

			w.WriteLine("Код i,j\tt(i,j)\ttpn(i,j)\ttpo(i,j)\ttnn(i,j)\ttno(i,j)\t

Rn(i,j)\tRcb(i,j)");

			for(int i=1; i<=n; i++)

				for(int j=1; j<=n; j++)

					if(C_avg[i,j]>=0)

					{

						w.WriteLine(i.ToString()+"-

"+j.ToString()+"\t"+C_avg[i,j]+"\t"+tpn_avg[i,j]+"\t"+

tpo_avg[i,j]+"\t"+tnn_avg[i,j]+"\t"+tno_avg[i,j]+"\t"+

Rn_avg[i,j]+"\t"+Rcb_avg[i,j]);

					}

			w.Close();

			f.Close();



			DialogResult result = MessageBox.Show(

"Просмотреть отчет?","",MessageBoxButtons.YesNo);

			if(result==DialogResult.Yes)

				Process.Start("tavg.xls");

		}



		private void button3_Click(object sender, System.EventArgs e)

		{

			int n = (int)Math.Sqrt(C_min.Length)-1;

			FileStream f =new FileStream("tmin.xls",FileMode.Create);

			StreamWriter w = new StreamWriter(f);

			w.WriteLine("Код i,j\tt(i,j)\ttpn(i,j)\ttpo(i,j)\ttnn(i,j)\ttno(i,j)\t

Rn(i,j)\tRcb(i,j)");

			for(int i=1; i<=n; i++)

				for(int j=1; j<=n; j++)

					if(C_min[i,j]>=0)

					{

						w.WriteLine(i.ToString()+"-"+j.ToString()+"\t"+

C_min[i,j]+"\t"+tpn_min[i,j]+"\t"+tpo_min[i,j]+"\t"+

tnn_min[i,j]+"\t"+tno_min[i,j]+"\t"+Rn_min[i,j]+"\t"+Rcb_min[i,j]);

					}

			w.Close();

			f.Close();



			DialogResult result = MessageBox.Show(

"Просмотреть отчет?","",MessageBoxButtons.YesNo);

			if(result==DialogResult.Yes)

				Process.Start("tmin.xls");

		}



		private void button4_Click(object sender, System.EventArgs e)

		{

			int n = (int)Math.Sqrt(C_max.Length)-1;

			FileStream f =new FileStream("tmax.xls",FileMode.Create);

			StreamWriter w = new StreamWriter(f);

			w.WriteLine("Код i,j\tt(i,j)\ttpn(i,j)\ttpo(i,j)\ttnn(i,j)\ttno(i,j)\t

Rn(i,j)\tRcb(i,j)");

			for(int i=1; i<=n; i++)

				for(int j=1; j<=n; j++)

					if(C_max[i,j]>=0)

					{

						w.WriteLine(i.ToString()+"-"+j.ToString()+"\t"+

C_max[i,j]+"\t"+tpn_max[i,j]+"\t"+tpo_max[i,j]+"\t"+tnn_max[i,j]+"\t"+tno_max[i,j]+"\t"+Rn_max[i,j]+"\t"+Rcb_max[i,j]);

					}

			w.Close();

			f.Close();



			DialogResult result = MessageBox.Show(

"Просмотреть отчет?","",MessageBoxButtons.YesNo);

			if(result==DialogResult.Yes)

				Process.Start("tmax.xls");

		}

	}

}