• 3.1 Табличний симплекс-метод
  • 3.2 Метод штучних змінних
  • 7.1 Системні вимоги
  • 7.4 Головне меню програми
  • 7.5 Використання
  • 7.5.3 Результат роботи програми
  • 7.6 Використання інженерного режиму


  • Дата конвертації19.05.2017
    Розмір54.34 Kb.
    Типкурсова робота

    Скачати 54.34 Kb.

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

    Міністерство освіти і науки Російської Федерації

    Федеральне агентство з освіти

    ІРКУТСЬКИЙ державний технічний університет

    Кафедра Автоматизованих систем

    ПОЯСНЮВАЛЬНА ЗАПИСКА

    до курсового проекту з дисципліни

    Теорія Прийняття Рішення

    ЗАВДАННЯ СКЛАДАННЯ ОПТИМАЛЬНОГО ГРАФІКА РЕМОНТУ ІНСТРУМЕНТУ

    Іркутськ 2009 р


    зміст

    1. Постановка задачі

    2. ОБГРУНТУВАННЯ МОДЕЛІ

    3. КОРОТКІ ВІДОМОСТІ ПРО МЕТОД ВИРІШЕННЯ ЗАВДАННЯ

    3.1 ТАБЛИЧНИЙ СІМПЛЕКС-МЕТОД

    3.2 МЕТОД ШТУЧНИХ ЗМІННИХ

    4. Перевірка ДОСТОВІРНОСТІ ОТРИМАНИХ РЕЗУЛЬТАТІВ

    5. АЛГОРИТМ РІШЕННЯ ЗАВДАННЯ

    6. Лістинг програми, що реалізують АЛГОРИТМ ЗАВДАННЯ

    7. КЕРІВНИЦТВО КОРИСТУВАЧА

    7.1 Системні вимоги

    7.2 ОПИС МОЖЛИВОСТЕЙ

    7.3 ОСНОВНИЙ ВІКНО ПРОГРАМИ

    7.4 ГОЛОВНЕ МЕНЮ ПРОГРАМИ

    7.5 ВИКОРИСТАННЯ

    7.5.1 Введення даних

    7.5.2 Розрахунок графіка ремонту і покупки

    7.5.3 Результат роботи програми

    7.6 ВИКОРИСТАННЯ ІНЖЕНЕРНОГО РЕЖИМУ

    8. РІШЕННЯ ЗАВДАННЯ КУРСОВОЇ РОБОТИ НА ПЕОМ ПО ВИХІДНИХ ДАНИХ ІНДИВІДУАЛЬНОГО ВАРІАНТУ

    9. Список використаних джерел


    1. Постановка завдання

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

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

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

    Конкретні числові условіязадачі:

    добу кол-во одиниць добу рублів добу рублів рублів
    7

    40

    0

    20

    3 2 2 4 6

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

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

    а) кількість послідовних днів може бути або 6, або 7, або 8 днів; при цьому день, коли , Може бути будь-яким з прийнятого діапазону;

    б) кількість одиниць інструменту може бути взято з діапазону 15..45;

    в) тривалість звичайного ремонту може бути або 2 доби, або 3 доби, або 4 доби; а його вартість або 1 руб. за одиницю інструменту, або 2 руб. за одиницю інструменту, або 3 руб. за одиницю інструменту;

    г) тривалість термінового ремонту може бути або 1 добу, або 2 доби, або 3 доби; а його вартість або 3 руб. за одиницю інструменту, або 4 руб. за одиницю інструменту, або 5 руб. за одиницю інструменту;

    д) вартість нового інструменту або 5 руб. за одиницю інструменту, або 6 руб. за одиницю інструменту, або 7 руб. за одиницю інструменту.

    модель рішення завдання графік ремонт


    2. Обгрунтування математичної моделі

    Нехай для виконання певної виробничої програми, розрахованої на сім днів поспіль, потрібно до початку -го дня одиниць спеціального інструменту, який до кінця дня весь зношується, при цьому r 1 = 40; r 2 = 40; r 3 = 40; r 4 = 40; r 5 = 0; r 6 = 20; r 7 = 20 (5-ий день - вихідний, тому r 5 = 0). Частина (весь) зношеного інструменту в кінці -го дня може здаватися в звичайний ремонт, частина (весь) в терміновий, а частина (весь) може не здаватися в ремонт, залишаючись наприклад на склад використаного інструменту. Так як 5-ий день є вихідним, то в цей день виробництво і ремонтні служби не працюють, тому математична модель буде побудована для 6 днів, а потім відповідь буде зміщений відносно вихідного (r 1 = 40; r 2 = 40; r 3 = 40; r 4 = 40; r 5 = 20; r 6 = 20 і j = 6).

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

    Введемо наступні позначення:

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

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

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

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

    з інструментів, зданих в звичайний ремонт днів назад і отриманих з ремонту в кінці го дня;

    з інструментів, зданих в терміновий ремонт днів назад і отриманих з ремонту в кінці го дня;

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

    де кількість інструменту, купленого для використання в 1-й день; , Так як до початку виконання виробничої програми в ремонт не міг чинити використаний інструмент і в перші днів (в даному випадку 3 дні) ще не надійде з ремонту в вживання жодного інструменту, зданого навіть в терміновий ремонт, а в перші днів (в даному випадку 4 дня) не надійде до вживання жодного інструменту, зданого в звичайний ремонт.

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

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

    і за днів (в даному випадку за два дні) до кінця програми не слід здавати його в терміновий ремонт, тобто

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

    Тим самим завдання полягає в мінімізації загальної вартості витрат

    при обмеженнях

    і умовах


    Для конкретних числових значень цільова функція виглядає:

    , При обмеженнях:

    x j 0 (j = 1 (1) 5);

    y j 0 (j = 1 (1) 2);

    z j 0 (j = 1 (1) 3);

    u j 0 (j = 1 (1) 6);

    Для зручності рішення x j (j = 0 (1) 5); y j (j = 1 (1) 2); z j (j = 1 (1) 3); u j (j = 1 (1) 6) замінимо на x k, де k = 1 (1) 17. Обмеження візьмуть вигляд:


    x k 0 (k = 1 (1) 17)

    Для вирішення завдання методом штучних змінних додамо в обмеження і цільову функцію змінні x 18, x 19, x 20, x 21, x 22:

    ,

    при обмеженнях:


    x k 0 (k = 1 (1) 22)


    3. Короткі відомості про метод вирішення задачі

    3.1 Табличний симплекс-метод

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

    A 1x1 + ... + A n x n + e 1 x n + e 1 x n + 1 + ... + e m x n + m = A 0 = [a i0],

    де

    . - одиничний базис, a i0 ≥ 0

    для всіх i = 1, 2, ..., n. Застосуємо одну ітерацію методу повного виключення до розширеної матриці обмежень A p = [A 1,., A n, e 1,., E m, A 0].

    Перетворення Гауса називають симплексним перетворенням, коли направляючий елемент визначають за такими правилами:

    a) спрямовує стовпець j вибирають з умови, що в ньому є хоча б один позитивний елемент;

    б) направляє рядок i вибирають так, щоб відношення було мінімально за умови, що a ij> 0.

    При такому перетворенні в базис вводиться вектор A j і виводиться вектор А i. Тепер треба визначити, як вибрати вектор, що вводиться в базис, щоб при цьому значення цільової функції збільшилася.

    Для цього використовують так звані оцінки векторів Δ j:

    (2.2.21)

    де I б - безліч індексів базисних векторів; x ij - визначають з умови

    (2.2.22)

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

    .

    Для вирішення завдання симплекс-методом на кожній ітерації заповнюють симплекс-таблицю 2.2.

    Таблиця 2.2.


    Останній рядок таблиці - індексна служить для визначення направляючого стовпця. Її елементи Δ j визначають за формулою (2.2.21). Очевидно, для всіх базисних векторів {A i} i = 1,., M оцінки Δ i = a 0 i = 0.

    Значення цільової функції a 00 визначається зі співвідношення

    .

    У стовпці B x записуємо базисні змінні {x i} i = 1, ..., т. Їх значення визначаються стовпчиком вільних членів a i0, тобто x i = a i0, i = 1, 2,., M.

    Напрямні рядок A i і стовпець A j вказуються стрілками. Якщо в якості направляючого елемента обраний a ij, то перехід від даної симплекс таблиці до наступної визначається співвідношеннями (2.2.16) - (2.2.18).

    Алгоритм рішення задачі ЛП табличним симплексом-методом складається з етапів.

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

    2. В якості направляючого стовпця вибирають A j, для якого .

    3. Напрямна рядок A и вибирають з умови

    4. Роблять один крок (ітерацію) методу повного виключення Гаусса з напрямних елементом a ij, для чого використовують співвідношення (2.2.16) - (2.2.18). Зокрема, елементи індексного рядка нової таблиці обчислюють відповідно до формули


    l = 1,2, ..., n.

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

    (2.2.23)

    (2.2.24)

    У стовпці B x нової таблиці замінюють x i на x j, а в стовпці С c i на c j.

    5. Якщо все a 0l (k + 1) ≥0, l = 1,., N, то нове базисне рішення x i = a i0 (k + 1), i € I б (k + 1) - оптимально. В іншому випадку переходять до етапу 2 і виконують чергову ітерацію.

    6. Другий, третій і четвертий етапи повторюють до тих пір, поки одна з ітерацій не закінчиться одним з двох випадків:

    а) все a 0l ≥0. Це ознака (критерій) оптимальності базисного рішення останньої симплекс-таблиці;

    б) знайдеться такий a 0j = Δ j <0, що всі елементи цього шпальти a rj ≤0, (r = 1,., m). Це ознака необмеженості цільової функції z = Σc j x j на безлічі допустимих рішень задачі.

    3.2 Метод штучних змінних

    Нехай обмеження задачі ЛП мають вигляд A x ≤A 0.

    Якщо все b i ≥ 0, i = 1, 2, ..., m, то вільні вектори, що утворюють одиничну підматрицю, складають базис, а відповідні їм змінні - початкова базисне рішення.

    У загальному випадку, коли деякі обмеження мають знак «≥», наприклад a i 1 x 1 + a i 2 x 2 + ... + a in x n ≥b i, i = 1,2, ...., m ,

    то для приведення цих обмежень до стандартної форми рівності вільні змінні треба відняти. Тоді розширена форма завдання матиме такий вигляд:

    a 11 x 1 + a 12 x 2 + ... + a 1 n x n - 1x n +1 + 0x n +2 + ... + 0x n + m = b 1;

    a 21 x 1 + a 22 x 2 + ... + a 2n x n + 0x n + 1 -1x n + 2 + ... + 0x n + m = b 2; (2.3.1)

    . . . . . . . . . . . . . . . . . . . . . .

    a m1 x 1 + a m2 x 2 + ... + a mn x n + 0x n + 1 + 0x n + 2 + ...- 1x n + m = b m.

    Вільні змінні {x n +1,..., x n + m} в цьому випадку вже неможливо використовувати в якості початкового базису, так як x n +1 <0, ..., x n + m <0. Тому в рівняння (2.3.1) додатково вводять штучні змінні x n + m +1,..., x n + m + k. Ці змінні не мають нічого спільного з реальним завданням, і тому їх треба вивести з базису якомога швидше. Для цього перед початком ітерацій штучним змінним в цільової функції приписують для задач максимізації дуже великі по модулю негативні коефіцієнти (М), де M >> c i, (i = 1, 2, .., m).

    У разі вирішення завдань мінімізації штучні змінні вводять в цільову функцію з великими позитивними коефіцієнтами (+ М).

    Знаки штучних змінних x n + m +1,..., x n + m + k повинні збігатися зі знаками відповідних вільних членів. Штучні змінні утворюють початкове базисне рішення. Застосувавши симплекс-метод, необхідно вивести з базису все штучні змінні. Якщо вдається довести (або показати), що штучні змінні повністю вивести з базису неможливо, то це означає, що задача не має рішення, тобто її обмеження суперечливі.


    4. Перевірка достовірності отриманих результатів

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

    · Значення елементів рядка, що містить Δ j, обчислюються як елементи симплекс-таблиці (за винятком першої симплекс-таблиці, де такі обчислення неможливі).

    · Значення елементів рядка, що містить Δ j, обчислюються другим способом, а саме за формулами безпосереднього рахунку:

    · Значення, отримані цими двома способами, порівнюються. Якщо значення рівні, значить обчислення проведені вірно. У зворотному випадку, користувачеві видається повідомлення про помилку обчислень.

    Додатковим засобом перевірки достовірності є використання «Інженерного режиму», реалізованого в програмі. В даному режимі можна подивитися кожен етап обчислення завдання.

    У програмі також реалізовані наступні методи обробки помилок обчислень:

    1. У разі якщо відбувається «зациклення» програми (в даній програмі, якщо кількість ітерацій більше 100), користувачеві видається повідомлення про помилку. Дана ситуація може виникнути в разі вирожденність матриці - вектор, який був раніше виведений з базису, знову вводиться в базис.

    2. У разі якщо з базису не вдається вивести штучні змінні, користувачеві видається повідомлення про помилку. Це означає, що обмеження завдання суперечливі і завдання не має рішення.


    5. Алгоритм розв'язання задачі

    1. Перевірка правильності введення даних.

    2. Побудова симплекс-таблиці по введених даних.

    3. Додавання штучних змінних.

    4. Вибір направляючого елемента.

    5. Розподіл направляючої рядка на направляючий елемент.

    6. Підрахунок решти елементів нової симплекс таблиці.

    7. Якщо під час вирішення достовірність результатів порушується, припиняються подальші обчислення, користувачеві видається інформація про помилку.

    8. Якщо цикл розрахунку симплекс-таблиць не припиняється, примусово припиняється процес, користувачеві видається інформація про помилку.

    9. Якщо з базисного рішення не виведені всі штучні змінні, користувачеві видається інформація про помилку.

    10. Якщо рішення отримано, результати виводяться на екран.


    6. Лістинг програми, який реалізує алгоритм завдання

    const

    m = 25;

    n = 25;

    type

    TFirstKoef = array [1..m, 1..n] of real; // початкова матриця коефіцента

    Simplex = array [1..m, 1..n + m] of real; // нова матриця коефіцента з штучними змінними

    FullSimplex = array [1..m + 2,1..n + m + 2] of real;

    TE = array [1..n] of integer; // початковий неповний базис

    TAddBas = array [1..m] of integer; // штучні змінні вводяться для отримання базису

    TFullBas = array [1..m + n] of integer; // полнийбазіс

    TTarFunc = array [1..60] of integer; // Цільова функція

    var

    Form1: TForm1;

    Fkoef: TFirstKoef;

    NumOfNewVars: integer;

    fullBasis: TFullBas;

    EngFull: FullSimplex;

    F: File of Trec;

    TarFunc: TTarFunc;

    {------------------------------------------------- -----------------}

    function Sort (E: TE): TE; // сортування масиву типу ТЕ

    var

    i, k, tmp, nn, p, q: integer;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    nn: = 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q);

    for k: = nn downto 2 do

    for i: = 1 to k-1 do

    if E [i]> E [i + 1] then

    begin

    tmp: = E [i];

    E [i]: = E [i + 1];

    E [i + 1]: = tmp;

    end;

    Sort: = E;

    end;

    {------------------------------------------------- -----------------}

    function NullCheck (j: integer; Fkoef: TFirstKoef): boolean; // функціяпроверкістолбцовматріцинаналічіевозможнихбазісних (одна "1" інші "0")

    var

    k, mm: integer;

    Summ: real;

    begin

    Summ: = 0;

    mm: = 2 * (Form1.TrackBar1.Position-1);

    for k: = 1 to mm do

    Summ: = Summ + Fkoef [k, j];

    if summ = 1 then

    NullCheck: = true

    else

    NullCheck: = false;

    end;

    {------------------------------------------------- -----------------}

    functionAddVars (Basis: TE): TFullBas; // функція додавання стовпців з штучними змінними

    var

    Base: TE;

    newBase: TAddBas;

    full: TFullBas;

    j, k, count, inc, i, maxel, ncols, mm, nn, p, q: integer;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    mm: = 2 * (Form1.TrackBar1.Position-1);

    nn: = 1 + 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q);

    for j: = 1 to mm do

    newBase [j]: = 0;

    NumOfNewVars: = 0;

    Base: = Sort (Basis);

    count: = 1;

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

    for j: = 2 to nn do

    begin

    k: = Base [j] -Base [j-1];

    if (k <> 0) and (k <> 1) then

    begin

    inc: = 1;

    for i: = 1 to k-1 do

    begin

    newBase [count]: = Base [j-1] + inc;

    count: = count + 1;

    inc: = inc + 1;

    NumOfNewVars: = NumOfNewVars + 1;

    end;

    end;

    end;

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

    maxEl: = newBase [1];

    for i: = 2 to mm do

    if (newBase [i]> newBase [i-1]) then

    maxEl: = newBase [i];

    if maxel

    maxel: = Base [nn];

    // якщо одинична матриця неповна, то додаються додаткові змінні

    if maxel

    begin

    ncols: = mm-maxel;

    inc: = 1;

    for i: = count to ncols + count-1 do

    begin

    newBase [i]: = maxel + inc;

    inc: = inc + 1;

    NumOfNewVars: = NumOfNewVars + 1;

    end;

    end;

    // запис вектора містить базисні змінні

    for i: = 1 to nn do

    full [i]: = Basis [i];

    j: = 1;

    for i: = nn + 1 to nn + mm do

    begin

    full [i]: = newBase [j];

    j: = j + 1;

    end;

    AddVars: = full;

    end;

    {------------------------------------------------- -----------------}

    function ArtificialVars (Fkoef: TFirstKoef): Simplex; // реалізаціяметодаіскусственнихпеременних

    var

    i, j, mm, nn, p, q: integer;

    Basis: TE;

    Simp: Simplex;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    mm: = 2 * (Form1.TrackBar1.Position-1);

    nn: = 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q) +1;

    for i: = 1 to nn do

    Basis [i]: = 0;

    for j: = 1 to nn do //

    for i: = 1 to mm do // перебір початкової матриці коефіцента за стовпцями зверху вниз

    begin;

    Simp [i, j]: = Fkoef [i, j];

    if Fkoef [i, j] = 1 then // якщо в стовпці є одиниця

    if nullcheck (j, Fkoef) then // перевірка чи є даний стовпець базисним

    Basis [j]: = i;

    end;

    fullBasis: = AddVars (Basis); // виклик функції для додавання штучних стовпців щоб отримати базисне рішення

    for j: = 1 to NumOfNewVars do

    for i: = 1 to mm do

    if i = fullBasis [nn + j] then

    Simp [i, nn + j]: = 1

    else

    Simp [i, nn + j]: = 0;

    ArtificialVars: = Simp;

    end;

    {------------------------------------------------- -----------------}

    function TForm1.SelectCol (fullSimp: FullSimplex): integer;

    var

    j, mm, nn, p, q, napravCol: integer;

    maxdelt: real;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    nn: = 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q);

    mm: = 2 * (Form1.TrackBar1.Position-1);

    maxdelt: = fullSimp [mm + 2,4];

    for j: = 5 to nn + 3 + Numofnewvars do

    if fullSimp [mm + 2, j]> maxdelt then

    begin

    maxdelt: = fullSimp [mm + 2, j];

    napravCol: = j;

    end;

    if maxdelt> 0 then

    SelectCol: = napravCol

    else

    SelectCol: = - 1;

    end;

    {------------------------------------------------- -----------------}

    function SelectRow (fullSimp: FullSimplex; Col: integer): integer;

    var

    i, mm, napravRow: integer;

    minel, tmp: real;

    begin

    mm: = 2 * (Form1.TrackBar1.Position-1);

    tmp: = 1000;

    for i: = 2 to mm + 1 do

    if fullSimp [i, Col]> 0 then

    begin

    minel: = tmp;

    tmp: = fullSimp [i, 3] / fullSimp [i, Col];

    if tmp

    begin

    minel: = tmp;

    napravRow: = i;

    end;

    end;

    SelectRow: = napravRow;

    end;

    {------------------------------------------------- -----------------}

    function Delta (fullSimp: FullSimplex; j: integer): real;

    var

    i, mm: integer;

    delt: real;

    begin

    delt: = 0;

    mm: = 2 * (Form1.TrackBar1.Position-1);

    for i: = 2 to mm do

    delt: = delt + fullSimp [i, j] * fullSimp [i, 1];

    Delta: = delt-fullSimp [1, j];

    end;

    {------------------------------------------------- -----------------}

    function TForm1.NewTable (fullSimp: FullSimplex; TarFunc: TTarFunc): FullSimplex;

    var

    p, q, mm, nn, NapravCol, NapravRow, i, j: integer;

    NapravEl: real;

    NewTab: FullSimplex;

    err: boolean;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    nn: = 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q);

    mm: = 2 * (Form1.TrackBar1.Position-1);

    NapravCol: = SelectCol (fullSimp);

    NapravRow: = SelectRow (fullSimp, NapravCol);

    NapravEl: = fullSimp [NapravRow, NapravCol];

    for j: = 4 to nn + Numofnewvars + 3 do

    NewTab [1, j]: = TarFunc [j-3];

    for j: = 1 to 2 do

    for i: = 1 to mm + 1 do

    NewTab [i, j]: = fullSimp [i, j];

    NewTab [NapravRow, 1]: = TarFunc [NapravCol-3];

    NewTab [NapravRow, 2]: = NapravCol-3;

    for j: = 3 to nn + Numofnewvars + 3 do

    NewTab [NapravRow, j]: = fullSimp [NapravRow, j] / NapravEl;

    for i: = 2 to mm + 2 do

    for j: = 3 to nn + 3 + Numofnewvars do

    if i <> NapravRow then

    NewTab [i, j]: = fullSimp [i, j] -NewTab [NapravRow, j] * fullSimp [i, NapravCol];

    Err: = false;

    for j: = 3 to nn + 3 + Numofnewvars do

    if (NewTab [mm + 2, j] <> Delta (NewTab, j)) and (not Err) then

    begin

    err: = true;

    NewTab [1,1]: = - 1;

    end;

    NewTable: = NewTab;

    end;

    {------------------------------------------------- -----------------}

    function SimplexTables (Simp: Simplex): FullSimplex;

    var

    FS: FullSimplex;

    i, j, p, q, mm, nn, a, b, c, k, basecount, iterCnt: integer;

    err: boolean;

    begin

    p: = strtoint (Form1.Edit1.Text);

    q: = strtoint (Form1.Edit3.Text);

    nn: = 2 * (Form1.TrackBar1.Position-1) + (Form1.TrackBar1.Position-2-p) + (Form1.TrackBar1.Position-2-q);

    mm: = 2 * (Form1.TrackBar1.Position-1);

    a: = strtoint (Form1.Edit5.Text);

    b: = strtoint (Form1.Edit2.Text);

    c: = strtoint (Form1.Edit4.Text);

    for i: = 1 to Form1.TrackBar1.Position-1 do

    TarFunc [i]: = a;

    for i: = Form1.TrackBar1.Position to 2 * Form1.TrackBar1.Position-3-p do

    TarFunc [i]: = b;

    for i: = 2 * Form1.TrackBar1.Position-2-p to 3 * Form1.TrackBar1.Position-5-pq do

    TarFunc [i]: = c;

    for i: = 3 * Form1.TrackBar1.Position-4-pq to 4 * Form1.TrackBar1.Position-6-pq do

    TarFunc [i]: = 0;

    for i: = 4 * Form1.TrackBar1.Position-5-pq to 4 * Form1.TrackBar1.Position-6-pq + NumOfNewVars do

    TarFunc [i]: = 1000;

    basecount: = 0;

    for i: = 1 to mm + 2 do

    begin

    for j: = 1 to nn + NumOfNewVars + 3 do

    begin

    if j> 3 then

    FS [1, j]: = Tarfunc [j-3];

    if i> 1 then

    for k: = 1 to m + n do

    if fullBasis [k] = basecount then

    begin

    FS [i, 1]: = tarFunc [k-1];

    FS [i, 2]: = k-1;

    end;

    if (i> 1) and (j> 2) then

    FS [i, j]: = Simp [i-1, j-2];

    end;

    basecount: = basecount + 1;

    end;

    for j: = 3 to nn + 3 + Numofnewvars do

    FS [mm + 2, j]: = Delta (FS, j);

    err: = false;

    iterCnt: = 0;

    EngFull: = FS;

    repeat

    FS: = form1.NewTable (FS, TarFunc);

    if FS [1,1] = - 1 then

    err: = true;

    if iterCnt> тисячі then

    err: = true;

    iterCnt: = iterCnt + 1;

    until (form1.SelectCol (FS) = - 1) or (err);

    for i: = 2 to m + 1 do

    if (fs [i, 1] = 1000) then

    err: = true;

    if err then

    begin

    MessageDlg ( 'При заданих умовах завдання нерозв'язна!', MtError, [mbAbort], 0);

    form1.n3.Enabled: = false;

    form1.n6.Enabled: = false;

    end;

    SimplexTables: = FS;

    end;

    procedure TForm1.Button2Click (Sender: TObject);

    begin

    form1.Task;

    end;

    procedure Tform1.Task;

    var

    i, j, p, q, inc, cntx, k, cnt, holiday: integer;

    sklad: real;

    Matr: TFirstKoef;

    Tools: array [1..8] of integer;

    NewTools: array [1..7] of integer;

    Simp: Simplex;

    Fsimp: fullsimplex;

    begin

    Tools [1]: = strtoint (Edit6.Text);

    Tools [2]: = strtoint (Edit7.Text);

    Tools [3]: = strtoint (Edit8.Text);

    Tools [4]: ​​= strtoint (Edit9.Text);

    Tools [5]: = strtoint (Edit10.Text);

    Tools [6]: = strtoint (Edit11.Text);

    Tools [7]: = strtoint (Edit12.Text);

    Tools [8]: = strtoint (Edit13.Text);

    inc: = 0;

    for i: = 1 to 8 do

    if Tools [i] = 0 then

    holiday: = i;

    for i: = 1 to 7 do

    if Tools [i] <> 0 then

    NewTools [i]: = Tools [i + inc]

    else

    begin

    inc: = 1;

    NewTools [i]: = Tools [i + inc]

    end;

    p: = strtoint (Edit1.Text);

    q: = strtoint (Edit3.Text);

    cntx: = 2;

    for i: = 1 to TrackBar1.Position-1 do

    begin

    Matr [i, 1]: = newTools [i];

    if i-1> = 0 then

    begin

    Matr [i, cntx]: = 1;

    cntx: = cntx + 1;

    end;

    end;

    for i: = 1 to TrackBar1.Position-1 do

    begin

    if ip-1> 0 then

    begin

    Matr [i, cntx]: = 1;

    cntx: = cntx + 1;

    end;

    end;

    for i: = 1 to TrackBar1.Position-1 do

    begin

    if iq-1> 0 then

    begin

    Matr [i, cntx]: = 1;

    cntx: = cntx + 1;

    end;

    end;

    cntx: = TrackBar1.Position + 1;

    for i: = TrackBar1.Position to 2 * (TrackBar1.Position-1) do

    begin

    Matr [i, 1]: = newTools [i- (TrackBar1.Position-1)];

    if TrackBar1.Position-2-p> = i- (TrackBar1.Position-1) then

    begin

    Matr [i, cntx]: = 1;

    cntx: = cntx + 1;

    end;

    end;

    for i: = TrackBar1.Position to 2 * (TrackBar1.Position-1) do

    if TrackBar1.Position-2-q> = i- (TrackBar1.Position-1) then

    begin

    Matr [i, cntx]: = 1;

    cntx: = cntx + 1;

    end;

    for i: = TrackBar1.Position to 2 * (TrackBar1.Position-1) do

    begin

    Matr [i, cntx]: = 1;

    if i> TrackBar1.Position then

    Matr [i, cntx-1]: = - 1;

    cntx: = cntx + 1;

    end;

    Simp: = ArtificialVars (Matr);

    fSimp: = SimplexTables (simp);

    if fsimp [1,1] <> - 1 then

    begin

    for i: = 1 to StringGrid1.RowCount do

    for j: = 1 to StringGrid1.ColCount do

    begin

    StringGrid1.Cells [j, i]: = '';

    StringGrid1.Cells [0, i]: = 'День' + floattostr (i);

    StringGrid2.Cells [j, i]: = '';

    StringGrid2.Cells [0, i]: = 'День' + floattostr (i);

    end;

    for j: = 1 to 3 do

    begin

    StringGrid1.Cells [j, holiday]: = 'Вихідний';

    StringGrid2.Cells [j, holiday]: = 'Вихідний';

    end;

    cnt: = 0;

    For i: = 1 to TrackBar1.Position-1 do

    for j: = 2 to 4 * Form1.TrackBar1.Position-6-pq do

    if (matr [i, j] = 1) then

    for k: = 2 to 2 * TrackBar1.Position-1 do

    if (fsimp [k, 2] = j-1) then

    begin

    if i = holiday then

    cnt: = 1;

    if j-1 <= TrackBar1.Position-1 then

    StringGrid1.Cells [1, i + cnt]: = '' + floattostr (fsimp [k, 3]);

    if (j-1> TrackBar1.Position-1) and (j-1 <= 2 * Form1.TrackBar1.Position-3-p) then

    StringGrid1.Cells [2, i + cnt]: = '' + floattostr (fsimp [k, 3]);

    if (j-1> 2 * Form1.TrackBar1.Position-3-p) and (j-1 <= 3 * Form1.TrackBar1.Position-4-pq) then

    StringGrid1.Cells [3, i + cnt]: = '' + floattostr (fsimp [k, 3]);

    end;

    for i: = 1 to StringGrid1.RowCount do

    for j: = 1 to StringGrid1.ColCount do

    begin

    if (StringGrid1.Cells [2, i] <> '') and (i <> holiday) then

    if (i> = holiday) and (ip-1 <= holiday) then

    StringGrid2.Cells [2, ip-2]: = StringGrid1.Cells [2, i]

    else

    StringGrid2.Cells [2, ip-1]: = StringGrid1.Cells [2, i];

    if (StringGrid1.Cells [3, i] <> '') and (i <> holiday) then

    if (i> = holiday) and (iq-1 <= holiday) then

    StringGrid2.Cells [3, iq-2]: = StringGrid1.Cells [3, i]

    else

    StringGrid2.Cells [3, iq-1]: = StringGrid1.Cells [3, i];

    end;

    sklad: = 0;

    for i: = 1 to StringGrid2.RowCount-1 do

    begin

    if (StringGrid2.Cells [2, i] <> '') and (i <> holiday) then

    StringGrid2.Cells [1, i]: = '' + floattostr (tools [i]

    strtofloat (StringGrid2.Cells [2, i]));

    if (StringGrid2.Cells [3, i] <> '') and (i <> holiday) then

    StringGrid2.Cells [1, i]: = '' + floattostr (tools [i] - strtofloat (StringGrid2.Cells [3, i]));

    if (StringGrid2.Cells [3, i] <> '') and (i <> holiday) and (StringGrid2.Cells [2, i] <> '') then

    StringGrid2.Cells [1, i]: = '' + floattostr (tools [i] -strtofloat (StringGrid2.Cells [3, i]) - strtofloat (StringGrid2.Cells [2, i]));

    if (i <> holiday) and (StringGrid2.Cells [3, i] = '') and (StringGrid2.Cells [2, i] = '') then

    StringGrid2.Cells [1, i]: = '' + floattostr (tools [i]);

    if (i <> holiday) then

    sklad: = sklad + strtofloat (StringGrid2.Cells [1, i]);

    end;

    for i: = 1 to StringGrid1.RowCount do

    for j: = 1 to StringGrid1.ColCount do

    begin

    if (StringGrid1.Cells [j, i] = '') or (StringGrid1.Cells [j, i] = '0') then

    StringGrid1.Cells [j, i]: = '-';

    if (StringGrid2.Cells [j, i] = '') or (StringGrid2.Cells [j, i] = '0') then

    StringGrid2.Cells [j, i]: = '-';

    end;

    Label20.Caption: = 'Суммарниезатрати:' + floattostr (fsimp [2 * (TrackBar1.Position-1) +2,3]) + 'у.е.';

    Label21.Caption: = 'Інструментовнаскладе:' + floattostr (sklad) + 'шт.';

    N6.Enabled: = true;

    n3.Enabled: = true;

    end;

    end;


    7.Інструкція користувача

    7.1 Системні вимоги

    Процесор: Pentium I або аналогічний AMD 400 MHz і вище

    ОЗУ: 64 Мб і більше

    ОС: Windows 98, 2000, ХР

    7.2 Опис можливостей

    Дана програма призначена для розрахунку графіка ремонту і покупки інструменту, щоб при мінімальних витратах забезпечити підприємство інструментом протягом 6,7 або 8 послідовних днів. Вхідними даними для програми є: вартість покупки нового інструменту (5,6,7 у.о.), термін і ціна звичайного ремонту (2, 3, 4 дня за 1, 2, 3 у.о відповідно), термін і ціна термінового ремонту (1, 2, 3 дня за 3, 4, 5 у.е відповідно), а також кількість інструментів, необхідних вранці кожного дня (від 15 до 45 інструментів) і номер вихідного дня, в які як виробництво так і ремонтні служби не працюють.

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

    У програмі є "Інженерний" режим роботи, з допомогою якого можна переглянути етапи обчислення завдання. Цей режим призначений для фахівців.

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


    7.3 Основне вікно програми

    7.4 Головне меню програми

    Головне меню програми містить пункти: "Файл", "Режим" і "Допомога".

    У пункті "Файл" знаходяться підпункти "Відкрити", "Зберегти" і "Вихід".

    "Відкрити" - служить для відкриття файлів формату mbs. Використовується для відкриття файлів з збереженими результатами розрахунків в даній програмі.

    "Зберегти" - служить для збереження файлів у форматі mbs. Використовується для збереження результатів розрахунків в файл.

    "Вихід" - закриває програму без збереження результатів.

    У пункті "Режим" знаходяться підпункти "Призначений для користувача" і "Інженерний".

    "Призначений для користувача" - основний режим програми. У програмі використовується цей режим за замовчуванням.

    "Інженерний" - режим перевірки етапів обчислення. Призначений для фахівців.

    У пункті "Допомога" знаходяться підпункти "Допомога" та "Про програму".

    "Допомога" - містить посилання на даний файл довідки.

    "Про програму" - виводить вікно з інформацією про програму.

    7.5 Використання

    Для початку роботи з програмою запустіть файл instruments.exe.

    7.5.1 Введення даних

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

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


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

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

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


    7 .5.2 Розрахунок графіка ремонту і покупки

    Для того щоб розрахувати графік досить натиснути на кнопку "Розрахувати", що знаходиться внизу головного вікна програми.

    7.5.3 Результат роботи програми

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

    Наприклад, як видно з ілюстрації вище, вранці першого дня потрібно купити 40 інструментів, а ввечері всі 40 інструментів здати в терміновий ремонт. Вранці другого дня потрібно купити 40 інструментів, а ввечері 20 інструментів здати в звичайний ремонт і 20 в терміновий ремонт. І так далі.

    7.6 Використання інженерного режиму

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



    8. Рішення завдання курсової роботи на ПЕОМ за вихідними даними індивідуального варіанта

    Вихідні дані завдання:

    Початкова симплекс-таблиця:


    Остання симплекс-таблиця:

    Висновок відповіді:


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

    1. Зайченко, Ю.П. Дослідження операцій: навчальний посібник / Ю.П.Зайченко. - 2-е вид. - Київ: Вища школа, 1979. - 392 с.

    2. Куций, М.М. Математичні методи системного аналізу та теорія прийняття рішень: посібник по роботі / М.М. Куций. - Іркутськ: Вид-во Іркутськ держ. техніч. ун-ту, 2008. - 79 с.

    Головна сторінка


        Головна сторінка



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

    Скачати 54.34 Kb.