Главная » Каталог    
рефераты Разделы рефераты
рефераты
рефератыГлавная

рефератыБиология

рефератыБухгалтерский учет и аудит

рефератыВоенная кафедра

рефератыГеография

рефератыГеология

рефератыГрафология

рефератыДеньги и кредит

рефератыЕстествознание

рефератыЗоология

рефератыИнвестиции

рефератыИностранные языки

рефератыИскусство

рефератыИстория

рефератыКартография

рефератыКомпьютерные сети

рефератыКомпьютеры ЭВМ

рефератыКосметология

рефератыКультурология

рефератыЛитература

рефератыМаркетинг

рефератыМатематика

рефератыМашиностроение

рефератыМедицина

рефератыМенеджмент

рефератыМузыка

рефератыНаука и техника

рефератыПедагогика

рефератыПраво

рефератыПромышленность производство

рефератыРадиоэлектроника

рефератыРеклама

рефератыРефераты по геологии

рефератыМедицинские наукам

рефератыУправление

рефератыФизика

рефератыФилософия

рефератыФинансы

рефератыФотография

рефератыХимия

рефератыЭкономика

рефераты
рефераты Информация рефераты
рефераты
рефераты

Модифицированный симплекс метод с мультипликативным представлением матриц


n = 4
m = 2
F = -3
-2 0 0
LIMITS:
1 -1 1
0 = 2
2  1 0 1 = 6
n = 8
m = 3
F = -2
-3 5 0 0 1000 1000 1000
LIMITS:
2 1 -1
-1  0 1 0 0 = 7
1
2  1 
0 -1 0 1 0 = 6
1
4  0 
0  0 0 0 1 = 8
/**********************************************************************
Главный заголовочный файл программы SASIMPL
(Главный модуль программы SA.CPP)
Описание
всяких глобальных переменных и функций программы...
**********************************************************************/
#ifndef
SA_H
#define
SA_H
//
Описание стандартных функций
#include
<stdlib.h>
#include
<string.h>
#include
<fstream.h>
#include
"gerror.h"
#include
"matrix.h"
#include
<tswm.h>
//***************
ВХОДНЫЕ ДАННЫЕ (описаны в MSIPLEX.CPP)
extern
char *OutFile;
extern
int n, m;
extern
double *C;
extern
Matrix A;
extern
double *B;
//
************************* РАЗНОЕ
extern
char *err_torun;
//**************************
ФУНКЦИИ
extern
int MSimplex( void );
extern
int LoadInputData( char *filename );
extern
void UnLoadData( void );
#endif
;Задача
1.19
n =
7   ; количество переменных
m =
4   ; количество ограничений
LIMITS:
-3 2 1
= 6
1 1 0
-4 1 = 3
1 0 0 0
0 1 = 3
0 1 0 0
0 0 1 = 5
F = -2
-2 0 0 1000
; 1.22
n = 9
m = 5
F = -3
-3 0 0 100000 0 100000 0 0
LIMITS:
1 1 1 =
8
3 7 0
-1 1 = 21
1 2 0 0
0 -1 1 = 6
1 0 0 0
0 0 0 1 = 1
0 1 0 0
0 0 0 0 1 = 7
;
1.27  оптимум не ограничен
n = 6
m = 2
F = 3
-2 0 1000 0 1000
LIMITS:
1 2 -1
1 = 10
3 1 0 0
-1 1 = 15
; 1.47
n = 4
m = 3
F = -1
-2 -3 1
LIMITS:
1 2 3 =
15
2 1 5 =
20
1 2 1 =
10
;X2 =
2.5
;X3 =
2.5
;X1 =
2.5
;ЦФ:
-15.000
; 1.46
n = 8
m = 4
F = -3
-1 0 1000 0 0 1000
LIMITS:
1 2 -1
1 = 5
2 4 0 0
1 = 16
3 1 0 0
0 -1 1 = 6
1 3 0 0
0 0 0 1 = 9
;-3 -1
0 1000 0 0 1000 1 = 0
;X6 =
18
;X3 = 3
;X1 = 8
;X8 = 1
;ЦФ:
-24.000
;
Пример 1.9 в методе Данцига-Вульфа
n = 9
m = 5
F = -1
-1 -2 -1
LIMITS:
1 2 1
-1 1 = 10
2 1 0 0
0 1 = 4
1 2 0 0
0 0 1 = 6
0 0 1 1
0 0 0 1 = 5
0 0 -2
3 0 0 0 0 1 = 6
/**********************************************************************
           Один из вспомогательных модулей
программы SASIMPL
                   (Главный модуль программы
SA.CPP)
 Модуль, содержащий непосредственно
модифицированный сиплекс-метод
 с мультипликативным представлением обратной
матрицы
 Предполагается, что входные данные уже заданы
...
 Вывод результатов производится в выходной
файл ...
 Линейная задача задается в каноническом виде
(это значит, что
 в ограничениях никаких неравенств и введены
уже все свободные
 и исскуственные переменные) для задачи
минимизации
 Соглашения: m x n означает матрицу высотой в
m строк и шириной
             n столбцов ;-)
**********************************************************************/
//
Нашенской программы описания
#include
"sa.h"
#include
<setjmp.h>
#define
Empty ;
#define
NoMem { GError << "\nНет памяти!!!"; GlobalError();
longjmp(Gjmpbuf,1); }
//
Выходной файл с результатами работы
char
*OutFile = "SASIMPL.RES";
// Тот
же файл, но в виде указателя для системы
ofstream
OFile;
//************************
ВХОДНЫЕ ДАННЫЕ *****************************
// (
должны задаваться до вызова функции MultiSimplex() )
//
Самые главные значения: количество переменных
// и
количество ограничений
int n,
m;
//
Вектор коэффициентов при x в ЦФ (n элементов)
double
*C = NULL;
//
Матрица коэффициентов ограничений (m x n)
Matrix
A;
//
Вектор правой части ограничений (m элементов)
double
*B = NULL;
//************************
ПЕРЕМЕННЫЕ *********************************
int
*NXBasis = NULL;     // индексы базисных
переменных
double
*X = NULL;        // значения базисных
переменных
jmp_buf
Gjmpbuf;         // всякая ерунда
//*******************
КЛАСС - СПИСОК ЭЛЕМЕНТАРНЫХ МАТРИЦ **************
class
EMatrix
{
public:
  static int N;  // размер элементарных матриц NxN
  int fl;        // как представлены данные 
(0 - в массиве, n - в
                 // структуре, где n - ко-во
элементов в ней)
  // представление столбца элементарной
матрицы, который содержит данные
  union E_Data
  {
    double *E;     // либо в виде массива (если много не 0-вых элементов)
    struct E_Ef    // либо в виде структуры, хранящей только не 0-вые эл.
    { int n; double En; } *Eef;
  } Edata;
  int Column;      // номер столбца элементарной матрицы, хранящего данные
  EMatrix *Next;   // следующая элементарная матрица списка
  void Init( void );    // функция инициализации списка
  void destroy( void ); // функция уничтожения
списка
public:
  EMatrix(){ Init(); }                // конструктор по умолчания
(списка)
  EMatrix( int h ){ Init(); N = h; }  // конструктор одной элементарной мат.
  ~EMatrix(){ destroy(); }            // деструктор
  void Add( double *e, int column );  // добавить в список элемент. матрицу
  EMatrix &operator[]( int n );       // взять из списка элемент. матрицу
  double Get( int n );                // взять из матрицы конкрет.
элемент
};
// ***
ОПИСАНИЕ ФУНКЦИЙ КЛАССА СПИСКА ЭЛЕМЕНТАРНЫХ МАТРИЦ ***
void
EMatrix::Init( void )
{
  Next = NULL;
  fl = 0;
  Edata.E = NULL;
}
void
EMatrix::Add( double *e, int column )
{
  EMatrix *s = this;
  if( this->Edata.E != NULL ||
this->Edata.Eef != NULL )
  {
    while( s->Next != NULL ) s =
s->Next;
    s->Next = new EMatrix; if(s->Next ==
NULL ) NoMem;
    s = s->Next;
  }
  // считаем ко-во ненулевых элементов
  int sk = 0;
  for( int i = 0; i < N; i++ ) if( e[i] )
sk++;
  if( N * sizeof(double) < sk * sizeof(E_Data::E_Ef)
)
  {
    s->fl = sk;
    s->Edata.Eef = new E_Data::E_Ef [sk];
if( s->Edata.Eef == NULL ) NoMem;
    for( i = 0, sk = 0; i < N; i++ )
      if( e[i] ){ s->Edata.Eef[sk].n = i;
s->Edata.Eef[sk].En = e[i]; sk++; }
  }
  else
  {
    s->fl = 0;
    s->Edata.E = new double [N]; if(
s->Edata.E == NULL ) NoMem;
    for( i = 0; i < N; i++ )
s->Edata.E[i] = e[i];
  }
  s->Column = column;
}
void
EMatrix::destroy( void )
{
  if( Next != NULL ) delete Next;
  if( fl )
    if( Edata.Eef != NULL ) delete Edata.Eef;
  else
    if( Edata.E != NULL ) delete Edata.E;
  Next = NULL; Edata.E = NULL; fl = 0;
}
EMatrix
&EMatrix::operator[]( int n )
{
  EMatrix *s = this;
  for( int i = 0; i != n; i++, s = s ->
Next ) Empty;
  return *s;
}
double
EMatrix::Get( int n )
{
  if( fl )
  {
    for( int i = 0; i < fl; i++ )
    {
      if( Edata.Eef[i].n == n ) return
Edata.Eef[i].En;
      if( Edata.Eef[i].n > n ) break;
    }
    return 0.;
  }
  return Edata.E[n];
}
int
EMatrix::N = 0;
//****************
ФУНКЦИИ МОДУЛЯ ***********************************
//
Поиск базиса в начальных данных
void
FindBasis( void )
{
  for( int j = 0; j < n; j++ )
  {
    for( int i = 0; i < m; i++ )
    {
      // ищем переменную с коэф. 1 в
ограничениях (индекс переменной j)
      if( A[i][j] == 1 )
      {
        // проверяем нет ли ее уже в базисе
        for( int k = 0; NXBasis[k] != -1
&&
                        NXBasis[k] != j
&& k < m; k++ ) Empty;
        if( NXBasis[k] != j )
        {
          // ...если нет, то проверяем
коэффициенты в столбце
          // ограничений этой переменной
          for( int k = 0; k < m; k++ ) if(
k != i ) if( A[k][j] ) break;
          if( k == m )
          {
            // если все Ob, то заносим эту
переменную в базис
            for( int l = 0; NXBasis[l] != -1
&& l < m; l++ ) Empty;
            NXBasis[l] = j;
            if( l == m - 1 ) return;  // все переменные нашли
            break; // переходим на другую строку
ограничений
          }
        }
      }
    }
    if( j == n )
    {
      GError << "\nЗадача  линейного 
программирования должна быть\n"
             << "задана в  каноническом  виде.  Это значит,  что\n"
             << "в ограничениях уже
должен присутствовать базис!\n"
             << "А программа его
что-то не находит...\n"
             << err_torun;
      GlobalError(); longjmp( Gjmpbuf, 1);
    }
  }
}
//
Подготовительная работа
void
BeforeTimeWork( void )
{
  if( NXBasis != NULL ) delete NXBasis;
  NXBasis = new int [ m ]; if( NXBasis == NULL
) NoMem;
  for( int i = 0; i < m; i++ ) NXBasis[i] =
-1;
  FindBasis();    // ищем начальный базис
  // заполняем значения базисных переменных из
правой части B
  if( X != NULL ) delete X; X = new double [ m
]; if( X == NULL ) NoMem;
  for( i = 0; i < m; i++ ) X[i] = B[i];
}
//
Завершающая работа
void
AfterTimeWork( void )
{
  if( NXBasis != NULL ){ delete NXBasis;
NXBasis = NULL; }
  if( X != NULL ){ delete X; X = NULL; }
}
//
Непосредственная реализация симплекс-метода с мультипликатывным
//
представлением обратной базисной матрицы
void
MultiSimplex( void )
{
  BeforeTimeWork(); // предварительная
подготовка (поиск нач. базиса,...)
  EMatrix E( m + 1 ); // инициализация списка
элементарных матриц
  Matrix Cx( 1, m ); // коэффициенты ЦФ при
базисных переменных
  for( int iteration = 0; ; iteration++ )
  {
    int i;
    // заполняем матрицу Cx - коэф.-ты при ЦФ
базисных переменных
    for( i = 0; i < m; i++ ) Cx[0][i] = C[
NXBasis[i] ];
    { // вывод значений базисных переменных
    char str[10]; Ccputs( 4,
itoa(iteration,str,10) );
    OFile << "Итерация N"
<< iteration << endl
          << "Значения базисных
переменных:\n";
    for( i = 0; i < m; i++ )
      OFile << "X" <<
(NXBasis[i]+1) << " = " << X[i] << endl;
    }
    { // вывод значения целевой функции
    Matrix bb(m,1,X);
    Matrix *aaa = Cx * bb;
    OFile << "Значение целевой
функции: " << (*aaa) << endl;
    delete aaa;
    }
    // расчет двойственных перемнных
    Matrix Pi( 1, m );
    if( iteration )
    {
      for( i = iteration - 1; i >= 0; i-- )
      {
        double Sum = 0;
        for( int j = 0; j < m; j++ )
        {
          double a = E[i].Get(j);
          if( a )
          {
            double b = Cx[0][j];
            if( b )
              Sum += a * b;
          }
        }
        Cx[0][E[i].Column] = Sum;
      }
    }
    Pi = Cx;
    // нахождения вводимой переменной
    double c_min = 9e100, s_min = -1;
    for( i = 0; i < n; i++ )
    {
      Matrix *P_itoe = A.GetColumn( i );
      Matrix *P = Pi * (*P_itoe);
      double c = C[i] - (*P)[0][0];
      if( c < c_min ){ c_min = c; s_min =
i; }
      delete P_itoe; delete P;
    }
    // вводим переменную с индексом s_min
    if( c_min >= -0.1e-12 )        // дальше оптимизировать некуда...
    {                              // -0.1e-12 - это почти ноль
      OFile << "\nДанное
решение"  //              - дань погрешности :-(
               " является
оптимальным!\n";
      break;
    }
    // вычисление ведущего столбца
    Matrix *P_soe = A.GetColumn( s_min );
    Matrix AA( m, 1 );
    AA = *P_soe;
    for( i = 0; i < iteration; i++ )
    {
      int clmn = E[i].Column;
      for( int j = 0; j < m; j++ )
      {
        if( j != clmn )
          AA[j][0] += E[i].Get(j) *
AA[clmn][0];
      }
      AA[clmn][0] *= E[i].Get(clmn);
    }
    // ...он у нас теперь в AA
    // проверям, если в нем все элементы
положительны, то
    // множество решений неограничено...
    for( i = 0; i < m; i++ ) if( AA[i][0]
> 0  ) break;
    if( i == m )
    {
      OFile << "\nОптимум
неограничен...!\n";
      break;
    }
    // ищем выводимую переменную из базиса
    double th_min = 9e100;
    int r_min = -1;
    for( i = 0; i < m; i++ )
    {
      if( AA[i][0] > 0 )
      {
        double th = X[i]/AA[i][0];
        if( th < th_min ){ th_min = th;
r_min = i; }
      }
    }
    // выводим из базиса r_min-ую переменную
    // добавляем в список элементарных матриц
еще одну
    // кроме, того изменяем попутно значения
базисных переменных
    double *EE = new double [ m ]; if( EE ==
NULL ) NoMem;
    for( i = 0; i < m; i++ )
    {
      if( i != r_min )
      {
        EE[i] = - AA[i][0] / AA[r_min][0];
        X[i] = X[i] - th_min * AA[i][0];
      }
    }
    EE[r_min] = 1. / AA[r_min][0];
    X[r_min] = th_min;
    NXBasis[r_min] = s_min;
    E.Add( EE, r_min );
    delete EE;
    delete P_soe;
  }
  AfterTimeWork();
}
//
Самая главная функция нашего метода
//  на основе входных данных создает выходной
файл с выходными рез-ми
int
MSimplex( void )
{
   OFile.open( OutFile );
   if( !OFile )
   {
     GError << "\nНевозможно
создать выходной файл: " << OutFile;
     GlobalError();
     return 0;
   }
   { // вывод входных данных
   OFile << "Входные
данные:\n";
   OFile << "Количество
переменных  n = " << n
<< endl
         << "Количество ограничений
m = " << m << endl;
   Matrix R( 1, n, C );
   OFile << "Вектор коэффициентов
целевой функции C:\n" << R << endl;
   OFile << "Матрица коэффициентов
в ограничениях A:\n" << A << endl;
   Matrix RR( 1, m, B );
   OFile << "Вектор правой части
ограничений B:\n" << RR << endl;
   OFile <<
"********************************************************\n";
   }
   int value = setjmp( Gjmpbuf );
   if( value == 1 ){ return 0; } // For Whom
The Bell Tolls...?
                                 // Time
Matches On!
   MultiSimplex();
   OFile.close();
   return 1;
}
/**********************************************************************
                 Главный модуль к программе
SASIMPL
   Реализован модифицированный симплекс-метод
с мультипликативным
   представлением обратной матрицы
В
данном модуле описывается интерфейсная часть программы (считывание
файла с
данными)
В
модуле MSIMPLEX.CPP реализован непосредственно сам метод
Эта
программа является курсовым проектом по системному анализу
Язык
написания: C++
Компилятор:
Borland C++ 3.1
Автор: студент
ДВГТУ группы Э-282 Богдановский А.
Дата:
осенний семестр 1995-96 гг.
Преподаватель:
Тихненко Е. В.
**********************************************************************/
//
Нашенской программы описания
#include
"sa.h"
#include
<ctype.h>
#include
<alloc.h>
#include
<dir.h>
#include
<process.h>
#include
<stdio.h>
#include
<fstream.h>
RUSSIAN;
KEYBOARD;
#define
HELPFILE "SASIMPL.HLP"
char
*Copyright = "Богдановский Александр, ДВГТУ, Э-282, 1996 г.";
char
*err_torun = "(Прочитайте информацию о формате входного файла\n"
                  "в разделе главного
