Реферат

Реферат Программная реализация задачи дробно-линейного программирования

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 23.11.2024



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

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

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра экономической информации
Курсовой проект

по курсу «Имитационное моделирование экономических процессов»

на тему: «Программная реализация задачи дробно-линейного программирования»
Факультет:

Группа:

Студент:

Преподаватель:
Новосибирск

2009


ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ. 3

1.    ПОСТАНОВКА ЗАДАЧИ.. 4

2.    ТЕКСТ ПРОГРАММЫ.. 7

3.    ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ.. 17

ЗАКЛЮЧЕНИЕ. 20

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ. 21



ВВЕДЕНИЕ




В курсовом проекте необходимо реализовать программное обеспечение, разработанное в среде программирования Delphi 7, в виде консольного приложения на языке Object Pascal.

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

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

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

·       Число производственных ресурсов m может меняться от 2 до 20;

·       Число продуктов n может меняться от 2 до 20.

После разработки программного обеспечения, необходимо сгенерировать и просчитать тестовые примеры разной размерности. Результаты численных экспериментов необходимо сопоставить с результатами, получаемыми при использовании ILOG OPL Studio на тех же исходных данных.

1.     ПОСТАНОВКА ЗАДАЧИ




Администрация производственной фирмы желает рассчитать еженедельную программу выпуска своих изделий A и B, которая дает максимум чистого дохода на рубль всех сделанных затрат.

Изделие А гарантированно реализуется по цене 208.3 руб., а изделие B по цене 23.9 руб.

Расход сырья на изделие A составляет 3 кг, а на изделие B- 2 кг. Расход оборудования на изделие A составляет 2 ст. час., на изделие B- 4 ст.час. Минимальные объемы сырья и станочного парка, при которых не произойдет остановки производства составляют, соответственно: 600 кг, и 400 ст. час. в неделю.

Фирма же имеет 1800 кг сырья, 800 ст. час. оборудования. Себестоимости изделия A и изделия B (без учета заработной платы) составляют, соответственно, 235.6 руб., 3.0 руб.

Сумма оплаты рабочих и служащих фирмы вместе с другими накладными расходами составляет 5.76 тыс. руб. в неделю.
Требуется:

1. Составить экономико-математическую модель расчета оптимальной программы выпуска изделий фирмы.

2. Решить полученную задачу дробно-линейного программирования симплекс-методом с обобщенным критерием оптимальности.
Решение:

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

Введем переменные решаемой задачи:

 - объем производства изделия j.

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






         Также должно выполняться условие неотрицательности переменных задачи:
         Критерием эффективности будет рентабельность продаж, и будет выражаться следующей формулой:
где     pj – цена товара j, по которой он может быть продан на рынке;

сj – себестоимость производства единицы товара j без учета зарплаты;

p0 – накладные расходы производства всего объема продукции.
Задача дробно-линейного программирования решается с помощью симплекс-метода. Строиться исходная симплекс-таблица.

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

Процесс повторяется, пока в столбце свободных членов имеются отрицательные элементы. Как только в столбце свободных членов нет отрицательных элементов, то переходим ко второй фазе симплекс-метода.

Обобщающим критерием оптимальности является – неотрицательность определителей . Если условие оптимальности не выполняются для какого-либо Δk, в качестве разрешающего столбца берем k-тый столбец. Минимальное симплексное отношение элементов столбца свободных членов к соответствующим им по строкам элементам разрешающего столбца выбирается в качестве разрешающей строки. Когда все определители станут положительными, тогда мы  получим оптимальное решение задачи.

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

2.     ТЕКСТ ПРОГРАММЫ




Для разработки программного обеспечения используется среда разработки Borland Delphi 7 с использованием языка Object Pascal.

program Project1;
{$APPTYPE CONSOLE}
uses

  SysUtils, System; //
type matrixtype = array [0..100] of array [0..100] of real; // описание типа

     vector= array of integer; // описание типа
var element: vector; // хранит координаты разрешающего элемента

    matrix: matrixtype; // жорданова матрица

    n,m: integer;  // n ресурсов и m товаров

    i,j: integer; // элемент матрицы

    k: integer; // вспомогательная для формирования первоначальной матрицы

    Input, Output: TextFile; // файловые переменные

    temp: string; // строка из файла

    rent: real; // значение целевой функции

    iteration: integer; // количество итераций

    answer: array of real;
