Основные теоремы двойственности
Двойственные задачи в линейном программировании. Симметричные и несимметричные двойственные задачи. Связь исходной и двойственной задач. Анализ моделируемой ситуации (моделируемого объекта). Реализация двойственности на Visual Basic for Application.
Рубрика | Математика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.10.2011 |
Размер файла | 703,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Федеральное агентство по образованию
КУРСОВАЯ РАБОТА
По дисциплине Математические методы
Тема: Основные теоремы двойственности
Саранск 2008г.
ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ
По дисциплине Математические методы
Тема: Основные теоремы двойственности
Курсовая работа выполняется на 41 листе и включает следующие разделы:
1 Двойственные задачи в линейном программировании
2 Виды двойственных задач
2.1 Симметричные двойственные задачи
2.2 Несимметричные двойственные задачи
3 Теоремы двойственности
4 Реализация двойственности на Visual Basic for Application
Введение
Содержание двойственности состоит в сопоставлении исходной задаче C другой задачи С*, формируемой по определенным правилам и называемой двойственной. Эти задачи связаны математически содержательными соотношениями, позволяющими, например, получить оценки критериальной эффективности всех параметров, формирующих задачу C, свести решение оптимизационной задачи к решению некоторой системы неравенств, сформировать в изящной форме условия оптимальности, оценить скорость сходимости итерационных процессов для задачи C.
Если задача в математическом и линейном программировании - результат моделирования конкретной экономической (производственной) ситуации, то двойственность и та информация, которую двойственность порождает, позволяют провести глубокий анализ моделируемой ситуации (моделируемого объекта), выявить узкие места, тенденции динамики объекта, выразив эти факторы в количественной форме. За такого рода анализом закрепился термин - экономико-математический анализ. Профессионально сделанные пакеты прикладных программ, решающие задачи математического или линейного программирования, обычно выдают в форме удобных распечаток всю совокупность информации, необходимую для экономико-математического анализа.
1 Двойственные задачи в линейном программировании
С каждой задачей линейного программирования тесно связана другая линейная задача, называемая двойственной. Первоначальная задача называется исходной.
Связь исходной и двойственной задач состоит в том, что коэффициенты ci функции цели исходной задачи являются свободными членами системы ограничений двойственной задачи, свободные члены bi системы ограничений исходной задачи служат коэффициентами функции цели двойственной задачи, а матрица коэффициентов системы ограничений двойственной задачи является транспонированной матрицей коэффициентов системы ограничений исходной задачи. Решение двойственной задачи может быть получено из решения исходной и наоборот.
В качестве примера рассмотрим задачу использования ресурсов: предприятие имеет t видов ресурсов в количестве bi (i = 1, 2, ..., m) единиц, из которых производится n видов продукций. Для производства 1 единицы i- й продукции расходуется aij единиц t-гo ресурса, а ее стоимость составляет ci единиц. Составить план выпуска продукции, обеспечивающий ее максимальный выпуск в стоимостном выражении.
Обозначим через xj (j =1,2, ..., n) количество единиц j-й продукций, Тогда исходную задачу сформулируем так.
Найти вектор X =(x1, x2, …, xn), который удовлетворяет ограничениям:
xj 0 (j =1,2, ..., n)
и доставляет максимальное значение линейной функции:
F(x) = c1x1 + c2x2 + … + cnxn,
Оценим ресурсы, необходимые для изготовления продукции. За единицу стоимости ресурсов примем единицу стоимости выпускаемой продукции. Обозначим через уi (j =1,2, ..., m) стоимость единицы i-го ресурса. Тогда стоимость всех затраченных ресурсов, идущих на изготовление единицы j-й продукции, равна . Стоимость затраченных ресурсов не может быть меньше стоимости окончательного продукта, поэтому должно выполняться неравенство , j =1,2, ..., n. Стоимость всех имеющихся ресурсов выразится величиной . Итак, двойственную задачу можно сформулировать следующим образом.
Найти вектор Y =(y1, y2, …, yn), который удовлетворяет ограничениям:
yj 0 (j =1,2, ..., n),
и доставляет минимальное значение функции:
f = b1y1 + b2y2 + … + bmym>min
Рассмотренные исходная и двойственная задачи могут быть экономически интерпретированы следующим образом.
Исходная задача. Сколько и какой продукции xj (j =1,2, ..., n) необходимо произвести, чтобы при заданных стоимостях cj (j =1,2, ..., n) единицы продукции и размерах имеющихся ресурсов bi (i =1,2, ..., n) максимизировать выпуск продукции в стоимостном выражении?
Двойственная задача. Какова должна быть цена единицы каждого из ресурсов, чтобы при заданных количествах ресурсов bi и величинах стоимости единицы продукции сi минимизировать общую стоимость затрат?
Переменные уi называются оценками или учетными, неявными ценами.
Многие задачи линейного программирования первоначально ставятся в виде исходных или двойственных задач, поэтому имеет смысл говорить о паре двойственных задач линейного программирования.
2 Виды двойственных задач
2.1 Симметричные двойственные задачи
Разновидностью двойственных задач линейного, программирования являются двойственные симметричные задачи, в которых система ограничений как исходной, так и двойственной задач задается неравенствами, причем на двойственные переменные налагается условие неотрицательности. Количество ограничений равно количеству переменных.
Исходная задача. Найти матрицу Х = (x1, x2, …, xn), которая удовлетворяет системе ограничений AX>An, X>0 и минимизирует линейную функцию Z = CX.
Двойственная задача. Найти матрицу Y = (y1, y2, …, yn), которая удовлетворяет системе ограничений YA C, Y 0 и максимизирует функцию F = YAm.
Систему неравенств с помощью дополнительных переменных можно преобразовать в систему уравнений, поэтому всякую пару симметричных двойственных задач можно преобразовать в пару несимметричных. Используя симметричность, можно выбрать задачу, более удобную для решения.
Исходная задача: Z = x1 + 2x2 + 3x3 >min при ограничениях:
Очевидно, для того чтобы записать двойственную задачу, сначала необходимо систему ограничений исходной задачи привести к виду AX>An. Для этого второе неравенство следует умножить на -1.
Двойственная задача. Найти максимум функции f = 2y1+ 3y2 + 6y3 + 3y4 при ограничениях
Для решения исходной задачи необходимо ввести четыре дополнительные переменные, и после преобразования системы - одну искусственную. Таким образом, исходная симплексная таблица будет состоять из шести строк и девяти столбцов, элементы которых подлежат преобразованию.
Для решения двойственной задачи необходимо ввести три дополнительные переменные. Система ограничений не требует предварительных преобразований, ее первая симплексная таблица содержит четыре строки и восемь столбцов. Двойственную задачу решаем симплексным методом (таблица 1). Оптимальный план двойственной задачи Y* = (0; 1/2; 3/2; 0), fmax = 21/2. Оптимальный план исходной задачи находим, используя оценки (m + 1)-й строки последней итерации, стоящие в столбцах A5, A6, A7: x1 = 3/2 + 0 = 3/2; x2 = 9/2 + 0 = 9/2; x3 = 0 + 0 = 0. При оптимальном плане исходной задачи X* = (3/2; 9/2; 0) линейная функция достигает наименьшего значения: Zmin =21/2.
Таблица 1
i |
Базис |
С базиса |
An |
2 |
3 |
6 |
3 |
0 |
0 |
0 |
|
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
A7 |
|||||
1 2 3 |
A5 A6 A7 |
0 0 0 |
1 2 3 |
2 2 -1 |
-1 1 4 |
1 1 -2 |
2 -1 -2 |
1 0 0 |
0 1 0 |
0 0 1 |
|
m + 1 |
Zi - Cj |
0 |
-2 |
-3 |
-6 |
-3 |
0 |
0 |
0 |
||
1 2 3 |
A3 A6 A7 |
6 0 0 |
1 1 5 |
2 0 3 |
-1 2 6 |
1 0 0 |
2 -1 2 |
1 -1 2 |
0 1 0 |
0 0 1 |
|
m + 1 |
Zi - Cj |
6 |
10 |
-9 |
0 |
9 |
6 |
0 |
0 |
||
1 2 3 |
A3 A2 A7 |
6 3 0 |
3/2 ? 2 |
2 0 3 |
0 1 0 |
1 0 0 |
3/2 -1/2 4 |
? -1/2 5 |
? ? 3 |
0 0 1 |
|
m + 1 |
Zi - Cj |
21/2 |
10 |
0 |
0 |
9/2 |
3/2 |
9/2 |
0 |
2.2 Несимметричные двойственные задачи
В несимметричных двойственных задачах количество условий ограничений меньше, чем количество переменных, система ограничений исходной задачи задается в виде равенств, а двойственной - в виде неравенств, причем в последней переменные могут быть и отрицательными. Для простоты доказательств постановку задачи условимся записывать в матричной форме.
Исходная задача. Найти матрицу-столбец X = (x1, x2, …, xn), которая удовлетворяет ограничениям AX = A0, Х 0 и минимизирует линейную функцию Z = СХ.
Двойственная задача. Найти матрицу-строку Y = (y1, y2, …, ym), которая удовлетворяет ограничениям YA С и максимизирует линейную функцию f = YA0.
В обеих задачах C = (c1, c2, …, cn) - матрица-строка, An = (b1, b2, …, bm) -матрица-столбец, А = (aij) - матрица коэффициентов системы ограничений.
Для составления несимметричной двойственной задачи используются те же правила, что и для составления симметричной двойственной задачи, но с учетом особенностей:
1. Если задача имеет канонический вид, то ограничения двойственной задачи будут неравенства. Если в целевой функции исходной задачи требуется найти минимум, то знак неравенства - ?, а если требуется найти максимум, то знак неравенства - ?.
2. Переменные уi для канонической задачи произвольны по знаку.
3 Теоремы двойственности
Если из пары двойственных задач одна обладает оптимальным планом, то и другая имеет решение, причем для экстремальных значений линейных функций выполняется соотношение: min Z = max f.
Если линейная функция одной из задач не ограничена, то другая не имеет решения.
Доказательство. Предположим, что исходная задача обладает оптимальным планом, который получен симплексным методом. Не нарушая общности, можно считать, что окончательный базис состоит из т первых векторов A1, A2, ..., Am. Тогда последняя симплексная таблица имеет вид:
Таблица 2
i |
Базис |
С базиса |
A0 |
C1 |
C2 |
… |
Cm |
Cm+1 |
… |
cn |
|
A1 |
A2 |
… |
Am |
Am+1 |
… |
An |
|||||
1 2 . . . m |
A1 A2 . . . Am |
C1 C2 . . . Cm |
x1 x2 . . . xm |
1 0 . . . 0 |
0 1 . . . 0 |
... ... . . . . |
0 0 . . . 1 |
x1, m+1 x2, m+1 . . . xm, m+1 |
… … . . . … |
x1n x2n . . . xmn |
|
m+1 |
Zi - Cj |
Z0 |
Z1 - C1 |
Z2 - C2 |
... |
Zm - Cm |
Zm+1 - Cm+1 |
… |
Zn - Cn |
Пусть D -- матрица, составленная из компонент векторов окончательного базиса A1, A2, ..., Am, тогда таблица 2 состоит из коэффициентов разложения векторов A1, A2, ..., An исходной системы по векторам базиса, т. е. каждому вектору Aj в этой таблице соответствует такой вектор Xj, что Aj = DXj (j= 1,2, ,.., n).
Для оптимального плана получаем A0 = DX*, где X* = (x*1, x*2, …, x*m). Обозначим через матрицу, составленную из коэффициентов разложения векторов Аj (j = 1, 2, ..., n), записанных в таблице 2. Тогда, учитывая соотношения Aj = DXj (j= 1,2, ,.., n) и An = DX*, получаем:
A = D, D-1A =,
A0=DX*; D-1A0 = X*,
min Z= C*X*,
= C*-C 0,
где С* = (C*1, C*2, …, C*m), С = (C1, C2, …, Cm, Cm+1, …, Cn), a = (C*X1 -C1; С*Х2 - С2, ..., C*Xn - Cn) = (Z1 - С1; Z2 - C2; ..., Zn - Cn) - вектор, компоненты которого неположительные, так как они совпадают с Zj - Cj 0, соответствующими оптимальному плану.
Оптимальный план исходной задачи имеет вид X* = D-1 А0, поэтому оптимальный план двойственной задачи ищем в виде Y* = C*D-1.
Покажем, что Y* действительно план двойственной задачи. Для этого ограничения YA С запишем в виде неравенства YA - С 0, в левую часть которого подставим Y*. Тогда на основании Y* = C*D-1, A = D, D-1A = и = C*--C 0 получим Y* А - С = С* D-1А - С = С* - С 0, откуда находим Y*A С.
Так как Y* удовлетворяет ограничениям YA С, то это и есть план двойственной задачи. При этом плане значение линейной функции двойственной задачи f (Y*) = Y*An.
Учитывая соотношения:
A0=DX*; D-1A0 = X*,
min Z= C*X*
Y* = C*D-1,
имеем f (Y*) = Y*A0 = C*D-1 A0 = C*X* = min Z(X).
Таким образом, значение линейной функции двойственной задачи от Y* численно равно минимальному значению линейной функции исходной задачи.
Докажем теперь, что Y* является оптимальным планом. Умножим AX = A0, Х 0 на любой план Y двойственной задачи, а YA С - на любой план X исходной задачи: YAX=YA0=f (Y), YAX СХ = Z (X), отсюда следует, что для любых планов Х и Y выполняется неравенство f (Y) Z (X).
Этим же соотношением связаны и экстремальные значения максимума функции f (Y) min Z (Х). Из последнего неравенства заключаем, что максимальное значение линейной функции достигается только в случае, если max f (Y) = min Z (X), но это значение f (Y) достигает при плане Y*, следовательно, план Y* -- оптимальный план двойственной задачи.
Также можно доказать, что если двойственная задача имеет решение, то исходная также обладает решением и имеет место соотношение max f (Y) = min Z (X).
Для доказательства второй части теоремы допустим, что линейная функция исходной задачи не ограничена снизу. Тогда из f (Y) Z (X) следует, что f (Y) - . Это выражение лишено смысла, следовательно, двойственная задача не имеет решений.
Аналогично предположим, что линейная функция двойственной задачи не ограничена сверху. Тогда из f (Y) Z (X) получаем, что Z (X) +. Это выражение также лишено смысла, поэтому исходная задача не имеет решений.
Доказанная теорема позволяет при решении одной из двойственных задач находить оптимальный план другой.
Исходная задача. Найти минимальное значение линейной функции Z = x2 - x4 - 3x5, при ограничениях:
xij 0 (j = 1, 2, …, 6)
Здесь матрица-строка С = (0;. 1; 0; -1; -3, 0), матрица-столбец
Двойственная задача. Найти максимум линейной функции f = y1 + 2y2 +5y3 при ограничениях:
Решение исходной задачи находим симплексным методом (таблица 3)
Таблица 3
i |
Базис |
С базиса |
A0 |
0 |
1 |
0 |
-1 |
-3 |
0 |
|
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
|||||
1 2 3 |
A1 A3 A6 |
0 0 0 |
1 2 5 |
1 0 0 |
2 -4 3 |
0 1 0 |
-1 2 0 |
1 -1 1 |
0 0 1 |
|
m + 1 |
Zi - Cj |
0 |
0 |
-1 |
0 |
1 |
3 |
0 |
||
1 2 3 |
A5 A3 A6 |
-3 0 0 |
1 3 4 |
1 1 -1 |
2 -2 1 |
0 1 0 |
-1 1 1 |
1 0 0 |
0 0 1 |
|
m + 1 |
Zi - Cj |
-3 |
-3 |
-7 |
0 |
4 |
0 |
0 |
||
1 2 3 |
A5 A4 A6 |
-3 -1 0 |
4 3 1 |
2 1 -2 |
0 -2 3 |
1 1 -1 |
0 1 0 |
1 0 0 |
0 0 1 |
|
m + 1 |
Zi - Cj |
-15 |
-7 |
1 |
-4 |
0 |
0 |
0 |
||
1 2 3 |
A5 A4 A2 |
-3 -1 1 |
4 11/3 1/3 |
3 -1/3 -2/3 |
0 0 1 |
1 1/3 -1/3 |
0 1 0 |
1 0 0 |
0 2/3 1/3 |
|
m + 1 |
Zi - Cj |
-46/3 |
-19/3 |
0 |
-11/3 |
0 |
0 |
-1/3 |
Оптимальный план исходной задачи X* = (0; 1/3; 0; 11/3; 4; 0), при котором Zmin = - 46/3, получен в четвертой итерации табл. 1.2. Используя эту итерацию, найдем оптимальный план двойственной задачи. Согласно теореме двойственности оптимальный план двойственной задачи находится из соотношения Y* = C*D-1, где матрица D-1 - матрица, обратная матрице, составленной из компонент векторов, входящих в последний базис, при котором получен оптимальный план исходной задачи. В последний базис входят векторы A5, A4, A2, значит:
D = (A5, A4, A2) =
Обратная матрица D-1 образована из коэффициентов, стоящих в столбцах A1, A3, A6 четвертой итерации
D-1 =
Из этой же итерации следует С* = (-3; -1; 1). Таким образом:
Y = С*D-1 = (-3; -1; 1) *
Y* = (-19/3; -11/3; -1/3),
т. е. yi = С*Хi
где Хi -- коэффициенты разложения последней итерации, стоящие в столбцах векторов первоначального единичного базиса.
Таким образом, i-ю двойственную переменную можно получить из значения оценки (m + 1)-й строки, стоящей против соответствующего вектора, входившего в первоначальный единичный базис, если к ней прибавить соответствующее значение коэффициента линейной функции:
у1 = - 19/3 + 0 = -19/3; y2 = -11/3 + 0 = -11/3; у3 = -1/3+0 = -1/3. При этом плане max f = -46/3.
двойственный задача линейный
4 Реализация двойственности на Visual Basic for Application
При нажатии на кнопку Start (рисунок А.1) появляется форма (рисунок А.2), где в текстовые поля вводятся значения количества переменных и уравнений. Вводимые значения должны целыми числами от 2 до 20. Также на форме при помощи Option Button выбирается направление функции (максимум или минимум). При нажатии кнопки Ok в процедуре Private Sub CommandButton1_Click() происходит проверка введенных значений:
If Not IsNumeric(TextBox1.Text) Or Val(TextBox1.Text) < 2 Or Val(TextBox1.Text) > 20 Or Not IsNumeric(TextBox2.Text) Or Val(TextBox2.Text) < 2 Or Val(TextBox2.Text) > 20 Then
MsgBox ("Значение количества переменных и количества уравнений - целое число не большее 20")
TextBox1.Text = ""
TextBox2.Text = ""
ElseIf OptionButton1.Value = False And OptionButton2.Value = False Then
MsgBox ("Выберите направление функции")
Else
n = Int(TextBox1.Text)
m = Int(TextBox2.Text)
End if
Если значения, введенные на форму, не соответствуют ограничениям (т.е. если введен текст или не выбрано направление), то появляется сообщение об ошибке (рисунок А.3) или сообщение о необходимости выбрать направление функции (рисунок А.4). Если введенные значения соответствуют ограничениям, то начинается ввод коэффициентов целевой функции через окно ввода (рисунок А.5), а потом коэффициентов системы ограничений (рисунок А.6) и свободных членов (рисунок А.7). Если в окно ввода введено неправильное значение появляется сообщение об ошибке (рисунок А.8).
После окончания ввода происходит построение целевой функции двойственной задачи и ее вывод на лист Excel (рисунок А.9):
p = 0
k = 1
For i = 1 To m
p = p + 2
k = k + 2
b = InputBox("Ввод свободных членов" & " " & i & " уравнения")
Cells(m + 7, p).HorizontalAlignment = xlCenter
Cells(m + 7, k).HorizontalAlignment = xlCenter
построение функции двойственной задачи
Cells(m + 7, p) = b
Cells(m + 7, k) = "y" & i
Next i
Далее выполняется построение системы ограничений двойственной задачи:
k = 0
s = 1
For j = 1 To n
k = 0
For i = 1 To m
k = k + 1
Cells(m + 9 + s, k) = Cells(i + 2, j + 3)
Cells(m + 9 + s, k).HorizontalAlignment = xlCenter
Next i
s = s + 1
Next j
прорисовка надписей
For i = 1 To m
Cells(m + 9, i) = "y" & i
Next i
После окончания ввода и построения двойственной задачи необходимо нажать кнопку Podschet для начала решения исходной задачи симплекс методом, которое происходит в прцедуре Private Sub CommandButton2_Click(). Сначала считается ?j для свободных членов и строка коэффициентов:
f = 0
For i = 1 To m
f = f + Cells(i + 2, 1) * Cells(i + 2, 3)
Next i
ActiveSheet.Cells(m + 3, 3).Value = f
s = 0
For j = 1 To n + m
For i = 1 To m
s = s + Cells(i + 2, 1) * Cells(i + 2, j + 3)
Next i
dtj = s - Cells(1, j + 3)
ActiveSheet.Cells(m + 3, j + 3).Value = dtj
s = 0
Next j
Далее в зависимости от выбранного направления функции происходит поиск номера ключевого столбца и строки. В результате чего определяется ключевой элемент. После определения ключевого элемента выполняется подсчет элементов таблицы по правилу прямоугольника, кроме элементов ключевой строки:
ReDim ai(i, j)
ReDim bi(i)
For i = 1 To m
For j = 1 To n + m
If i + 2 <> kls Then
pr = Cells(i + 2, j + 3) * al - Cells(kls, j + 3) * Cells(i + 2, kl)
ai(i, j) = pr / al
prb = Cells(i + 2, 3) * al - Cells(kls, 3) * Cells(i + 2, kl)
bi(i) = prb / al
End If
Next j
Next i
For i = 1 To m
For j = 1 To n + m
If i + 2 <> kls Then
Cells(i + 2, j + 3).Value = ai(i, j)
Cells(i + 2, 3).Value = bi(i)
End If
Next j
Next i
Потом происходит поиск элементов ключевой строки путем деления элементов данной строки на ключевой элемент:
For j = 1 To n + m
a = Cells(kls, j + 3).Value / al
Cells(kls, j + 3).Value = a
Next j
b = Cells(kls, 3) / al
Cells(kls, 3).Value = b
Далее выполняется подсчет значения целевой функции, если возможно, и вывод при помощи окна сообщения (рисунок А.10) или сообщение об отсутствии решений (рисунок А.11).
Для очистки текстовых полей и листа необходимо нажать кнопку Clear, а для выхода - кнопку Exit.
Если необходимо получить справку, нужно нажать кнопку Help (рисунок А.1), а чтобы вернуться обратно - кнопку Back на листе 2.
Заключение
Двойственность, в математическом программировании, как и вообще в математике, играет фундаментальную роль. Она выступает в качестве краеугольного камня соответствующих теорий, порождает арсенал конструктивных средств анализа математических моделей, построения эффективных алгоритмов решения задач и формальной оценки этой эффективности. Двойственность, в зависимости от ее конкретного содержания, определяемого конкретной математической дисциплиной (алгебра, функциональный анализ, теория оптимального управления и т.д.), несет в себе следы специфики соответствующей дисциплины. Но именно это обстоятельство и превращает двойственность, в математике, в здание, хотя в определенном смысле и единой, но гармонически организованной и насыщенной архитектуры.
Список использованных источников
Акулич И.Л. Математические методы и компьютерные технологии решения оптимизационных задач / И. Л. Акулич, В. Ф. Стрельчонок - 3 изд., стереотип - Рига: Академия, 2000 - 270 с.
Агальцов В.П. Математические методы в программировании/ Агальцов В.П., И. В. Волдайская - Москва: Форум, 2006 - 224 с. (Профессиональное образование).
Приложение А
Иллюстрации
Рисунок А.1 - Вид рабочего листа
Рисунок А.2 - Вид формы
Рисунок А.3 - Ошибка при неправильном вводе количества переменных или количества уравнений
Рисунок А.4 - Сообщение об ошибке при отсутствии направления
Рисунок А.5 - Ввод коэффициентов функции
Рисунок А.6 - Ввод коэффициентов системы
Рисунок А.7 - Ввод свободных членов
Рисунок А.8 - Сообщение об ошибке при неправильном вводе в InputBox
Рисунок А.9 - Двойственная задача
Рисунок А.10 - Вывод ответа
Рисунок А.11- Сообщение об отсутствии решений
Приложение Б
Программный код
Option Explicit
Dim n As Integer 'количество переменных
Dim m As Integer 'количество уравнений
Dim i As Integer 'циклическая переменная
Dim j As Integer 'циклическая переменная
Dim al As Double 'ключевой элемент
Dim b As String 'свободные члены, преобразуется в Double
Dim a As String 'кэффициенты огр, преобразуется в Double
Dim f As Double 'значение целевой функции
Dim c As Double
Dim o() As Integer 'массив для поиска ключевого элемента
Dim s As Double
Dim p As Integer
Dim kl As Integer 'ключевой столбец
Dim kls As Integer 'ключева строка
Dim k As Integer
Dim dtj As Double
Dim ai() As Double 'новые элементы таблицы
Dim bi() As Double 'новые свободные члены
Dim pr As Double
Dim prb As Double
Dim max As Double
Dim min As Double
Dim h As Variant
Dim r() As Double 'массив для поиска ключевого элемента
Dim x As String 'коэффициенты функции, преобразуется в Double
Private Sub CommandButton1_Click()
'перехват ошибок
If Not IsNumeric(TextBox1.Text) Or Val(TextBox1.Text) < 2 Or Val(TextBox1.Text) > 20 Or Not IsNumeric(TextBox2.Text) Or Val(TextBox2.Text) < 2 Or Val(TextBox2.Text) > 20 Then
MsgBox ("Значение количества переменных и количества уравнений - целое число не большее 20")
TextBox1.Text = ""
TextBox2.Text = ""
ElseIf OptionButton1.Value = False And OptionButton2.Value = False Then
MsgBox ("Выберите направление функции")
Else
n = Int(TextBox1.Text)
m = Int(TextBox2.Text)
'заполнение шапки симплексной таблицы
With ActiveSheet
Cells(2, 1).Value = "c(i)"
Cells(2, 2).Value = "БП"
Cells(2, 3).Value = "b"
Cells(2, 1).Font.FontStyle = "полужирный"
Cells(2, 2).Font.FontStyle = "полужирный"
Cells(2, 3).Font.FontStyle = "полужирный"
End With
создание надписи "двойственная задача"
For j = 1 To 3
Cells(m + 5, j).Select
With Selection.Font
Name = "Times New Roman"
FontStyle = "полужирный"
Size = 12
End With
With Selection
VerticalAlignment = xlBottom
End With
Cells(m + 5, j).Select
Cells(m + 5, 3) = "Двойственная задача"
Next j
ActiveSheet.Cells(m + 7, 1).Value = "F (y) ="
With Cells(m + 7, 1).Font
Name = "Times New Roman"
FontStyle = "полужирный"
Size = 12
End With
End If
ввод коэффициентов целевой функции и заполнение таблицы
For j = 1 To n
1 x = InputBox("Ввод коэффициентов целевой функции")
перехват ошибок
If Not IsNumeric(x) Or x = "" Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
GoTo 1
Else
End
End If
End If
If CDbl(x) < -1000 Or CDbl(x) > 1000 Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
oTo 1
Else
End
End If
End If
ActiveSheet.Cells(1, j + 3).Value = CDbl(x)
ActiveSheet.Cells(2, j + 3).Value = "x(" & j & ")"
Cells(2, j + 3).Font.FontStyle = "полужирный"
Next j
ввод кэффициентов системы ограничений
For i = 1 To m
For j = 1 To n
перехват ошибок
2 a = InputBox("Ввод коэффициентов " & " " & i & " системы ограничений")
If Not IsNumeric(a) Or a = "" Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
GoTo 2
Else
End
End If
End If
If CDbl(a) < -1000 Or CDbl(a) > 1000 Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
GoTo 2
Else
End
End If
End If
Cells(i + 2, j + 3).Value = CDbl(a)
Next j
Next i
For i = 1 To m
For j = n + 1 To n + m
If j <> n + i Then
a = 0
ElseIf j = n + i Then
a = 1
End If
Cells(i + 2, j + 3).Value = a
ActiveSheet.Cells(i + 2, 1).Value = 0
ActiveSheet.Cells(1, j + 3).Value = 0
ActiveSheet.Cells(2, j + 3).Value = "x(" & j & ")"
Cells(2, j + 3).Font.FontStyle = "полужирный"
ActiveSheet.Cells(i + 2, 2).Value = "x(" & n + i & ")"
Next j
Next i
ввод свободных членов
p = 0
k = 1
For i = 1 To m
p = p + 2
k = k + 2
3 b = InputBox("Ввод свободных членов" & " " & i & " уравнения")
перехват ошибок
If Not IsNumeric(b) Or b = "" Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
GoTo 3
Else
End
End If
End If
If CDbl(b) < -1000 Or CDbl(b) > 1000 Then
h = MsgBox("Введите другое значение", vbOKCancel)
If h = vbOK Then
GoTo 3
Else
End
End If
End If
ActiveSheet.Cells(i + 2, 3).Value = CDbl(b)
With Cells(m + 7, p).Font
Name = "Times New Roman"
FontStyle = "полужирный"
Size = 12
ColorIndex = 5
End With
With Cells(m + 7, k).Font
Name = "Times New Roman"
FontStyle = "обычный"
Size = 12
End With
равнивание по центру
Cells(m + 7, p).HorizontalAlignment = xlCenter
Cells(m + 7, k).HorizontalAlignment = xlCenter
построение функции двойственной задачи
Cells(m + 7, p) = b
Cells(m + 7, k) = "y" & i
Next i
построение системы ограничений
k = 0
s = 1
For j = 1 To n
k = 0
For i = 1 To m
k = k + 1
Cells(m + 9 + s, k) = Cells(i + 2, j + 3)
Cells(m + 9 + s, k).HorizontalAlignment = xlCenter
With Cells(m + 9 + s, k).Font
Name = "Times New Roman"
FontStyle = "полужирный"
Size = 12
ColorIndex = 5
End With
Next i
s = s + 1
Next j
прорисовка надписей
For i = 1 To m
Cells(m + 9, i) = "y" & i
Next i
вывод свободных членов двойственной задачи
For j = 1 To n
Cells(m + 9 + j, m + 2) = Cells(1, j + 3)
Cells(m + 9 + j, m + 1) = "c" & j
Cells(m + 9 + j, m + 1).HorizontalAlignment = xlCenter
Cells(m + 9 + j, m + 2).HorizontalAlignment = xlCenter
With Cells(m + 9 + j, m + 2).Font
Name = "Times New Roman"
FontStyle = "полужирный"
Size = 12
ColorIndex = 5
End With
Next j
End Sub
Private Sub CommandButton2_Click() 'процедура очистки
TextBox1.Text = ""
TextBox2.Text = ""
ActiveSheet.Cells.Clear
OptionButton1.Value = False
OptionButton2.Value = False
End Sub
Private Sub CommandButton3_Click() 'выход
h = MsgBox("Exit", vbQuestion + vbOKCancel)
If h = vbOK Then
UserForm1.Hide
End If
End Sub
Private Sub CommandButton4_Click() 'подсчет
вывод надписи
ActiveSheet.Cells(m + 3, 2).Value = "dtj"
Cells(m + 3, 2).Font.FontStyle = "полужирный"
подсчет значения функции
4 f = 0
For i = 1 To m
f = f + Cells(i + 2, 1) * Cells(i + 2, 3)
Next i
ActiveSheet.Cells(m + 3, 3).Value = f
нахождение индексной строки
s = 0
For j = 1 To n + m
For i = 1 To m
s = s + Cells(i + 2, 1) * Cells(i + 2, j + 3)
Next i
dtj = s - Cells(1, j + 3)
ActiveSheet.Cells(m + 3, j + 3).Value = dtj
s = 0
Next j
поиск отрицательных элементов индексной строки
k = 0
If OptionButton1.Value = True Then
For j = 1 To n + m
If Cells(m + 3, j + 3) < 0 Then
k = k + 1
End If
Next j
вывод ответа, если количество равно нулю
If k = 0 Then
h = MsgBox("F(x)=" & Cells(m + 3, 3))
MsgBox ("Исходная задача имеет решение, следовательно двойственная задача тоже имеет решение")
MsgBox ("Решение исходной задачи на максимум являктся решением двойственной задачи на минимум")
End
поиск ключевого столбца
ElseIf k <> 0 Then
min = Cells(m + 3, 4): kl = 4
For j = 1 To n + m
If Cells(m + 3, j + 3) <= min And Cells(m + 3, j + 3) < 0 Then
min = Cells(m + 3, j + 3): kl = j + 3
End If
Next j
End If
поиск положительных элементов индексной строки
ElseIf OptionButton2.Value = True Then
For j = 1 To n + m
If Cells(m + 3, j + 3) > 0 Then
k = k + 1
End If
Next j
max = Cells(m + 3, 4): kl = 4
вывод ответа, если количество равно нулю
If k = 0 Then
h = MsgBox("F(x)=" & Cells(m + 3, 3))
MsgBox ("Исходная задача имеет решение, следовательно двойственная задача тоже имеет решение")
MsgBox ("Решение исходной задачи на минимум являктся решением двойственной задачи на максимум")
End
поиск ключевого столбца
ElseIf k <> 0 Then
For j = 1 To n + m
If Cells(m + 3, j + 3) >= max And Cells(m + 3, j + 3) > 0 Then
max = Cells(m + 3, j + 3): kl = j + 3
End If
Next j
End If
End If
поиск ключевой строки
k = 0
ReDim r(i)
ReDim o(i)
For i = 1 To m
If Cells(i + 2, kl) > 0 Then
r(i) = Cells(i + 2, 3) / Cells(i + 2, kl)
o(i) = i + 2
Else
r(i) = 0: o(i) = 0: k = k + 1
End If
Next i
If k = m Then
MsgBox ("Решений нет")
MsgBox ("Двойственная задача тоже не имеет решения")
End
ElseIf m - k = 1 Then
r i = 1 To m
If r(i) <> 0 Then
min = r(i): kls = o(i)
End If
Next i
Else
min = r(1): kls = o(1)
If r(1) = 0 Then
For i = 1 To m
If r(i) <> 0 Then
min = r(i)
End If
Next i
End If
определение ключевого элемента
For i = 1 To m
If r(i) < min And r(i) <> 0 Then
min = r(i): kls = o(i)
End If
Next i
End If
al = Cells(kls, kl).Value
правило прямоугольника
ReDim ai(i, j)
ReDim bi(i)
For i = 1 To m
For j = 1 To n + m
If i + 2 <> kls Then
pr = Cells(i + 2, j + 3) * al - Cells(kls, j + 3) * Cells(i + 2, kl)
ai(i, j) = pr / al
prb = Cells(i + 2, 3) * al - Cells(kls, 3) * Cells(i + 2, kl)
bi(i) = prb / al
End If
Next j
Next i
For i = 1 To m
r j = 1 To n + m
If i + 2 <> kls Then
Cells(i + 2, j + 3).Value = ai(i, j)
Cells(i + 2, 3).Value = bi(i)
End If
Next j
Next i
элементы ключевой строки
For j = 1 To n + m
a = Cells(kls, j + 3).Value / al
Cells(kls, j + 3).Value = a
Next j
b = Cells(kls, 3) / al
Cells(kls, 3).Value = b
For i = 1 To n + m
If i + 2 = kls Then
Cells(i + 2, 1).Value = Cells(1, kl).Value
Cells(i + 2, 2).Value = Cells(2, kl).Value
End If
Next i
GoTo 4
End Sub
Private Sub UserForm_Initialize()
CommandButton1.Default = True
End Sub
Размещено на Allbest.ru
Подобные документы
Геометрический смысл решений неравенств, уравнений и их систем. Определение понятия двойственности с помощью преобразования Лежандра. Разбор примеров нахождения переменных или коэффициентов при неизвестных в целевой функции двойственной задачи.
дипломная работа [2,6 M], добавлен 30.04.2011Решение двойственной задачи с помощью первой основной теоремы теории двойственности, графическим и симплексным методом. Математическая модель транспортной задачи, расчет опорного плана перевозок методами северо-западного угла и минимального элемента.
контрольная работа [333,3 K], добавлен 27.11.2011Рассмотрение основных подходов к построению математических моделей процесса. Сопряженное уравнение для простейшего уравнения диффузии и структура алгоритмов для решения задач. Использование принципа двойственности для представления линейного функционала.
курсовая работа [711,0 K], добавлен 03.08.2012Применение функции Лагранжа в выпуклом и линейном программировании. Простейшая задача Больца и классического вариационного исчисления. Использование уравнения Эйлера-Лагранжа для решения изопериметрической задачи. Краевые условия для нахождения констант.
курсовая работа [1,2 M], добавлен 16.01.2013Основные сведения о симплекс-методе, оценка его роли и значения в линейном программировании. Геометрическая интерпретация и алгебраический смысл. Отыскание максимума и минимума линейной функции, особые случаи. Решение задачи матричным симплекс-методом.
дипломная работа [351,2 K], добавлен 01.06.2015Графическое решение задачи линейного программирования. Общая постановка и решение двойственной задачи (как вспомогательной) М-методом, правила ее формирования из условий прямой задачи. Прямая задача в стандартной форме. Построение симплекс таблицы.
задача [165,3 K], добавлен 21.08.2010Структура текстовой задачи. Условия и требования задач и отношения между ними. Методы и способы решения задач. Основные этапы решения задач. Поиск и составление плана решения. Осуществление плана решения. Моделирование в процессе решения задачи.
презентация [247,7 K], добавлен 20.02.2015Решение первой задачи, уравнения Пуассона, функция Грина. Краевые задачи для уравнения Лапласа. Постановка краевых задач. Функции Грина для задачи Дирихле: трехмерный и двумерный случай. Решение задачи Неймана с помощью функции Грина, реализация на ЭВМ.
курсовая работа [132,2 K], добавлен 25.11.2011Знакомство с особенностями построения математических моделей задач линейного программирования. Характеристика проблем составления математической модели двойственной задачи, обзор дополнительных переменных. Рассмотрение основанных функций новых переменных.
задача [656,1 K], добавлен 01.06.2016Теоремы Паскаля, Брианшона для пятиугольника, четырехугольника, треугольника. Их использование для решения задач конструктивного типа проективной геометрии линий 2-го порядка на расширенной прямой, связанные с построением точек и касательных к ним.
курсовая работа [967,1 K], добавлен 02.06.2013