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

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

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





















ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту по дисциплине

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

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





















Иркутск 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. Обоснование математической модели



Пусть для выполнения некоторой производственной программы, рассчитанной на семь последовательных дней, требуется к началу -го дня  единиц специального инструмента, который к концу дня весь изнашивается, при этом r1=40; r2=40; r3=40; r4=40; r5=0; r6=20; r7=20 (5-ый день – выходной, поэтому r5=0). Часть (весь) изношенного инструмента в конце -го дня может сдаваться в обычный ремонт, часть (весь) в срочный, а часть (весь) может не сдаваться в ремонт, оставаясь например на склад использованного инструмента. Так как 5-ый день является выходным, то в этот день производство и ремонтные службы не работают, поэтому математическая модель будет построена для 6 дней, а затем ответ будет смещен относительно выходного (r1=40; r2=40; r3=40; r4=40; r5=20; r6=20 и j=6).

Пусть обычный ремонт одного инструмента длится  дня и стоит руб., а срочный ремонт одного инструмента длится  день и стоит  рублей. Кроме того, один новый инструмент стоит  рублей.

Введем следующие обозначения: 

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

 число инструментов, сдаваемых в обычный ремонт в конце -го дня;

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

число изношенных инструментов, оставшихся не сданными в ремонт к концу го дня. Тогда число  инструментов, поступающих в употребление в начале го дня, состоит:

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

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

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

 

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

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

 

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



и за  дней (в данном случае за два дня) до конца программы не следует сдавать его в срочный ремонт, т.е.



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

Тем самым задача заключается в минимизации общей стоимости издержек







при ограничениях







и условиях





	

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

	

	, при ограничениях:

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	xj0 ( j = 1(1)5 );

	yj0 ( j = 1(1)2 );

	zj0 ( j = 1(1)3 );

	uj0 ( j = 1(1)6 );

	

	Для удобства решения xj ( j=0(1)5 ); yj ( j=1(1)2 ); zj ( j=1(1)3 ); uj ( j=1(1)6 ) заменим на xk, где k=1(1)17. Ограничения примут вид:

	

	

	

	


	

	

	

	

	

	

	

	

	

	

	xk 0 ( k = 1(1)17)

	Для решения задачи методом искусственных переменных добавим в ограничения и целевую функцию переменные x18, x19, x20, x21, x22:

	

	, 

	

	при ограничениях:

	

	

	

	

	

	

	

	

	

	


	

	

	

	

	xk 0 ( k = 1(1)22)

	


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



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



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



A1x1+...+Anxn+e1xn+e1xn+1+…+emxn+m=A0=[ai0],



где



 .  - единичный базис, ai0 ≥ 0



для всех i = 1, 2,..., n. Применим одну итерацию метода полного исключения к расширенной матрице ограничений Ap=[A1, ., An, e1, ., em, A0].

Преобразование Гаусса называют симплексным преобразованием, когда направляющий элемент определяют по следующим правилам:

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

б) направляющую строку i выбирают так, чтобы отношение  было минимально при условии, что aij>0.

При таком преобразовании в базис вводится вектор Aj и выводится вектор Аi. Теперь надо определить, как выбрать вектор, вводимый в базис, чтобы при этом значение целевой функции увеличилось.

Для этого используют так называемые оценки векторов ∆j:



 (2.2.21)



где Iб - множество индексов базисных векторов; xij- определяют из условия



  (2.2.22)



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



 .



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



Таблица 2.2.




Последняя строка таблицы - индексная служит для определения направляющего столбца. Ее элементы ∆j определяют по формуле (2.2.21). Очевидно, для всех базисных векторов {Ai} i=1,.,m оценки ∆i=a0i=0. 

Значение целевой функции a00 определяется из соотношения



 .



В столбце Bx записываем базисные переменные {xi} i= 1, ..., т. Их значения определяются столбиком свободных членов ai0, то есть xi = ai0, i=1, 2,.,m.

Направляющие строка Ai и столбец Aj указываются стрелками. Если в качестве направляющего элемента выбран aij, то переход от данной симплекс таблицы к следующей определяется соотношениями (2.2.16) - (2.2.18).

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

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

2. В качестве направляющего столбца выбирают Aj, для которого  .

3. Направляющая строка Aі выбирают из условия







4. Делают один шаг (итерацию) метода полного исключения Гаусса с направляющим элементом aij, для чего используют соотношения (2.2.16) - (2.2.18). В частности, элементы индексной строки новой таблицы вычисляют в соответствии с формулой 


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



Правильность вычислений контролируют по формулам непосредственного счета:



 (2.2.23)

 (2.2.24)



В столбце Bx новой таблицы заменяют xi на xj, а в столбце С ci на cj. 

5. Если все a0l(k+1)≥0, l=1,.,n, то новое базисное решение xi= ai0(k+1), i € Iб(k+1) - оптимально. В противном случае переходят к этапу 2 и выполняют очередную итерацию.