function first_part(matrix: matrixtype): vector;

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

// координаты разрешающего элементы

var a,b,c,d,e: integer;

    min_vector: array of real; // вектор значений Bi/aij

    minimum: real; // значение минимального элемента Bi/aij

begin

SetLength(min_vector,n+1); // установление размерности вектора

SetLength(Result,3);  // установление размерности вектора для разрешающего элемента

// инициализации переменной Result в "-1"

Result[1]:=-1;

Result[2]:=-1;

// поиск отрицательных элементов в правой части матрицы

for a:=1 to n do

  begin

    if (matrix[a,m+1]<0) then // если найден в a-той строке отрицательный элемент

      begin

        for b:=1 to m do // то ищем в a-той строке  отрицательные элементы

          begin

            if (matrix[a,b]<0) then // если нашли отрицательный элемент в строке а,

                                    // то это и будет наш разрешающий столбец

              begin

                  for c:=1 to n do // и мы формирует вектор отношений Bi/aij

                  begin

                    if (matrix[c,b]<>0) then // если элемент aij неотрицателен

                          min_vector[c]:=matrix[c,m+1] / matrix[c,b] // то находим отношение

                    else // иначе

                          min_vector[c]:=-1; // значение отношения Bi/aij равно "-1"

                  end;

                  c:=1;

                  minimum:=min_vector[c]; // первоначально инициализируем минимальное значение первым элементом вектора отношений Bi/aij

                  while ((minimum<=0) AND (c<=n)) do // если он отрицателен, то ищем первое положительное отношение, которое не вылазиет за вектор

                    begin

                      minimum:=min_vector[c]; // найденный первый минимальный положительный элемент

                      c:=c+1; // указатель на следующий элемент вектора отношений Bi/aij

                    end;

                    e:=c; // сохраним в отдельную переменную указатель вектора на мин эелемент

                  for d:=c to n do // пробегаем оставшуюся часть вектора отношений Bi/aij и

                    begin

                      if ((min_vector[d]<minimum) AND (min_vector[d]>0)) then// и ищем минимальное положительное отношение Bi/aij

                        begin

                          minimum:=min_vector[d]; // если нашли, то присваиваем в переменную minimum значение

                          e:=d; // и призваиваем указатель на элемент вектора в e

                        end;

                    end;

                   Result[1]:=e; // значение разрешающей строки

                   Result[2]:=b; // значение разрешающего столбца

               end;

          end;

      end;

  end;
end;
function simplex(matrix: matrixtype; element: vector): matrixtype;

// Функция получает матрицу Matrix и вектор Element с координатами разрешающего элемента и

// производит итерацию симплекс-метода

var i, j, ir, jr: integer;

begin

ir:=element[1]; jr:=element[2];// координаты разрешающего элемента

// вычисления элементов новой матрицы матрицы правилом прямоугольника

for i:=1 to n+2 do // пробегаемся по строкам

  begin

   if (i<>ir) then begin // если строка не разрешающая, то

    for j:=1 to m+1 do // пробегаемся по столбцам

      begin

         if ((j<>jr)) then // если столбец не разрешающих, то

            begin // вычисляем значение элемента новой матрицы правилом прямоугольника

              Result[i,j]:=((matrix[i,j]*matrix[ir,jr])-(matrix[i,jr]*matrix[ir,j]))/matrix[ir,jr];

            end;

      end;

    end;

  end;

// вычислим значения элементов новой матрицы по разрешающему столбцу

  for i:=1 to n+2 do // все строки матрицы

    begin

      result[i,jr]:=-((matrix[i,jr])/(matrix[ir,jr])); // вычисление элементов на разрешающем столбце

    end;

// вычисляем значения матрица по разрешающей строке

  for j:=1 to m+2 do // по всем столбцам

   begin

   // находим значения матрицы по разрешающем строке

     result[ir,j]:=((matrix[ir,j])/(matrix[ir,jr]));

   end;

// значение матрица на месте разрешающего элемента

   result[ir,jr]:=1/matrix[ir,jr];

// копируем в новую матрицу имена переменных

  for i:=1 to n do // в строках

    result[i,0]:=matrix[i,0];

  for j:=1 to m do // в столбцах

    result[0,j]:=matrix[0,j];

// фиксируем имена выведенных и введенных в симлекс-таблицу переменных

    result[ir,0]:=matrix[0,jr]; // введенная

    result[0,jr]:=matrix[ir,0]; // выведенная

