МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
УКРАЇНСЬКИЙ ДЕРЖАВНИЙ МОРСЬКИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
імені адмирала Макарова
Кафедра Інформаційних Технологій
ЗАВДАНЯ
На курсову роботу з курсу
“Моделювання виробничих процесів у суднобудуванні”
Студент 5142 групи Бурунсуз О. А.
1) Тема курсової роботи : Cтатистичне моделювання сітьового графіка побудови судна .
2) Основні початкові дані наведено у таблиці 1.
3) Структура розрахунково-пояснювальної записки:
a) Титульний лист;
b) Завдання на курсову роботу;
c) Анотація (українською, російською, англійською);
d) Зміст;
e) Перелік умовних означень;
f) Вступ;
g) Загальна частина (Розділ 1);
Спеціальна частина (Розділ 2, 3);
i) Висновки;
j) Список використаної літератури;
k) Додатки.
4) Дата видачі завдання “ ” ___ 2006 року
5) Строк здачі студентом готової роботи “ ” ____ 2006 року
Керівник курсової роботи Шнейдер О. Б.
Студент н
Коди робіт |
Найменування робіт |
Оцінка тривалості |
|
|
Варіант |
||
3 |
|||
1-2 |
Підготовка стапеля до закладення судна |
2 3 |
|
2-5 |
Зборка і зварювання днищевих секцій 1 будівельного району (79-134 шп.) |
5,5 6,5 |
|
2-3 |
Зборка і зварювання днищевих секцій у районі 75-79 шп. |
6,3 6,7 |
|
3-6 |
Зборка і зварювання секцій перегородок , бортів і палуб у районі 75-79 шп. |
20 21 |
|
3-4 |
Зборка і зварювання днищевих секцій у районі 71-75 шп. |
6,1 6,2 |
|
5-8 |
Іспит на непроникливість міждонних відсіків 1 будівельного району |
8 8,3 |
|
6-12 |
Монтаж систем (вантажний, зачистний і обігріву) у районі 75-79 шп. |
12 13 |
|
6-7 |
Залежність |
0 |
|
4-7 |
Зборка і зварювання секцій перегородок , бортів і палуб у районі 71-75 шп. |
22 23 |
|
4-10 |
Зборка і зварювання секцій у районі 67-71 шп. |
4 4,5 |
|
7-12 |
Монтаж систем у районі 71-75 шп. |
18 19 |
|
7-11 |
Залежність |
0 |
|
10-11 |
Зборка і зварювання секцій перегородок , бортів і палуб у районі 67-71 шп. |
20 21 |
|
10-13 |
Зборка і зварювання днищевих секцій у районі 63-67 шп. |
6 7 |
|
11-12 |
Монтаж систем у районі 67-71 шп. |
13 16 |
|
11-14 |
Залежність |
0 |
|
12-20 |
Іспит на непроникливість вантажних танків у районі 67-79 шп. |
8 9 |
|
13-16 |
Зборка і зварювання днищевих секцій у районі 59-63 шп. |
10 11 |
|
13-14 |
Зборка і зварювання секцій перегородок , бортів і палуб у районі 63-67 шп. |
18 21 |
|
14-19 |
Монтаж систем у районі 63-67 шп. |
15 23 |
|
14-17 |
Залежність |
0 |
|
16-17 |
Зборка і зварювання секцій перегородок , бортів і палуб у районі 59-63 шп. |
20 21 |
|
17-19 |
Монтаж систем у районі 59-63 шп. |
12 15 |
|
8-22 |
Фарбування підводної частини корпусу в районі 79 шп. - корми |
30 35 |
|
20-22 |
Фарбування підводної частини корпусу в районі 67-79 шп. |
10 14 |
|
19-21 |
Іспит на непроникливість вантажних танків у районі 59-67 шп. |
5 7 |
|
21-22 |
Фарбування підводної частини корпусу в районі 59-67 шп. |
3 8 |
|
Перелік умовних означень 4
Вступ 6
1. Загальна характеристика предметної області 6
1.1 Дослідження процесу побудови судна ……………………………………….7
1.1.1 Аналіз процесу побудови судна як обєкта управління…...……………7
1.1.2 Поняття технологічного та виробничого процесів у суднобудуванні…………………………………….…………………..….8
1.1.3 Особливості виробничого процесу у суднобудуванніта аналіз досягнутих результатів.
2 РОЗРОБКА ДЕТЕРМІНОВАНОЇ МОДЕЛІ СІТЬОВОГО ГРАФІКА І ПРОВЕДЕННЯ МОДЕЛЮВАННЯ
2.1 Розробка програмного забезпечення для моделювання детермінованої моделі
Модифікована версія алгоритму Флойда, що дозволяє відновити найдовші шляхи:
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).
Рисунок 3 - Метод вилучення
Метод вилучення (рис. 3) дозволяє отримати випадкове число, якщо ми знаємо щільність розподілу f(x) випадкової величини Х. Його суть полягає в наступних діях:
спочатку генерується випадкове число x з рівномірним розподілом на сегменті ;
потім ще одне - число Y, але на сегменті ;
ці два числа беруться як координати точки, якщо вона підпадає під криву f(x) (тобто в межах кривої щільності імовірності) , то перше число X і є випадковим числом з шуканим розподілом, якщо ні - знову генеруємо пари чисел.
Моделювання сітьового графіка методом статистичних випробувань дає достовірні результати, коли кількість реалізацій перевищує сотню. Треба враховувати, що така велика кількість розрахунків доцільна лише для розріджених графів (не з великою кількістю робіт). Це головний недолік цього методу.
Як вже згадувалося вище при моделюванні тривалість критичного шляху Lкр, ранні і пізні терміни здійснення подій є випадковими величинами, імовірності характеристики яких треба зясувати.
3.2 Знаходження характеристик вибіркового розподілу
При статистичній обробці експериментальних даних випадкової величини X знаходять оцінки числових характеристик, які найбільш часто зустрічаються, себто математичного сподівання і дисперсії:
- математичне сподівання (вибіркове середнє);
- виправлена (незміщена) дисперсія;
- середньоквадратичне відхилення.
Розглянуті оцінки називаються точковими, так як вони визначаються одним числом, зображеним точкою на числовій осі. Але при малому обємі вибірки точкова оцінка може значно відрізнятися від оцінюваного параметру а. Тому у ряді задач матстатистики вимагається знайти не тільки параметр а, але його точність та надійність.
Для визначення точності оцінки в матстатистиці користуються надійним інтервалом, а для визначення надійності - надійною ймовірністю.
Нехай для параметра а одержана із досліду незсунена оцінка . Ми хочемо оцінити можливу при цьому помилку. Задаємо деяку велику ймовірність g (наприклад, g=0,9; 0,95; 0,99; ...) таку, щоб подію з ймовірністю g можна було б вважати практично вірогідною, і знайдемо таке значення d>0, для якого
(3.1)
Подамо (1) у вигляді міри довіри
(3.2)
Рівність (2) показує, що невідомі значення параметра а з ймовірністю b попадають у інтервал (3.3)
Відмітимо, що тут невідоме значення параметра а являється випадковою величиною, а інтервал lg і випадковою величиною, так як положення інтервалу на вісі залежить від в.п. (центр інтервалу), довжина також у загальному випадку являється випадковою величиною. Тому ймовірність g у даному випадку тлумачать не як ймовірність попадання випадкової величини а в інтервал lg , а як ймовірність того, що випадковий інтервал lg накриває точку а.
Рисунок 4 - Надійний інтервал
Інтервал lg (рис. 4) називається надійним інтервалом, а b - надійною ймовірністю або надійністю. Розглянемо приклад знаходження надійного інтервалу для математичного сподівання.
Треба побудувати надійний інтервал lg, що відповідає надійній ймовірності g, для математичного сподівання в.в. Х.
Для цього користуються формулою . (3.4) Зміст співвідношення (4): з надійністю b можна стверджувати, що надійний інтервал накриває невідомий параметр 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,jtt(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,jtt(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,jtt(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");
}
}
}
! | Как писать курсовую работу Практические советы по написанию семестровых и курсовых работ. |
! | Схема написания курсовой Из каких частей состоит курсовик. С чего начать и как правильно закончить работу. |
! | Формулировка проблемы Описываем цель курсовой, что анализируем, разрабатываем, какого результата хотим добиться. |
! | План курсовой работы Нумерованным списком описывается порядок и структура будующей работы. |
! | Введение курсовой работы Что пишется в введении, какой объем вводной части? |
! | Задачи курсовой работы Правильно начинать любую работу с постановки задач, описания того что необходимо сделать. |
! | Источники информации Какими источниками следует пользоваться. Почему не стоит доверять бесплатно скачанным работа. |
! | Заключение курсовой работы Подведение итогов проведенных мероприятий, достигнута ли цель, решена ли проблема. |
! | Оригинальность текстов Каким образом можно повысить оригинальность текстов чтобы пройти проверку антиплагиатом. |
! | Оформление курсовика Требования и методические рекомендации по оформлению работы по ГОСТ. |
→ | Разновидности курсовых Какие курсовые бывают в чем их особенности и принципиальные отличия. |
→ | Отличие курсового проекта от работы Чем принципиально отличается по структуре и подходу разработка курсового проекта. |
→ | Типичные недостатки На что чаще всего обращают внимание преподаватели и какие ошибки допускают студенты. |
→ | Защита курсовой работы Как подготовиться к защите курсовой работы и как ее провести. |
→ | Доклад на защиту Как подготовить доклад чтобы он был не скучным, интересным и информативным для преподавателя. |
→ | Оценка курсовой работы Каким образом преподаватели оценивают качества подготовленного курсовика. |
Курсовая работа | Деятельность Движения Харе Кришна в свете трансформационных процессов современности |
Курсовая работа | Маркетинговая деятельность предприятия (на примере ООО СФ "Контакт Плюс") |
Курсовая работа | Политический маркетинг |
Курсовая работа | Создание и внедрение мембранного аппарата |
Курсовая работа | Социальные услуги |
Курсовая работа | Педагогические условия нравственного воспитания младших школьников |
Курсовая работа | Деятельность социального педагога по решению проблемы злоупотребления алкоголем среди школьников |
Курсовая работа | Карибский кризис |
Курсовая работа | Сахарный диабет |
Курсовая работа | Разработка оптимизированных систем аспирации процессов переработки и дробления руд в цехе среднего и мелкого дробления Стойленского ГОКа |