меню \"Узнать о программе\")\n";
char
*ViewFile = "README.COM";
//
Входной файл с данными
char
DATFile[101] = "";
// Эта
функция находится в библиотеке GETFILE.LIB и нужна для
//
выбора VEC-файла ( написана она на очень старой библиотеке
//
WMT.LIB, т.к. в этом дурацком TSWM'е нет такой функции ).
//
Первый параметр - переменная куда запишется файл (с путем)
//
Второй параметр - маска (char [15]).  Возвращает  1 - если
// файл
выбрали и 0 - otherwise. ПредПоследний параметр - это
//
функция просмотра MAP- или VEC-файлов по клавише F3 (функ-
// ция
определена в этом модуле - char View( char * );  ).  И
//
последний параметр - это функция подсказки, которая встра-
//
ивается в меню файлов по клавише F1
extern
int SelFile( unsigned char*, unsigned char*,
                    unsigned char (*)(unsigned
char*),
                    unsigned char (*)(unsigned
char*)=NULL );
//
Обработка входного файла
//
считывание из него входных данных и заполнение нужных переменных
int
LoadInputData( char *filename )
{
  ifstream ifile( filename );
  if( !ifile )
  {
    GError << "\nОшибка открытия
входного файла: " << filename << endl
           << "(запустите программу
без параметров для подсказки)" << endl;
    GlobalError();
    return 0;
  }
  static char buf[201];
  static char *s;
  static int *NorM;
  static char fl1, fl2;
  char fl_jnen = 0;
  fl1 = fl2 = 0;
  // считывание входного файла
  do
  {
    ifile.getline( buf, 200 );   // ... по строчке
    strupr( buf );  // поднимаем все символы строки
    s = strchr( buf, ';' ); if( s != NULL ) *s
= 0;   // убираем комментарии
//
считываем директиву LIMITS ***
    s = strstr( buf, "LIM" );
    if( s != NULL )
    {
      if( n == 0 || m == 0 )
      {
        GError << "\nЗначения n и m
должны определяться до определения\n"
                  "ограничений !\n"
<< err_torun;
        GlobalError();
        return 0;
      }
      A.SetSize( m, n ); A = 0.;
      if( B != NULL ) delete B; B = new double
[m];
      if( B == NULL )
      {
        GError << "\nНе хватает
памяти под вектор B в правой части\n"
                  "ограничений!\n";
        GlobalError();
        return 0;
      }
      for( int i = 0; i < m &&
!ifile.eof(); i++ )
      {
        ifile.getline( buf, 200 );
        s = strchr( buf, ';' ); if( s != NULL
) *s = 0;
        s = buf;
        for( int j = 0; j < n+1 &&
*s; j++ )
        {
          while( !isdigit( *s ) && *s
!= '-' && *s != '.'
                 && *s != '='
&& *s != 'E' && *s ) s++;
          if( *s )
          {
            if( *s == '=' )
            {
              if( j != n )
              {
                if( fl_jnen == 0 )
                {
                  GError <<
"\nВнимание: в ограничении заданы не все коэффициенты!\n"
                            "          они принимаются нулевыми...\n";
                  GlobalError();
                  fl_jnen = 1;
                }
              }
              while( !isdigit( *s ) &&
*s != '-' && *s != '.'&& *s ) s++;
              if( *s )
                B[i] = atof( s );
              else
              {
                GError << "\nОшибка
задания правой части ограничений\n"
                          "в строке
" << (i+1) << endl << err_torun;
                GlobalError(); return 0;
              }
              break;
            }
            if( j == n )
            {
              GError << "\nКоличество переменных в ограничении на
строке"
                     << (i+1) <<
"\nбольше, чем n = " << n << endl
                     << err_torun;
              GlobalError(); return 0;
            }
            A[i][j] = atof( s );
          }
          else
          {
            if( j == 0 )
            {
              GError << "\nОшибка в
ограничениях LIMITS: строка " << (i+1)
                     << endl <<
err_torun;
              GlobalError(); return 0;
            }
          }
          while( isdigit( *s ) || *s == '-' ||
*s == '.' || *s == 'E' ) s++;
        }
      }
      if( i != m )
      {
        GError << "\nЗадано мало
ограничений или большое число m !\n"
               << err_torun;
        GlobalError(); return 0;
      }
      fl2 = 1;
      continue;
    }
// ***
считываем директивы n и m ***
    s = strchr( buf, 'N' );
    if( s != NULL )
    {
      NorM = &n; // n - глобальная
переменная
    }
    else
    {
      s = strchr( buf, 'M' );
      if( s != NULL )
      {
        NorM = &m; // m - глобальная
переменная
      }
    }
    if( s != NULL )
    {
      while( !isdigit(*s) && *s ) s++;
      if( *s )
      {
        *NorM = atoi( s );
        if( *NorM <= 0 )
        {
          GError << "\nОшибка во
входном файле: " << endl
                 << " неправильное
значение n или m ...\n" << err_torun;
          GlobalError(); return 0;
        }
        continue;
      }
      else
      {
        GError << "\nДиректива n
или m без продолжения !\n" << err_torun;
        GlobalError(); return 0;
      }
    }
//***
считываем директиву F ***
    s = strchr( buf, 'F' );
    if( s != NULL )
    {
      if( n == 0 )
      {
        GError << "\nКоличество
переменных n должно определяться\n"
               << "до определения
целевой функции во входном файле!\n"
               << err_torun;
        GlobalError(); return 0;
      }
      static char *err_f = "\nОшибка в
определении вектора C"
                           "коэффициентов
при x\nв целевой функции F...\n";
      s = strchr( buf, '=' ); if( s == NULL )
s = strchr( buf, ':' );
      if( s != NULL )
      {
        if( C != NULL ) delete C;
        C = new double [ n ]; memset(
(void*)C, 0, sizeof(double) * n );
        if( C == NULL )
        {
          GError << "\nНе хватает
памяти под вектор C коэффициентов при x" << endl
                 << "в целевой
функции F...\n";
          GlobalError(); return 0;
        }
        for( int i = 0; i < n && *s; i++ )
        {
          while( !isdigit(*s) && *s !=
'-' && *s != '.' && *s != 'E'
                 && *s ) s++;
          if( *s )
            C[i] = atof( s );
          else
          {
            if( i == 0 )
            {
              GError << err_f <<
err_torun;
              GlobalError(); return 0;
            }
            break;
          }
          while( isdigit( *s ) || *s == '-' ||
*s == '.' || *s == 'E' ) s++;
        }
        if( i != n )
        {
          GError << "\nВнимание: в
целевой функции были заданы не все\n"
                    "          коэффициенты для x !\n";
          GlobalError();
        }
        fl1 = 1;
        continue;
      }
      else
      {
        GError << err_f <<
err_torun;
        GlobalError(); return 0;
      }
    }
  } while( !ifile.eof() );
  if( !fl1 )
  {
    GError << "\nВо входном файле
не задана целевая функция!\n" << err_torun;
    GlobalError(); return 0;
  }
  if( !fl2 )
  {
    GError << "\nВо входном файле
не заданы ограничения!\n" << err_torun;
    GlobalError(); return 0;
  }
  return 1;
}
//
Уничтожение переменных, под которые была запрошена память
void
UnLoadData( void )
{
  if( C != NULL ){ delete C; C = NULL; }
  if( B != NULL ){ delete B; B = NULL; }
}
//
Проверить, что нам дали в параметры
int
TestArg( int argc, char **argv )
{
  if( argc == 2 )
  {
    ifstream ifile( argv[1] );
    if( !ifile ); else{ strcpy( DATFile,
argv[1] ); return 1; }
  }
  return 0;
}
//
Просмотрщик MAP- и VEC- файлов, 
встраиваемый в меню файлов
//
SelFile, по клавише F3
unsigned
char View( unsigned char *file )
{
  strupr( file );
  // запомнить экран
  StoreScreen();
  int i = spawnlp( P_WAIT, ViewFile, ViewFile,
file, NULL );
  // если с первого раза не запустилась,  то пробуем запустить
  // без путя
  if( i == -1 )
  {
    char *s = strrchr( ViewFile, '\\' );
    if( s != NULL )
      i = spawnlp( P_WAIT, s+1, s+1, file,
NULL );
  }
  // восстановить старый текстовый режим
  textmode( T.currmode );
  SetBackGround( 16 ); // немигающие фоновые
цвета
  // восстановить экран
  RestoreScreen();
  // зачем включить курсор, а потом выключить
???
  cursorON;
  cursorOFF;
  // я сам не знаю,  но если убрать 
cursorON,  то  курсор 
не
  // OFFнется
  if( i == -1 )
  {
    StartMonitor();
    Warning( NULL, "Извините, но
программа (%s), с помощью кот"
                   "орой\nможно
посмотреть файл %s,\nпочему-то"
                   " не
запускается.\nЖелательно, чтобы эта пр"
                   "ограмма находилась\nв
той же дирректории, "
                   "из которой Вы
запустили MAKEMAP.EXE",
                   ViewFile, file );
    FinishMonitor();
  }
  return 15;
}
char
*all = "Все, кому нужны исходники этой программы, обращайтесь"
            "к автору этой