end;
function second_part(matrix: matrixtype): vector;

// Второй этап: поиск определителей и нахождение разрешающего элемента

// в случае неоптимальности решения

var det,min_vec: array of real;

    j,h: integer;

    a,b: integer;

    minimum: real;

begin

SetLength(Result,3); // выделение памяти под дин массив для хранения координат

// разрешающего элемента

SetLength(det,m+1);  // выделение памяти под дин массив для хранения

// определителей матрицы

// инициализация переменных на выходе

result[1]:=-1;

result[2]:=-1;

b:=-1; // для хранения номера столбца, первоначально "-1"

for j:=1 to m do // считаем ВСЕ определители, число которых равно числу товаров

  begin // считаем определители матрицы

    det[j]:=(matrix[n+1,j]*matrix[n+2,m+1])-(matrix[n+2,j]*matrix[n+1,m+1]);

    if (det[j]<0) then // если нашли отрицательный определитель

      begin

        b:=j;// то сохраняем в b номер столбца с отрицательным определителем

      end;

  end;

if (b>-1) then begin // если уж нашли столбец, то надо найти и строку

SetLength(min_vec,n+1); // выделение памяти под вектор отношений Bi/aij

for j:=1 to n do // пробегаемся по строкам

  begin

    if (matrix[j,b]>0) then // правые части уже >0, поэтому если aij больше нулю, то

        min_vec[j]:=matrix[j,m+1]/matrix[j,b] // находим отношения

      else

        min_vec[j]:=-1; // иначе "-1"

  end;

minimum:=min_vec[1];  // первый элемент отношения B1/a1j принимаем за минимальный

h:=1; // указатель на этот элемент

while ((minimum<=0) AND (h<=n)) do // если он нас не удовлетворяет, то

  begin

    h:=h+1;

    minimum:=min_vec[h];  // находим ближайший положительный элемент в векторе отношений

  end;

a:=h; // сохраняем указатель на минимальный элемент в векторе

for j:=h+1 to n do // и ищем в оставшейся части минимальный элемент

  begin

    if ((min_vec[j]<minimum) AND (min_vec[j]>0)) then // если найдем, то

      begin

        minimum:=min_vec[j]; // Запишем значение в переменную "minimum"

        a:=j; // в "а" указатель на этот элемент

      end;

  end;

Result[1]:=a; // найденная разрешающая строка

Result[2]:=b; // найденный разрешающий столбец

end;

end;
procedure write_matrix(matrix: matrixtype);

// выводит на консоль матрицу Matrix

var i,j: integer; // индексы массива

begin

for i:=1 to n+2 do // по всем строчкам

begin

  for j:=1 to m+1 do // по всем столбцам

    begin

        Write(FloatToStr(matrix[i,j])+' ');// конвертируем в вещественное число и печатаем на экран

    end;

    writeln(''); // конец строки матрицы печатаем отдельно

end;

end;
procedure write_into_file(matrix: matrixtype);

// Функция печатает матрицу Matrix в файл OUTPUT.txt

var i,j: integer; // Индексы массива

begin

    writeln(Output,'');WriteLn(Output,'[Simplex Table ]'+IntToStr(iteration)); // формируем строчку промежуточного расчета

for i:=1 to n+2 do // по всем строчкам

begin

  for j:=1 to m+1 do // по всем столбикам

    begin

        Write(Output,FloatToStr(matrix[i,j])+' '); // конвертируем в вещественное число и печатаем в текстовый файл

    end;

    writeln(Output,''); // печатаем в файл Output конец строки

end;

end;
begin

SetLength(answer,m+1); // выделение памяти под массив для ответа

WriteLn('Drobno-lineynaya optimization'); // заголовок программы

AssignFile(Input, 'input.txt'); // присвоение файла переменной Input

Reset(Input); // открываем файл для чтения

AssignFile(Output, 'output.txt'); // присвоение переменной Output файла для вывода

Rewrite(Output); // открываем файл для записи решения

ReadLn(Input,Temp);// читаем строку

n:=StrToInt(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1)); // количество ресурсов

ReadLn(Input,Temp); // считываем следующую строку

n:=n*2; // ограничения для минимума и максимума поэтому удваиваем

m:=StrToInt(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1)); // количество товаров

ReadLn(Input,Temp);// убираем пустую строку

ReadLn(Input,Temp); // считываем себестоимость товаров

