Автор работы: Пользователь скрыл имя, 28 Августа 2014 в 13:13, курсовая работа
Целью данной курсовой работы является рассмотрение теоретического описания двойственности оптимизационных задач для разработки программы, реализующей один из методов этой оптимизации.
Исходя из цели, сформируем следующие задачи:
— ознакомиться с теоретическим описанием двойственности в оптимизационных задачах;
— решить вручную задачу одним из методов оптимизации;
— реализовать алгоритм метода на любом языке программирования.
Рисунок 2.1 – Общий вид матрицы исходных данных
Каждая строка матрицы соответствует одному ресурсу, каждый столбец – одному продукту. Справа от каждой строки записана величина ограничения по ресурсу (b1,…, bi,…, bm); внизу каждого столбца - цена продуктов (с1,…, сj,…, сm).
В каждой клеточке матрицы записаны так называемые технологические коэффициенты aij, показывающие расход i-го ресурса на производство единицы j-го продукта.
Запишем конкретный числовой пример
Рисунок 2.2 – Пример матрицы исходных данных
2.2 Построение математической модели
Теперь приступим к созданию математической модели, т.е. к математической записи задачи.
Целевая функция:
Ограничения:
x1 ³ 0;
x2 ³ 0;
x3 ³ 0.
Описание решения данной задачи
Решим поставленную выше задачу с применением MS EXCEL.
Рисунок 2.3 – Исходные данные для решения задачи
Содержание ячеек:
B1:D1 – имена продуктов (технологических способов);
A2:A4 – имена ресурсов;
B2:D4 – технологические коэффициенты (расход ресурсов при единичных интенсивностях технологических способов);
B6:D6 – цены продуктов;
B8:D8 – переменные;
F2:F4 – запас ресурсов;
G2:G4 – плановые расходы ресурсов, получаются в результате решения;
G6 – значение целевой функции, получается в результате решения.
Формулы для вычислений:
G2=СУММПРОИЗВ (B$8:D$8; B2:D2);
G3:G4 – копируются из G2;
G6=СУММПРОИЗВ (B8:D8; B6:D6).
Запишем формулы в ячейки G2:G4. Установить курсор на G2. На панели инструментов выбрать значок формул (f). Появятся два окна. В окне «категория» выбрать «математические», затем в окне «функция» выбрать «СУММПРОИЗВ». Появится окно «СУММПРОИЗВ». В нем нужно указать, где располагаются операнды. Первый операнд – строка B$8:D$8, второй операнд – стока B2:D2. В ячейки G3:G4 формулу скопировать из G2. Аналогичным образом записать формулу целевой функции в ячейку G6. Теперь нужно указать остальные условия решения задачи. Установить курсор на ячейку целевой функции G6. В главном меню выбрать «сервис», а потом «поиск решения». Появится окно, в котором нужно указать:
B8:D8 0 – неотрицательности переменных;
G2:G4 F2:F4 – плановый расход ресурсов меньше их запаса.
Рисунок 2.4 – Мастер поиска решения
Теперь электронная модель сформирована и можно решать задачу. Для этого нужно вернуться в окно «поиск решения» и нажать «выполнить». Если электронная модель сформирована правильно, то будет получено сообщение, что задача решена. Результат решения находится на листе EXCEL и в трех отчетах: Результаты, Устойчивость, Пределы.
Рисунок 2.5 – Результат количественного решения задачи
Основные результаты видны в таблице (Рисунок 2.3).
1. Значение целевой функции в ячейке G6 = 15880;
2. Значения переменных в ячейках B8:D8: х1 = 86, х2 = 0, х3 = 268; это значит, что 1-й продукт должен производиться в объеме 86 единиц, 2-й – 0, а 3-й – 286.
3. Плановый расход ресурсов в ячейках G2:G4: расход 1-го ресурса = 271,6, расход 2-го ресурса = 310, расход 3-го ресурса = 2200.
Как видно 1-й ресурс недоиспользован, а 2-й и 3-й израсходованы полностью.
3 КОМПЬЮТЕРНАЯ РЕАЛИЗАЦИЯ ДВОЙСТВЕННОЙ ЗАДАЧИ
3.1 Руководство пользователю по программному
продукту «Pascal ABC»
Программа запускается открытием файла «Pascal ABC», внешний вид которого представлен на рисунке 3.1.После открытия файла в появившемся окне будет показан текст программы.
Рисунок 3.1 - Файл запуска программы Pascal ABC
В начале программы осуществляется подключение библиотеки
uses crt; |
После этого идет описание переменных и массива:
a:array [1..4,1..3] of real; b:array [1..3] of real; i,j,k,r:integer;
При помощи функции clrscr производится очистка
|
Затем идет заполнение массива
for i:=1 to 4 do
for j:=1 to 3 do
В программе имеется процедура, которая проверяет наличие текстового файла store.txt из действительных чисел, которые представляют собой вес каждого предмета, и если этого файла нет, то создаёт его. При создании файла требуется ввести количество всех предметов n и максимальную величину веса предмета, соответствующую минимальной грузоподъёмности рюкзака min. Если файл store.txt существует в папке с программой, выполняется подпрограмма, распределяющая предметы в наименьшее количество рюкзаков. Вначале количеству рюкзаков v, суммарному весу предметов w, количеству всех предметов n присваивается нулевое значение. Программа сначала подсчитывает количество всех предметов n (количество целых чисел, содержащихся в файле g). После этого выделяется память под массив целых чисел p[0..n], и все целые числа из файла store.txt записываются в массив p[n].:
if a[4,1]<a[4,2] then r:=1 else r:=2; for i:=1 to 3 do b[i]:=a[i,3]/a[i,r]; if (b[1]<b[2]) and (b[1]<b[3]) then k:=1 else if (b[2]<b[1]) and (b[2]<b[3]) then k:=2 else if (b[3]<b[1]) and (b[3]<b[2]) then k:=3; |
Перед нами появляется диалоговое окно в котором нужно ввести данные по исходным ресурсам и затратам с ограничениями, как показано на рисунке 3.2.
Рисунок 3.2 - Рабочее окно программы Pascal ABC
После появившегося окна можно вводить данные.
Рисунок 3.3 - Данные вводимые в программе
После ввода данных на экране появляются посчитаные значения(рис.3.4).
Рисунок 3.4 - Вывод решения Pascal ABC
Таким образом, с помощью PascalABC была реализована Двойственная задача.
Данный программный продукт может находить разрешающие элементы, а так же оптимальное решение двойственной задачи.
3.2 Краткий вывод по компьютерной реализации двойственной задачи
Данная задача дискретного программирования, была реализована мною в среде Pascal ABC. С помощью руководства для пользователя этой программы продукта человек как работающий в данной области дискретного программирования, так и обычный рядовой user может разобраться в принципе работы этой программы, а так же в алгоритме ее работы. Для удобства восприятия мною были приведены графические изображения ярлыков программы и рабочие окна, подробно объяснён порядок ввода данных и действий, совершаемых пользователем, для использования программ.
Так же мною описан принцип работы программного продукта, объяснены выполняемые в нём команды и алгоритм выполняемых вычислений.
После получения данных с помощью программы , написанной на языке Pascal ABC, можно убедиться в том что она работают корректно, ввиду одинаковых выводимых конечных данных в примере ручного варианта.
Данное программное обеспечение может использоваться как в домашних условиях, так и в компьютерных классах.
ЗАКЛЮЧЕНИЕ
.
Таким образом, мы убедились, что теория математического линейного программирования позволяет не только получать оптимальные планы с помощью эффективных вычислительных процедур, но и делать ряд экономически содержательных выводов, основанных на свойствах задачи, которая является двойственной по отношению к исходной Различают симметричные, несимметричные и смешанные двойственные задачи.
На основе полученных знаний вручную и на компьютере было осуществлено решение двойственной задачи. Учитывая все данные запасы и ограничения, мы получили оптимальное решение.
Данная задача позволяет находить оптимальное решение для различных экономических задач, что делает ее незаменимой в экономике. Двойственная задача очень практична и является одной из самых распространенных примеров дискретной оптимизации.
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ А
program dvoystvennaya_zadacha;
uses crt;
var
a:array [1..4,1..3] of real;
b:array [1..3] of real;
i,j,k,r:integer;
begin
clrscr;
for i:=1 to 4 do
for j:=1 to 3 do
begin
write('vvedite a[',i,';',j,'] ');
readln(a[i,j]);
end;
while (a[4,1]<0) or (a[4,2]<0) do
begin
if a[4,1]<a[4,2] then r:=1 else r:=2;
for i:=1 to 3 do
b[i]:=a[i,3]/a[i,r];
if (b[1]<b[2]) and (b[1]<b[3]) then k:=1 else
if (b[2]<b[1]) and (b[2]<b[3]) then k:=2 else
if (b[3]<b[1]) and (b[3]<b[2]) then k:=3;
writeln('a[',k,';',r,']-
for i:=1 to 4 do
for j:=1 to 3 do begin
if (i<>k) and (j<>r) then
a[i,j]:=a[i,j]-(a[i,r]*a[k,j])
for j:=1 to 3 do
if j<>r then a[k,j]:=a[k,j]/a[k,r];
for i:=1 to 4 do
if i<>k then a[i,r]:=-(a[i,r]/a[k,r]);
a[k,r]:=1/a[k,r];
for i:=1 to 4 do
begin for j:=1 to 3 do
write (a[i,j]:5:2); writeln; end;
end;
writeln('x1=',a[1,3]:5:2);
writeln('x2=',a[2,3]:5:2);
writeln('z=',a[4,3]:5:2);
writeln('y1=',a[4,1]:5:2);
writeln('y2=',a[4,2]:5:2);
readln;
end.
Информация о работе Прямые и двойственные задачи линейного программирования