A2)
перепишем систему Б:
Б2)
- условия дополняющей нежёсткостиРешим систему А2 с помощью метода искусственных переменных.
в первое и второе уравнение системы А2.Вводим псевдоцелевую функцию
базисные переменные: y1, y2, w1, w2
свободные переменные: x1, x2, v1, v2, u1, u2
Решаем эту задачу симплекс-методом с помощью таблиц и небольшой программы на языке Си, текст которой приведён в Приложении 1.
Таблица 12
bi | x1 | x2 | u1 | u2 | v1 | v2 | |
y1 | 1 0.5 | 2 0.5 | -0.5 -0.25 | 1 0.5 | 0 0 | -1 -0.5 | 0 0 |
y2 | 8 0.25 | -0.5 0.25 | 2 -0.125 | 1 0.25 | 1 0 | 0 -0.25 | -1 0 |
w1 | 7 -0.5 | 1 -0.5 | 1 0.25 | 0 -0.5 | 0 0 | 0 0.5 | 0 0 |
w2 | 5 0 | 0 0 | 1 0 | 0 0 | 0 0 | 0 0 | 0 0 |
Y' | 9M 0.75M | -1.5M 0.75M | -1.5M -0.375M | -2M 0.75M | -1M 0M | 1M -0.75M | 1M 0M |
Таблица 13
bi | y1 | x2 | u1 | u2 | v1 | v2 | |
x1 | 0.5 1.1 | 0.5 0.03333 | -0.25 0.1333 | 0.5 0.1667 | 0 0.1333 | -0.5 -0.03333 | 0 -0.1333 |
y2 | 8.25 4.4 | 0.25 0.1333 | 1.875 0.5333 | 1.25 0.6667 | 1 0.5333 | -0.25 -0.1333 | -1 -0.5333 |
w1 | 6.5 -5.5 | -0.5 -0.1667 | 1.25 -0.6667 | -0.5 -0.8333 | 0 -0.6667 | 0.5 0.1667 | 0 0.6667 |
w2 | 5 -4.4 | 0 -0.1333 | 1 -0.5333 | 0 -0.6667 | 0 -0.5333 | 0 0.1333 | 0 0.5333 |
Y' | 9.75M 8.25M | 0.75M 0.25M | -1.875M 1M | -1.25M 1.25M | -1M 1M | 0.25M -0.25M | 1M -1M |
Таблица 14
bi | y1 | y2 | u1 | u2 | v1 | v2 | |
x1 | 1.6 | 0.5333 | 0.1333 | 0.6667 | 0.1333 | -0.5333 | -0.1333 |
x2 | 4.4 | 0.1333 | 0.5333 | 0.6667 | 0.5333 | -0.1333 | -0.5333 |
w1 | 1 | -0.6667 | -0.6667 | -1.333 | -0.6667 | 0.6667 | 0.6667 |
w2 | 0.6 | -0.1333 | -0.5333 | -0.6667 | -0.5333 | 0.1333 | 0.5333 |
Y' | 18M | 1M | 1M | 0M | 0M | 0M | 0M |
Оптимальное решение:
y1=y2=u1=u2=v1=v2=0
x1=1.6
x2=4.4
w1=1
w2=0.6
Проверим условие дополняющей нежёсткости:
xi*vi=0
ui*wi=0
Условия выполняются, следовательно, x1=1.6, x2=4.4 являются решением исходной задачи kвадратичного программирования. Координаты стационарной точки совпадают с координатами, полученных в качестве ответа. Стационарная точка удовлетворяет условиям ограничений.
Значение функции в точке (x1;x2) равно 0.
x1=1.6
x2=4.4
f(x1;x2) = 0
Для решения задачи #4 использована следующая программа на языке Си, скомпилированная gcc (GCC) 4.0.0 20050519 (Red Hat 4.0.0-8). Её текст приведён ниже:
#include <stdio.h>
#define x 7
#define y 5
double mc[x*y] =
{
1, 2, -0.5, 1, 0, -1, 0,
8, -0.5, 2, 1, 1, 0, -1,
7, 1, 1, 0, 0, 0, 0,
5, 0, 1, 0, 0, 0, 0,
9, -1.5, -1.5, -2, -1, 1, 1
};
double mt[x*y];
void mprint (double* m, int xs, int ys)
{
int i, j;
printf ("\n");
for (j = 0; j < ys; j++)
{
for (i = 0; i < xs; i++)
{
printf ("%10.4lg ", m[j*xs+i]);
}
printf ("\n");
}
}
int main (void)
{
int i, j, i1, j1, it, jt;
double msx, msx1;
// Выбираем разрешающий эл-т
nextmtx:
printf ("\nИсходная матрица коэффициентов:"); mprint (mc, x, y);
getch ();
msx = 10000.;
for (i = 0; i < x; i++)
{
if (mc[(y-1)*x+i] < 0)
{
// Возможно, найден разрешающий столбец
for (j = 0; j < y; j++)
{
// Ищем наименьшее отношение своб. члена к эл-ту разр. столбца
if (mc[j*x+i] < 1e-32)
continue; // Нулевой или отрицательный
msx1 = mc[j*x] / mc[j*x+i];
if (msx > msx1) // Частное св.ч / р.эл
{
msx = msx1; // наименьшее ищем
it = i; jt = j; // координаты р.эл.
}
}
if (msx > 9999.) continue; // Нет положительных эл-тов
else // найден р.эл., mx != 0
{
i = it; j = jt; // его координаты
}
printf ("\n Разрешающий элемент: a(%d;%d) = %lg", j+1, i+1, mc[j*x+i]);
if (mc[j*x+i] > 0)
{
// Это и есть разрешающий элемент (s_el), находим обратную величину
mt[j*x+i] = 1. / mc[j*x+i];
for (i1 = 0; i1 < x; i1++)
{
// Разрешающая строка ( 1/s_el)
if (i1 == i) continue; // Пропустить сам s_el
mt[j*x+i1] = mt[j*x+i] * mc[j*x+i1];
}
for (j1 = 0; j1 < y; j1++)
{
// Разрешающий столбец (-1/s_el)
if (j1 == j) continue; // Пропустить сам s_el
mt[j1*x+i] = - mt[j*x+i] * mc[j1*x+i];
}
// успешно составлены разр. строка и столбец.
// теперь составляем остальные коэфф-ты
for (j1 = 0; j1 < y; j1++)
{
if (j1 == j) continue; // Пропустить всю разреш. строку
for (i1 = 0; i1 < x; i1++)
{
if (i1 == i) continue; // И столбец тоже
// Произведение нижней части столбца
// на верхнюю часть строки
mt[j1*x+i1] = mt[j1*x+i] * mc[j*x+i1];
}
}
/*
* Всё. Готова матрица нижних значений, теперь нужно
* поместить всё на свои места в mc
*/
printf ("\nМатрица нижних значений:"); mprint (mt, x, y);
getch ();
for (j1 = 0; j1 < y; j1++)
{
for (i1 = 0; i1 < x; i1++)
{
if ((j1 == j) || (i1 == i))
{
/*
* Разрешающая строка или столбец
* просто ложим элементы в mc
*/
mc[j1*x+i1] = mt[j1*x+i1];
}
else
// иначе - сумму
mc[j1*x+i1] += mt[j1*x+i1];
}
}
// Всё готово к очередному шагу.
goto nextmtx; // след. матрица
}
// Этот эл-т не подходит, т.к. он отрицательный
}
// Если так и не было подходящего эл-та, то проверяем след. столбец
}
// отрицательны коэфф-тов при целевой ф-ции не найдено, следовательно, решение оптимально
printf ("\nОптимизировано. Ответ:"); mprint (mc, x, y);
return 0;
}
Программа компилировалась командной строкой:
gcc simplex.c -o simplex
, запускалась:
./simplex
и выдавала на консоль пошаговое решение задачи, которое было занесено в симплекс-таблицы (см. табл. 12-14) четвёртой задачи данной курсовой работы.
1. Кремер Н. Ш., Путко Б. А., Трощин И. М. «Исследование операций в экономике» - М.: ЮНИТИ, 2004. - 407 с.
2. Плотникова Н. В. Курс лекций (ПС)