// инициализация нумерации переменных

for i:=1 to n do // нумеруем строки матрицы

matrix[i,0]:=-i; // отрицательны для различения от переменных основной задачи

for j:=1 to m do // нумеруем столбы матрицы

matrix[0,j]:=j; // положительные, т.к. переменные основной задачи

for j:=1 to m do // для каждого товара

begin // считываем себестоимость из строки temp

matrix[n+2,j]:=-StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1));

temp:=Copy(temp,Pos(';',temp)+1,Length(temp)-Pos(';',temp)); // удаляем обработанный элемент

end;

ReadLn(Input,Temp);// считываем следующую строку

for j:=1 to m do   // по каждому товару

begin // считываем цену товара

matrix[n+1,j]:=-StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1))-matrix[n+2,j]; //и определяем прибыль (цена-с/с)

temp:=Copy(temp,Pos(';',temp)+1,Length(temp)-Pos(';',temp)); // удаляем обработанный элемент из строки temp

end;

ReadLn(Input,Temp);// удаляем пустую строку

ReadLn(Input,Temp);// считываем строку расхода сырья

k:=1; // переменная для нумерации ресурсов

while (k<n) do // пока не обработаем данные о расходе сырья

  begin

    for j:=1 to m do // на каждый товар

      begin

      matrix[k,j]:=-StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1));// считываем данные о расходе для ограничения по минимуму сырья

      matrix[k+1,j]:=StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1));// считываем данные о расходе для ограничения по максимуму сырья

      temp:=Copy(temp,Pos(';',temp)+1,Length(temp)-Pos(';',temp)); // удаляем обработанный элемент строки

      end;

    ReadLn(Input,Temp); // считываем следующую строку

    matrix[k,m+1]:=-StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1)); // выделяем минимальное количество сырья

    temp:=Copy(temp,Pos(';',temp)+1,Length(temp)-Pos(';',temp)); // удаляем его из строки temp

    matrix[k+1,m+1]:=StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1)); // находим максимальное количество товара

    temp:=Copy(temp,Pos(';',temp)+1,Length(temp)-Pos(';',temp)); // удаляем его из строки (хотя это лишняя операция)

    ReadLn(Input,Temp); // считываем информацию по следующему ресурсу

    k:=k+2;

  end;

ReadLn(Input,Temp);  // считываем информацию о накладных расходах (постоянные затраты)

matrix[n+1,m+1]:=-StrToFloat(Copy(temp,Pos('=',temp)+1,Pos(';',temp)-Pos('=',temp)-1)); // записываем значения в строку прибыли со знаком "-"

matrix[n+2,m+1]:=-matrix[n+1,m+1]; // со знаком "+" в строчку затрат

CloseFile(Input); // закрываем входной файл INPUT

WriteLn(Output,'[BEGIN]'); // уже сейчас формируем выходной файл

iteration:=0; // обнуляем счетчик итераций симплекс-метода в ноль

write_into_file(matrix); // вводим матрицу первоначальную в файл

iteration:=iteration+1;  // операция инкремент для количества итераций

write_matrix(matrix); // печатаем первоначальную матрицу на экран

writeln('Press ENTER to continued...'); // печатаем сообщение

readln; // ждем  чтобы пользователь посмотрел первоначальную таблицу

SetLength(element,3); // выделяем память под массив для хранения координат разрешающего элемента

element:=first_part(matrix); // ищем разрешающий элемент

while (element[1]<>-1) do // пока есть отрицательные элементы в правой части, тогда

begin

matrix:=simplex(matrix,element); // производим итерацию симплекс-методом

element:=first_part(matrix); // проверяем оптимальной решения и фиксируем разрешающий элемент в переменную element

write_matrix(matrix); // вывод матрицы на экран

write_into_file(matrix); // и в файл

iteration:=iteration+1; // увеличиваем количество итераций

writeln('Press ENTER to continued...'); // печатаем сообщение

readln; // ждем  чтобы пользователь посмотрел первоначальную таблицу

end;

element:=second_part(matrix); // проверяем оптимальной решения по определителям, правая часть положительня вся, в element-координаты разрешающего элемента

while (element[2]<>-1) do // если имеется столбец с отрицательным определителем

begin

matrix:=simplex(matrix,element); // производим итерацию симплекс-методом

write_matrix(matrix); // вывод матрицы на экран

