Автор работы: Пользователь скрыл имя, 08 Декабря 2010 в 08:31, Не определен
Цель данного курсового проекта - составить план производства требуемой продукции, обеспечивающий максимальную прибыль от выпускаемой продукции, свести данную задачу к задаче линейного программирования, решить её симплекс - методом и составить программу для решения задачи этим методом на ЭВМ.
int cn=0; // длина вектора исходного ур-я
int cnr=0; /* cn, только без членов == 0 (cnr==cn_real)
float
*c = NULL; // исходное ур-е
int m=0, n=0; // размеры матрицы условий
float **a = NULL; // матрица условий
float
*b = NULL; // столбец свободных членов матрицы
условий
int
*base = NULL; // базовые переменные
float zb=0; // оценки оптимальности b
float
*za = NULL; // оценки оптимальности a
int base_column = -1; // разрешающий столбец
int
base_row = -1; // разрешающая строка
bool
full_table = true; // вид выводимой таблицы: true==полная,
false==сжатая
void FreeMem ()
{
delete[] za;
delete[] base;
delete[] b;
for (int i=0; i<m; i++)
delete[] a[i];
delete[] a;
delete[] c;
}
bool ReadInput (char *filename)
{
int i,j;
FILE *f = fopen(filename, "r");
if (NULL == f)
return false;
// исходное ур-е
fscanf(f, "%i", &cn);
c = new float [cn];
cnr=cn;
for (i=0; i<cn; i++)
{
fscanf(f, "%f", &c[i]);
if (0 == c[i]) cnr--;
}
// матрица условий
fscanf(f, "%i %i", &n, &m);
a = new float* [m];
for (i=0; i<m; i++)
a[i] = new float[n];
b = new float [m];
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
fscanf(
fscanf(f, "%f", &b[j]);
}
// базовые переменные
base = new int [m];
for (j=0; j<m; j++)
{
fscanf(f, "%i", &base[j]);
--base[j];
}
// флаг - полную или сжатую таблицу выводить ?
int flag = 1;
fscanf(f, "%i", &flag);
full_table = flag ? true : false;
fclose(f);
za = new float[n];
// for(i=0;i<n;i++)za[i]=
return true;
}
//
Вычисление оценок
void EvaluationOptimal ()
{
int i,j;
zb=0;
for (i=0; i<n; i++) za[i]=0;
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
za[i] += c[base[j]]*a[j][i];
zb += c[base[j]]*b[j];
}
for (i=0; i<n; i++)
za[i] -= c[i];
}
//
Построение опорного плана (
plan_t BuildPsevdoPlan ()
{
int i,j;
base_column = -1; // разрешающий столбец
base_row = -1; // разрешающая строка
float acc; // временно: аккумулятор
- будет хранить min, max, etc.
acc = 0; // min отрицательное значение b
for (j=0; j<m; j++)
if (b[j] < acc)
{
acc = b[j];
base_
}
if (-1 == base_row)
return DUAL_DONE;
acc = -MAXDIGIT; // max отношение za к отрицат. эл-там в строке base_row
for (i=0; i<n; i++)
{
float temp;
if (a[base_row][i] < 0 && (temp = za[i]/a[base_row][i]) > acc)
{
acc = temp;
base_
}
}
if (-1 == base_column)
return ODR_EMPTY;
return NEXT_ITERATION;
}
// Проверка опорного плана на оптимальность
plan_t CheckStrongPlan ()
{
int i,j;
float za_min = 0;
base_column = -1; // разрешающий столбец
base_row = -1; // разрешающая
строка
// выбор разрешающего столбца
for (i=0; i<n; i++)
{
if (za[i] >= 0)
continu
else if (za[i] < za_min)
{
za_min = za[i];
base_
}
}
if (-1 == base_column)
return PLAN_OPTIMAL;
za_min = MAXDIGIT;
// выбор разрешающей строки
for (j=0; j<m; j++)
{
if (a[j][base_column] > 0)
{
float t = b[j]/a[j][base_column];
if (t < za_min)
{
z
b
}
}
}
if (-1 == base_row)
return ODR_BREAK;
return NEXT_ITERATION;
}
//
Преобразование таблицы по ф-
void JGTransformation (int base_row, int base_column)
{
// проверка на всякий случай: чтобы не было деления на нуль
if (0 == a[base_row][base_column])
return;
base[base_row] = base_column;
int i,j;
float **a2 = new float* [m]; // матрица условий
float *b2 = new float [m]; // столбец свободных членов матрицы условий
memcpy(b2,b,m*
for (j=0; j<m; j++)
{
a2[j] = new float[n];
memcpy(a2[j],
}
for (j=0; j<m; j++)
{
for (i=0; i<n; i++)
{
if (i == base_column)
{
a
}
else
{
i
e
}
}
if (j == base_row)
b2[j] = b[j]/a[base_row][base_column];
else
b2[j] = b[j] - b[base_row]*a[j][base_column]/
a
}
memcpy(b,b2,m*
delete[] b2;
for (j=0; j<m; j++)
{
memcpy(a[j],
delete[] a2[j];
}
delete[] a2;
}
// проверка: входит ли номер столбца в число базисных переменных
bool InBase (int num)
{
for (int j=0; j<m; j++)
if (num == base[j])
return true;
return false;
}
// вывод линии символов
void Rule (char c, int amount = full_table ? 5+(n+2)*8 : 5+(cnr+1)*8)
{
for (int i=0; i<amount; i++)
printf("%c", c);
printf("\n");
}
// вывод Симплекс-таблицы
void ShowTable ()
{
int i,j;
static int iteration = 0;
printf("[%i]\n", iteration++);
if (full_table)
// полная таблица
{
Rule('=');
printf("Баз.|
for (i=0; i<cn; i++)
Информация о работе Применение методов линейного программирования