программы.  Он запросто подарит вам
их!";
void
TheoryReading( void )
{
  TSWIN w( ATTR( YELLOW, GREEN ) );
  w.Locate( T.screenwidth/2, T.screenheight/2,
62, 18, CENTER );
  w.Shadow( RIGHT_BOTTOM );
  w.AttrBor( ATTR( WHITE, GREEN ) );
  w.Open();
  w.PutTitle( " Краткое описание метода
" );
  w.PutTitle(CENTER_BOTTOM,0," Esc, ,
PgUp, PgDn, Home, End ");
  TextShow( HELPFILE,
"Описание_Метода" );
}
void
AboutReading( void )
{
  TSWIN w( ATTR( YELLOW, GREEN ) );
  w.Locate( T.screenwidth/2, T.screenheight/2,
62, 18, CENTER );
  w.Shadow( RIGHT_BOTTOM );
  w.AttrBor( ATTR( WHITE, GREEN ) );
  w.Open();
  w.PutTitle( " О Программе " );
  w.PutTitle(CENTER_BOTTOM,0," Esc, ,
PgUp, PgDn, Home, End ");
  TextShow( HELPFILE, "About" );
}
//
Подсказка встроенная в меню файлов SelFile, которое  не  из
// этой
библиотеки
unsigned
char SelFileHelp( unsigned char * )
{
  StartMonitor();
  HelpHotKey();
  FinishMonitor();
  return 15;
}
int
GetDATFile( void )
{
  TSWIN w( ATTR( BLACK, YELLOW ) );
  w.Locate( 1, 6, 18, 6, LEFT_TOP );
  w.Border( "        " );
  w.Shadow( RIGHT_BOTTOM );
  w.Open();
  Ccputs( 1, "Выберите файл" );
  Ccputs( 2, "с данными задачи" );
  Ccputs( 3, "линейного" );
  Ccputs( 4, "программирования" );
  BL bl( "\x1 F1\x2 - подсказка\x1 F3\x2
- просмотреть файл\x1 Enter\x2 - выбрать\x1"
         "_Esc\x2 - выход " );
  // то берем имя из меню файлов
  unsigned char path[100] ;
  unsigned char mask[15] = "*.*";
  getcwd( path, 99 );  // взяли текущий путь
  // запускаем меню файлов
  FinishMonitor();     // т.к. SelFile из старой библиотеки
  SetHelp( "SelFile - взять файл с
данными" );
  int i = SelFile( path, mask, View,
SelFileHelp );
  SetHelp( "Nothing" );
  StartMonitor();
  if( i == 0 ) return 0;
  strcpy( DATFile, path );
  strupr( DATFile );
  return 1;
}
int
GetDATA( void )
{
  if( DATFile[0] == 0 )
  {
    if( !GetDATFile() ) return 0;
  }
  if( !LoadInputData( DATFile ) ) return 0;
  DATFile[0] = 0;
  return 1;
}
void
OutResults( void )
{
  TSWIN w( ATTR( WHITE, MAGENTA ) );
  w.Locate( T.screenwidth/2, T.screenheight/2,
64, 18, CENTER );
  w.Shadow( RIGHT_BOTTOM );
  w.AttrBor( ATTR( YELLOW, MAGENTA ) );
  w.Open();
  w.PutTitle( " Результаты вычислений
" );
  w.PutTitle(CENTER_BOTTOM,0," Esc, ,
PgUp, PgDn, Home, End ");
  TextShow( OutFile, NULL );
}
void
GeneralWork( void )
{
  // загрузка данных в память
  if( !GetDATA() ) return;
  TSWIN w( ATTR( WHITE, BROWN ) );
  w.Locate( T.screenwidth/2, T.screenheight/2,
40, 7, CENTER );
  w.Shadow( RIGHT_BOTTOM );
  w.Open();
  Ccputs( 1, "Тихо!" );
  Ccputs( 2, "Идут вычисления..." );
  Ccputs( 3, "Интерация номер:" );
  // решение ЛП нашим диким методом
  if( !MSimplex() ) return;
  w.Close();
  // вывод результатов
  OutResults();
  // очистка памяти от всякой ерунды
  UnLoadData();
}
//
Начало программы
void
main( int argc, char **argv )
{
  StartMonitor();
  SetBackGround( 16 ); // немигающие фоновые
цвета
  cursorOFF;
  // Установка подсказки
  char HelpColor[3] = { ATTR(BLACK,CYAN),
ATTR(YELLOW,CYAN), 0 };
  SetHelp( HELPFILE, "Главное меню",
HelpColor );
  HotKey hk( 0, F0+1, HelpHotKey );
  {
    TSWIN wmain( ATTR( GREEN, BLACK ) );
    wmain.Locate( 1, 1, T.screenwidth,
T.screenheight - 1 );
    wmain.FillChar( 0xB1 );
    wmain.Border(
"\xB1\xB1\xB1\xB1\xB1\xB1\xB1\xB1" );
    wmain.Open();
    PutString( "Bog                       ПРОГРАММА SASIMPL                            Версия 1 ",
1, 1, 80, ATTR( BLACK, LIGHTGREEN ) );
    BL_Color[0] = ATTR( RED, WHITE );
    BL_Color[1] = ATTR( BLACK, WHITE );
    BL
bl( "\x1_ _", NULL );
    // если аргумент не VEC-файл, то
начало-тягомотина
    if( TestArg( argc, argv ) == 0 )
    {
      BL bl( "\x1_ ,\x2 -
\"ходить\" по меню \x1 Enter\x2 - "
             "выбрать пункт меню \x1_
Esc\x2 - выход_", NULL );
      TSWIN w( ATTR( WHITE, BLUE ) );
      w.Locate( T.screenwidth/2,
T.screenheight/2 + 1, 70, 19, CENTER );
      w.Open( CENTER, 25 );
      textcolor( YELLOW );
      Ccputs( 
1, "РЕШЕНИЕ ЗАДАЧ, ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ" );
      Ccputs( 
2, "БОЛЬШОЙ РАЗМЕРНОСТИ МОДИФИЦИРОВАННЫМ СИМПЛЕКС-МЕТОДОМ" );
      Ccputs( 
3, "С МУЛЬТИПЛИКАТИВНЫМ ПРЕДСТАВЛЕНИЕМ ОБРАТНОЙ МАТРИЦЫ" );
      Ccputs( 5, "  Программа 
работает  с  линейными 
задачами минимизации,");
      Ccputs( 6, "поставленными в
канонической форме, то есть в ограничениях");
      Ccputs( 7, "стоят   только  
равенства  (введены  все 
искусственные и");
      Ccputs( 8, "свободные
перемнные).                                    
");
      textcolor( LIGHTMAGENTA );
      Ccputs( 10, "Выберите, что вы желаете:" );
      textcolor( WHITE );
      TSMENU mmain( 4 );
      mmain.Color( ATTR( BLACK, CYAN ) );
      mmain.CurrentShow( Attr );
      mmain.Item( 12, 12, "Решать задачу
линейного программирования" );
      mmain.Item( 12, 14, "     Почитать краткую теорию метода     " );
      mmain.Item( 12, 15, "          Узнать о программе            " );
      mmain.Item( 12, 16, "          Выйти из программы            " );
      while( 1 )
      {
        int i = mmain.Exec();
        if( i )
          switch( mmain.Current() )
          {
            case 0: GeneralWork(); continue;
            case 1: TheoryReading(); continue;
            case 2: AboutReading(); continue;
            default: break;
          }
        break;
      }
    }
    else GeneralWork();
  }
  cursorON;
  FinishMonitor();
}
Метод искуственного базиса для решения основной задачи линеинего программирования. Решить задачу о назначении модифицированным симплекс методом Москва Россия Москве. Решения задач линейного программирования модифицированный симплекс метод. Программа на делфи по решению задач МОДИФИЦИРОВАННым СИМПЛЕКС МЕТОДом. Курсовая работа на тему Реализация модифицированного симплекс метода. Курсовая работа по теме реализация модифицированного симплекс метода. Условия продуктивности матрицы симплекс метод Москва Россия Москве. Реализация модифицированного симплекс метода Москва Россия Москве. Курсовая работа тема реализация модифицированного симплекс метод. Реализация модифицированного симплекс метода на эвм с графикой. Реферат на тему реализация модифицированного симплекс метода. Реализация модифицированного симплекс метода курсовая работа. Модифицированный симплекс метод на языке програмирования. Примеры решения задач модифицированным симплекс методом. Курсовая Реализация модифицированного симплекс метода.
рефераты Рекомендуем рефератырефераты

     
Рефераты @2011