write_into_file(matrix); // и в файл

iteration:=iteration+1; // увеличиваем количество итераций

element:=second_part(matrix);  // проверяем оптимальность рещения

writeln('Press ENTER to continued...'); // печатаем сообщение

readln; // ждем  чтобы пользователь посмотрел первоначальную таблицу

end;
// формирование ответа пользователю

rent:= matrix[n+1,m+1]/matrix[n+2,m+1]; // вычисляем значение целевой функции

WriteLn('rentabelnost = ',rent:10:4); // печатаем его на экран

WriteLn(Output,' '); // также печатаем ответ в файл OUTPUT

WriteLn(Output,'[ANSWER]'); // также печатаем ответ в файл OUTPUT

WriteLn(Output,'Maximum profitability = '+FloatToStr(rent));

WriteLn(Output,' '); // также печатаем ответ в файл OUTPUT

WriteLn(Output,'[VARIABLES]'); // определяем координаты решения

for i:=1 to n do // проверяем переменные в строчках

begin

if matrix[i,0]>0 then  // если есть переменная в решении, то

  begin

    Write('X',matrix[i,0]:1:0,' = ',matrix[i,m+1]:10:0, '  ');//печатаем на экран

    Write(Output,'X',matrix[i,0]:1:0,' = ',matrix[i,m+1]:10:0, '  ');// и в файл

    answer[i]:=matrix[i,m+1];

  end

  else

  begin

    if (i<=m) then // если нет переменных в решении, то печатаем значение равное 0

    begin

    Write('X',abs(matrix[i,0]):10:0,' = ',0,'  '); // на экран

    Write(Output,'X',abs(matrix[i,0]):10:0,' = ',0, '  '); // и в файл

    answer[i]:=0;

    end;

  end;

end;
WriteLn(Output,'');

WriteLn(Output,'[INTERPRETATION]');

WriteLn(Output,' Максимальная рентабельность предприятия может составить ', rent:10:4, ' при выполнении следующей производственной программы:');

for i:=1 to m do

begin

WriteLn(Output,'Товара №',i,' в объеме ',answer[i]:10:0, ' единиц.');

end;
WriteLn(Output,'');

WriteLn(Output,'[END]');

CloseFile(Output); // закрываем выходной файл

WriteLn(' ');

WriteLn('In current directory create file OUTPUT.EXE when written result of task ');// информируем пользователя об окончании вычислений

ReadLn;
end.

3.     ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ




Рассмотрим пример решения задачи дробно-линейного программирования по своему варианту 321 размерностью: два производственных ресурса и два продукта (2 * 2). Входной файл «input.txt» будет содержать следующую информацию о задаче.
Содержимое файла
INPUT.TXT


Количество_ресурсов=2;

Количество_товаров=2;

[Параметры для целевой функции]

Себестоимость_1 =235,6;Себестоимость_2=3;

Цена_1=208,3;Цена_2=23,9;

[Параметры для ограничений задачи]

Расход_1_сырья_на_1_товар=3;Расход_1_сырья_на_2_товар=2;

Минимум_сырья_1=600;Максимум_сырья_1=1800;

Расход_2_сырья_на_товар_1=2;Расход_2_сырья_на_2_товар=4;

Минимум_сырья_2=400;Максимум_сырья_2=800;
Накладные_расходы=5760;
Окно выполнения программы в консольном режиме представлено  на рис. 1.



Рис.1. Окно выполнения консольного приложения.
После выполнения программы мы получили выходной файл OUTPUT.TXT с решением задачи и промежуточными вычислениями, содержание которого отражено ниже:
Содержимое

файла
OUTPUT.TXT


[BEGIN]
[Simplex Table  0]

-3 -2 -600

3 2 1800

-2 -4 -400

2 4 800

27,3 -20,9 -5760

-235,6 -3 5760
[Simplex Table 1]

-2 -0,5 -400

2 0,5 1600

0,5 -0,25 100

0 1 400

37,75 -5,225 -3670

-234,1 -0,75 6060
[Simplex Table 2]

-2 0,5 -200

2 -0,5 1400

0,5 0,25 200

0 1 400

37,75 5,225 -1580

-234,1 0,75 6360
[Simplex Table 3]

-0,5 -0,25 100

1 0 1200

0,25 0,375 150

0 1 400

18,875 14,6625 -5355

-117,05 -57,775 29770
[Simplex Table 4]