6. Второй, третий и четвертый этапы повторяют до тех пор, пока одна из итераций не закончится одним из двух исходов:

а) все a0l ≥0. Это признак (критерий) оптимальности базисного решения последней симплекс-таблицы;

б) найдется такой a0j=∆j<0, что все элементы этого столбца arj≤0, (r = 1, ., m). Это признак неограниченности целевой функции z = ∑cjxj на множестве допустимых решений задачи.



3.2 Метод искусственных переменных



Пусть ограничения задачи ЛП имеют вид Ax≤A0.

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

В общем случае, когда некоторые ограничения имеют знак «≥», например  ai1x1 + ai2x2 +...+ainxn≥bi , i=1,2,...., m, 

то для приведения этих ограничений к стандартной форме равенств свободные переменные надо вычесть. Тогда расширенная форма задачи будет иметь такой вид:



a11x1 + a12x2 +…+ a1nxn - 1xn+1 + 0xn+2 +…+0xn+m = b1; 

a21x1 + a22x2 +…+ a2nxn +0xn+1-1xn+2 +…+0xn+m = b2; (2.3.1)

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

am1x1 + am2x2 +...+ amnxn + 0xn+1 + 0xn+2 +...-1xn+m = bm. 



Свободные переменные {xn+1,…,xn+m}в этом случае уже невозможно использовать в качестве начального базиса, так как xn+1<0,...,xn+m<0. Поэтому в уравнения (2.3.1) дополнительно вводят искусственные переменные xn+m+1,…,xn+m+k. Эти переменные не имеют ничего общего с реальной задачей, и потому их надо вывести из базиса как можно быстрее. Для этого перед началом итераций искусственным переменным в целевой функции приписывают для задач максимизации очень большие по модулю отрицательные коэффициенты (-М), где M>>ci , (i = 1, 2, ..,m).

В случае решения задач минимизации искусственные переменные вводят в целевую функцию с большими положительными коэффициентами (+М).

Знаки искусственных переменных xn+m+1,...,xn+m+k должны совпадать со знаками соответствующих свободных членов. Искусственные переменные образуют начальное базисное решение. Применив симплекс-метод, необходимо вывести из базиса все искусственные переменные. Если удается доказать (или показать), что искусственные переменные полностью вывести из базиса невозможно, то это означает, что задача не имеет решения, то есть ее ограничения противоречивы.




4. Проверка достоверности полученных результатов



В общем случае проверка полученных результатов после очередной итерации вычисления осуществляется следующим образом:

	 Значения элементов строки, содержащей ∆j, вычисляются как элементы симплекс-таблицы (за исключением первой симплекс-таблицы, где такие вычисления невозможны).

	 Значения элементов строки, содержащей ∆j, вычисляются вторым способом, а именно по формулам непосредственного счета:



 

 



 Значения, полученные этими двумя способами, сравниваются. Если значения равны, значит вычисления проведены верно. В обратном случае, пользователю выдается сообщение об ошибке вычислений.

Дополнительным средством проверки достоверности является использование «Инженерного режима», реализованного в программе. В данном режиме можно посмотреть каждый этап вычисления задачи.

В программе также реализованы следующие методы обработки ошибок вычислений:

1. В случае если происходит «зацикливание» программы (в данной программе, если количество итераций больше 100), пользователю выдается сообщение об ошибке. Данная ситуация может возникнуть в случае вырожденности матрицы – вектор, который был ранее выведен из базиса, снова вводится в базис. 

2. В случае если из базиса не удается вывести искусственные переменные, пользователю выдается сообщение об ошибке. Это означает, что ограничения задачи противоречивы и задача не имеет решения.


5. Алгоритм решения задачи



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

Построение симплекс-таблицы по введённым данным.

Добавление искусственных переменных. 

Выбор направляющего элемента. 

Деление направляющей строки на направляющий элемент.

Подсчет остальных элементов новой симплекс таблицы.

Если во время решения достоверность результатов нарушается, прекращаются дальнейшие вычисления, пользователю выдается информация об ошибке.

Если цикл расчета симплекс-таблиц не прекращается, принудительно прекращается процесс, пользователю выдается информация об ошибке.

Если из базисного решения не выведены все искусственные переменные, пользователю выдается информация об ошибке.

Если решение получено, результаты выводятся на экран.




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;

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

function AddVars(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<Base[nn] then

maxel:=Base[nn];

//если единичная матрица неполная, то добавляются дополнительные переменные

if maxel<mm then

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<minel then

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-p-q do

TarFunc[i]:=c;

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

TarFunc[i]:=0;

for i:=4*Form1.TrackBar1.Position-5-p-q to 4*Form1.TrackBar1.Position-6-p-q+ 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>1000 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 i-p-1>0 then

begin

Matr[i,cntx]:=1;

cntx:=cntx+1;

end;

end;

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

begin

if i-q-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-p-q 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-p-q) 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 (i-p-1<=holiday) then

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

else

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

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

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

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

else

StringGrid2.Cells[3,i-q-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 с.





1