2 0,5 400

-4 -1,5 600

4 1,5 600

0 1 400

-75,5 -13,65 -16680

468,2 117,8 100000

 

[ANSWER]

Maximum profitability = -0,1668

 

[VARIABLES]

X1 =        400  X         2 = 0 

[INTERPRETATION]

 Максимальная рентабельность предприятия может составить    -0.1668 при выполнении следующей производственной программы:

Товара №1 в объеме        400 единиц.

Товара №2 в объеме          0 единиц.
[END]

Сопоставим полученное решение с решением, которое получено при использовании ILOG OPL Studio на тех же исходных данных.





Рис. 2. Лист drobno1 книги Excel ind.xls
 

Рис. 3. Результат вычисления в программе ILOG OPL Studio
x1 = t1/t0=0.004/0.00001=400

x2 = t2/t0=0/0.00001=000

z = -0.1668
         Таким образом, решение разработанной программы совпадает с решением в среде ILOG OPL Studio при одинаковых исходных данных.

Рассмотрим теперь пример решения задачи дробно-линейного программирования следующей размерностью: шесть производственных ресурса и девять продуктов (6 * 9). Входной файл «input.txt» будет содержать следующую информацию о задаче.
Содержимое файла
INPUT
.
TXT



Количество_ресурсов=6;

Количество_товаров=9;

[Параметры для целевой функции]

Себестоимость_1 =235,6;Себестоимость_2=3;Себестоимость_3 =145;Себестоимость_4=50;Себестоимость_5 =20;Себестоимость_6=330;Себестоимость_7 =14;Себестоимость_8=150;Себестоимость_9=450;

Цена_1=208,3;Цена_2=23;Цена_3=115;Цена_4=71;Цена_5=35;Цена_6=300;Цена_7=34;Цена_8=150;Цена_9=468;

[Параметры для ограничений задачи]

Сырье1товар1=3;Сырье1товар2=2;Сырье1товар3=2;Сырье1товар4=4;Сырье1товар5=6;Сырье1товар6=4;Сырье1товар7=4;Сырье1товар8=2;Сырье1товар9=1;

Минимум_сырья_1=9000;Максимум_сырья_1=15000;

Сырье2товар1=7;Сырье2товар2=4;Сырье2товар3=3;Сырье2товар4=5;Сырье2товар5=7;Сырье2товар6=2;Сырье2товар7=3;Сырье2товар8=1;Сырье2товар9=2;

Минимум_сырья_1=15500;Максимум_сырья_1=20000;

Сырье3товар1=1;Сырье3товар2=2;Сырье3товар3=2;Сырье3товар4=4;Сырье3товар5=3;Сырье3товар6=4;Сырье3товар7=6;Сырье3товар8=3;Сырье3товар9=2;

Минимум_сырья_1=8000;Максимум_сырья_1=15000;

Сырье4товар1=2;Сырье4товар2=6;Сырье4товар3=4;Сырье4товар4=2;Сырье4товар5=3;Сырье4товар6=2;Сырье4товар7=5;Сырье4товар8=7;Сырье4товар9=3;

Минимум_сырья_1=25000;Максимум_сырья_1=40000;

Сырье5товар1=2;Сырье5товар2=3;Сырье5товар3=4;Сырье5товар4=5;Сырье5товар5=3;Сырье5товар6=2;Сырье5товар7=5;Сырье5товар8=3;Сырье5товар9=1;

Минимум_сырья_1=10000;Максимум_сырья_1=25000;

Сырье6товар1=3;Сырье6товар6=2;Сырье6товар3=2;Сырье6товар4=4;Сырье6товар5=6;Сырье6товар6=4;Сырье6товар7=4;Сырье6товар8=2;Сырье6товар9=1;

Минимум_сырья_1=9000;Максимум_сырья_1=18000;
Накладные_расходы=60000;
Окно выполнения программы в консольном режиме представлено  на рис. 4.



Рис.4. Окно выполнения консольного приложения.
После выполнения программы мы получили новый выходной файл OUTPUT.TXT с решением задачи и промежуточными вычислениями. Так как количество итераций при решении задачи симплекс-методом насчитывает 20, ниже приведено только решение самой задачи и интерпретация:




Содержимое файла
OUTPUT
.
TXT



[ANSWER]

Maximum profitability = 0,533333333333354

[VARIABLES]

X (         0      5000         0         0         0         0         0         0         0)

[INTERPRETATION]

 Максимальная рентабельность предприятия может составить     0.5333 при выполнении следующей производственной программы:

Товара №1 в объеме          0 единиц.

Товара №2 в объеме       5000 единиц.

Товара №3 в объеме          0 единиц.

Товара №4 в объеме          0 единиц.

Товара №5 в объеме          0 единиц.

Товара №6 в объеме          0 единиц.

Товара №7 в объеме          0 единиц.

Товара №8 в объеме          0 единиц.

Товара №9 в объеме          0 единиц.



Сопоставим полученное решение с решением, которое получено при использовании ILOG OPL Studio на тех же исходных данных.




Рис. 5. Лист drobno2 книги Excel ind.xls


Рис. 6. Результат вычисления в программе ILOG OPL Studio
x1 = t1/t0=0/0.000013333=0

x2 = t2/t0=0.066667/0.000013333=5000

x3 = t3/t0=0/0.000013333=0

x4 = t4/t0=0/0.000013333=0

x5 = t5/t0=0/0.000013333=0

x6 = t6/t0=0/0.000013333=0

x7 = t7/t0=0/0.000013333=0

x8 = t8/t0=0/0.000013333=0

x9 = t9/t0=0/0.000013333=0
z = 0.5333
         Таким образом, решение, полученное нашей программой, совпадает с решением в среде ILOG OPL Studio при одинаковых исходных данных.

Рассмотрим теперь пример решения задачи дробно-линейного программирования следующей размерностью: четыре производственных ресурса и два продукта (4 * 2). Входной файл «input.txt» будет содержать следующую информацию о задаче.
Содержимое файла
INPUT
.
TXT



Количество_ресурсов=4;

Количество_товаров=2;

[Параметры для целевой функции]

Себестоимость_1 =300;Себестоимость_2=150;

Цена_1=350;Цена_2=230;

[Параметры для ограничений задачи]

Сырье1товар1=3;Сырье1товар2=2;;

Минимум_сырья_1=1000;Максимум_сырья_1=2000;

Сырье2товар1=5;Сырье2товар2=7;

Минимум_сырья_1=700;Максимум_сырья_1=2100;

Сырье3товар1=4;Сырье3товар2=1;

Минимум_сырья_1=600;Максимум_сырья_1=1200;

Сырье4товар1=2;Сырье4товар2=4;

Минимум_сырья_1=500;Максимум_сырья_1=1000;
Накладные_расходы=6000;
Окно выполнения программы в консольном режиме представлено  на рис. 7.



Рис.7. Окно выполнения консольного приложения.

После выполнения программы мы получили новый выходной файл OUTPUT.TXT с решением задачи и промежуточными вычислениями:

Содержимое файла
OUTPUT
.
TXT


[Simplex Table 0]

             -3.0000              -2.0000           -1000.0000

              3.0000               2.0000            2000.0000

             -5.0000              -7.0000            -700.0000

              5.0000               7.0000            2100.0000

             -4.0000              -1.0000            -600.0000

              4.0000               1.0000            1200.0000

             -2.0000              -4.0000            -500.0000

              2.0000               4.0000            1000.0000

            -50.0000             -80.0000           -6000.0000

           -300.0000            -150.0000            6000.0000
[Simplex Table 1]

             -1.5714              -0.2857            -800.0000

              1.5714               0.2857            1800.0000

              0.7143              -0.1429             100.0000

             -0.0000               1.0000            1400.0000

             -3.2857              -0.1429            -500.0000

              3.2857               0.1429            1100.0000

              0.8571              -0.5714            -100.0000

             -0.8571               0.5714             600.0000

              7.1429             -11.4286            2000.0000

           -192.8571             -21.4286           21000.0000
[Simplex Table 2]

             -2.0000              -0.5000            -750.0000

              2.0000               0.5000            1750.0000

              0.5000              -0.2500             125.0000

              1.5000               1.7500            1225.0000

             -3.5000              -0.2500            -475.0000

              3.5000               0.2500            1075.0000

             -1.5000              -1.7500             175.0000

             -0.0000               1.0000             500.0000

            -10.0000             -20.0000            4000.0000

           -225.0000             -37.5000           24750.0000
[Simplex Table 3]

             -2.0000               0.5000            -500.0000

              2.0000              -0.5000            1500.0000

              0.5000               0.2500             250.0000

              1.5000              -1.7500             350.0000

             -3.5000               0.2500            -350.0000

              3.5000              -0.2500             950.0000

             -1.5000               1.7500            1050.0000

             -0.0000               1.0000             500.0000

            -10.0000              20.0000           14000.0000

           -225.0000              37.5000           43500.0000
[Simplex Table 4]

             -0.5714               0.3571            -300.0000

              0.5714              -0.3571            1300.0000

              0.1429               0.2857             200.0000

              0.4286              -1.6429             200.0000

             -0.2857              -0.0714             100.0000

              1.0000              -0.0000             600.0000

             -0.4286               1.6429            1200.0000

             -0.0000               1.0000             500.0000

             -2.8571              19.2857           15000.0000

            -64.2857              21.4286           66000.0000
[Simplex Table 5]

              1.3333              -1.8333             -33.3333

             -1.3333               1.8333            1033.3333

             -0.3333               0.8333             133.3333

              2.3333              -3.8333             466.6667

              0.6667              -1.1667             233.3333

             -2.3333               3.8333             133.3333

              1.0000               0.0000            1400.0000

              0.0000               1.0000             500.0000

              6.6667               8.3333           16333.3333

            150.0000            -225.0000           96000.0000
[Simplex Table 6]

             -0.7273              -0.5455              18.1818

             -0.0000               1.0000            1000.0000

              0.2727               0.4545             118.1818

             -0.4545              -2.0909             536.3636

             -0.1818              -0.6364             254.5455

              0.4545               2.0909              63.6364

              1.0000               0.0000            1400.0000

              0.7273               0.5455             481.8182

             12.7273               4.5455           16181.8182

            -13.6364            -122.7273          100090.9091

 

[ANSWER]

Maximum profitability = 0,161671207992734

 

[VARIABLES]

X ( 254.54545 118.18182)

[INTERPRETATION]

 Максимальная рентабельность предприятия может составить     0.1617 при выполнении следующей производственной программы:

Товара №1 в объеме        255 единиц.

Товара №2 в объеме        118 единиц.

[END]

Сопоставим полученное решение с решением, которое получено при использовании ILOG OPL Studio на тех же исходных данных.




Рис. 8. Лист drobno3 книги Excel ind.xls


Рис. 9. Результат вычисления в программе ILOG OPL Studio
x1 = t1/t0=0.0025431/0.0000099909=254.54

x2 = t2/t0=0.0011807/0.0000099909=118.18
z = 0.1616712
         Таким образом, решение, полученное нашей программой, совпадает с решением в среде ILOG OPL Studio при одинаковых исходных данных.

         При тестировании приложения мы использовали тестовые примеры разной размерностью, причем, в первом случае n=m, затем n<m, и в конце n>m. И во всех случаях программа, написанная на языке Delphi, выдавало правильное решение, которое совпадало с решением, полученным с помощью ILOG OPL Studio. Следовательно, программная реализация задачи дробно-линейного программирования выполнена верна.


ЗАКЛЮЧЕНИЕ




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

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

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

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

·       Число производственных ресурсов m может меняться от 2 до 20;

·       Число продуктов n может меняться от 2 до 20.

После разработки программного обеспечения, необходимо сгенерированы и просчитаны тестовые примеры разной размерности. Результаты численных экспериментов сопоставлены с результатами, получаемыми при использовании ILOG OPL Studio на тех же исходных данных.

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ




1.     Бобровский, С. И. Delphi 7 : учебный курс / С. Бобровский. - СПб. [и др.] : Питер , 2007. - 735 с. ил.

2.     Мезенцев Ю. А. Экономико-математические методы: учебное пособие / Ю. А. Мезенцев; Новосиб. гос. техн. ун-т. - Новосибирск : Изд-во НГТУ , 2004. - 212 с. ил.



1. Реферат на тему Critical Analysis On A Tale Of Two
2. Реферат на тему История СССР и Украины в 1953 - 1964 гг
3. Реферат Избраная рада и ее реформы
4. Реферат на тему History Of Japan Essay Research Paper History
5. Реферат на тему Religious Influence On Puritan Literature Sinners In
6. Реферат Влияние атмосферных загрязнителей на растения
7. Реферат Клейтон, Джон Миддлтон
8. Реферат династия романовых 3
9. Реферат на тему The Right To Choose Essay Research Paper
10. Реферат на тему The Cause Of Being Unhappy Essay Research