Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Симплекс метод 
V
    Опции темы
ioManip
Дата 25.10.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Привет! Вообщем ситуация такая, у меня есть алгоритм на паскале, я его перевел на С++, но работает он не на всех примерах. Я на 100 % уверен, что дело в индексах smile Я уже их и так и так...Прошу глянуть, может кто заменит что не так.

P.S. И не ругайте за глобальные переменные, я исправлю, честно. 

Код

const
  mm=50;
  nn=50;
var
  n,m,i,j:integer;
  A:array [1..mm,1..nn] of real;
  Zx:array [1..nn] of real;
  basis:array [1..mm] of integer;
  x:array [1..mm] of real;
 
// Процедура решения
procedure solve;
var
  opt:boolean;
  mark_val,theta_val,tmp:real;
  rl,rs,theta_ss,i,j:integer;
  theta:array [1..mm] of real;
begin
  opt:=false;
  repeat
    for i:=m+1 to m+1 do
      begin
        for j:=1 to n+m+1 do
          begin
            if A[i,j]>=0 then
              begin
                opt:=true;
              end
            else
              begin
                opt:=false;
                break;
              end;
          end;
      end;
 
    if opt=false then
      begin
        // Разрешающий столбец
        mark_val:=A[m+1,1];
        for j:=1 to n+m+1 do
          begin
            if A[m+1,j]<=mark_val then
              begin
                mark_val:=A[m+1,j];
                rl:=j; 
              end;
          end;
 
        // Разрешающая строка
        for i:=1 to m do
          begin
            if A[i,rl]<>0 then
              begin
                theta[i]:=A[i,n+m+1]/A[i,rl];
              end
            else
              begin
                theta[i]:=-1;
              end;
          end;
        for i:=1 to m do
          begin
            if A[i,rl]<>0 then
              begin
                theta_ss:=i;
                break;
              end;
          end;
        if theta_ss>=1 then
          begin
            theta_val:=theta[theta_ss];
          end
        else
          begin
            writeln('Решения не существует');
          end;
        for i:=theta_ss to m do
          begin
            if (theta[i]<=theta_val) and (theta[i]>=0) then
              begin
                theta_val:=theta[i];
                rs:=i; 
              end;
          end;
 
        // Ввод нового элемента в базис
        basis[rs]:=rl;
 
        // Метод Гаусса-Жордана
        for i:=1 to m+1 do
          begin
            if i<>rs then
              begin
                tmp:=A[i,rl];
                for j:=1 to n+m+1 do
                  begin
                    A[i,j]:=A[i,j]-A[rs,j]*tmp/A[rs,rl];
                  end;
              end
            else
              begin
                tmp:=A[rs,rl];
                for j:=1 to n+m+1 do
                  begin
                    A[rs,j]:=A[rs,j]/tmp;
                  end;
              end;
          end;
      end;
  until opt;
end;
 
// Функция для правильной расстановки знаков
function sign(x:real):string;
begin
  if (x>=0) then
    begin
      sign:='+';
    end
  else
    begin
      sign:='';
    end;
end;
 
begin
 
  // Считывание данных
  writeln('Введите кол-во переменных:');
    read(n);
  writeln('Введите кол-во ограничений:');
    read(m);
  writeln('Введите коэффициенты при переменных:');
  for i:=1 to m do
    begin
      for j:=1 to n do
        begin
          read(A[i,j]);
        end;
      writeln;
    end;
  writeln('Введите значения:');
  for i:=1 to m do
    begin
      read(A[i,n+m+1]);
    end;
  writeln('Введите коэффициенты целевой функции:');
  for i:=1 to n do
    begin
      read(Zx[i]);
    end;
 
  // Единичная матрица
  for i:=1 to m do
    begin
      for j:=n+1 to n+m do
        begin
          if i=j-n then
            begin
              A[i,j]:=1
            end
          else
            begin
              A[i,j]:=0
            end;
        end;
    end;
 
  
  for i:=m+1 to m+1 do
    begin
      for j:=1 to n+m+1 do
        begin
          if j<=n then
            begin
              A[i,j]:=-Zx[j];
            end
          else
            begin
              A[i,j]:=0;
            end;
        end;
    end;
 
  // Номера базисных переменных
  for i:=1 to m do
    begin
      basis[i]:=n+i;
    end;
 
  // Оформление и решение:
  writeln('Вычислим максимальное значение целевой функции:');
  write('L(x) = ');
  for i:=1 to n do
    begin
      if (i<>1) then
        begin
          write(sign(Zx[i]),Zx[i],'x',i);
        end
      else
        begin
          write(Zx[i],'x',i);
        end;
    end;
  writeln;
 
  writeln('При ограничениях:');
  for i:=1 to m do
    begin
      for j:=1 to n+1 do
        begin
          if j<>n+1 then
            begin
              if j<>1 then
                begin
                  write(sign(A[i,j]),A[i,j],'x',j);
                end
              else
                begin
                  write(A[i,j],'x',j);
                end;
            end
          else
            begin
              write(' <= ',A[i,n+m+1]);
            end;
        end;
      writeln;
    end;
  writeln;
 
  solve; // Запуск решения
 
  writeln('Решение:');                                                   
  for i:=1 to m do
    begin
      if basis[i]<=n+m then
        begin
          x[basis[i]]:=A[i,n+m+1];
        end;
    end;
  for i:=1 to m+n do
    begin
    if x[i]<>0 then
      begin
        writeln('x',i,'=',x[i]:0:3);
      end;
    end; 
  writeln;
  writeln('max Z(x)=', A[m+1, n+m+1]:0:3);
end.


Код

#include <iostream>
#include <clocale>

int const mm = 50;
int const nn = 50;

float A[mm][nn];
int basis[mm];  
float Zx[nn];  
float x[mm];  
int n;        
int m;       

void solution();
std::string sign(float);

int main()
{
    setlocale(LC_ALL, "RUSSIAN");
    std::cout << "Введите количество переменных: ";
    std::cin >> n;
    std::cout << "Введите количество ограничений: ";
    std::cin >> m;
    std::cout << "Введите коэф. при переменных: " << std::endl;
    
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            std::cin >> A[i][j];
        }
        std::cout << std::endl;
    }
    
    std::cout << "Введите значения: " << std::endl;
    
    for (int i = 0; i < m; i++)
    {
        std::cin >> A[i][n + m + 1];
    }
    
    std::cout << "Введите коэф. целевой функции: " << std::endl;
    
    for (int i = 0; i < n; i++)
    {
        std::cin >> Zx[i];
    }
    
    //Единичная матрица
    for (int i = 0; i < m; i++)
    {
        for (int j = n + 1; j < n + m; j++)
        {
            if (i == j - n)
            {
                A[i][j] = 1;
            }
            else
            {
                A[i][j] = 0;
            }
        }
    }
    
    for (int i = m + 1; i <= m + 1; i++)
    {
        for (int j = 0; j < n + m + 1; j++)
        {
            if (j <= n)
            {
                A[i][j] = -Zx[j];
            }
            else
            {
                A[i][j] = 0;
            }
        }
    }
    
    //Номера базисных переменных
    for (int i = 0; i < m; i++)
    {
        basis[i] = n + i;
    }
    
    std::cout << "Максимальное значение целевой функции: " << std::endl;
    std::cout << "L(x) = ";
    
    for (int i = 0; i < n; i++)
    {
        if (i != 0)
        {
            std::cout << sign(Zx[i]) << Zx[i] << "x" << i + 1;
        }
        else
        {
            std::cout << Zx[i] << "x" << i + 1;
        }
    }
    std::cout << std::endl;
    
    std::cout << "При ограничениях: " << std::endl;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            if (j != n)
            {
                if (j != 0)
                {
                    std::cout << sign(A[i][j]) << A[i][j] << "x" << j + 1;
                }
                else
                {
                    std::cout << A[i][j] << "x" << j + 1;
                }
            }
            else
            {
                std::cout << " <= " << A[i][n + m + 1];
            }
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
    
    //Решение
    solution();
    
    std::cout << "Решение: " << std::endl;
    
    for(int i = 0; i < m; i++) 
    {
        if (basis[i] <= n + m)
        {
            x[basis[i]] = A[i][n + m + 1];
//            std::cout << x[basis[i]] << std::endl;
        }
    }
    
    for (int i = 0; i < m + n; i++)
    {
        if (x[i] != 0)
        {
            std::cout << "x" << i + 1 << " = " << x[i] << std::endl;
        }
    }
    std::cout << std::endl;
    std::cout << "max Z(x) = " << A[m + 1][n + m + 1] << std::endl;

   return 0;
}

void solution()
{
   float markVal;
   float thetaVal;
   float temp;     
   
   float theta[mm];
   
   int rl;
   int rs;          
   int thetaSs;
   
   bool opt = false;

   do
   {
       for (int i = m + 1; i <= m + 1; i++)
       {
           for (int j = 0; j < n + m + 1; j++)
           {
               if (A[i][j] >= 0)
               {
                   opt = true;
               }
               else
               {
                   opt = false;
                   break;
               }
           } 
       }
       
       if (opt == false)
       {
           //Разрешающий столбец
           markVal = A[m + 1][1];
           for (int j = 0; j < n + m + 1; j++)
           {
               if (A[m + 1][j] <= markVal)
               {
                   markVal = A[m + 1][j];
                   rl = j;
               }
           }
           
           //Разрешающая строка
           for (int i = 0; i < m; i++)
           {
               if (A[i, rl] != 0)
               {
                   theta[i] = A[i][n + m + 1] / A[i][rl];
               }
               else
               {
                   theta[i] = -1;
               }
           }
           
           for (int i = 0; i < m + 1; i++)
           {
               if (A[i][rl] != 0)
               {
                   thetaSs = i;
                   break;
               }
           }
           
           if (thetaSs >= 0)
           {
               thetaVal = theta[thetaSs];
           }
           else
           {
               std::cout << "Решения не существует" << std::endl;
           }
           
           for (int i = thetaSs; i < m; i++) 
           {
               if ((theta[i] <= thetaVal) && (theta[i] >= 0))
               {
                   thetaVal = theta[i];
                   rs = i;
               }
           }
           
           //Ввод нового элемента в базис
           basis[rs] = rl;
           
           //Метод Гаусса-Жордана
           for (int i = 0; i <= m + 1; i++)
           {
               if (i != rs)
               {
                   temp = A[i][rl];
                   for (int j = 0; j <= n + m + 1; j++)
                   {
                        A[i][j] = A[i][j] - A[rs][j] * temp / A[rs][rl];
                   }
               }
               else
               {
                   temp = A[rs][rl];
                   for (int j = 0; j <= n + m + 1; j++)
                   {
                       A[rs][j] = A[rs][j] / temp;
                   }
               }
           }
       }
   } while (!opt);
}

std::string sign(float x)
{
    std::string strSign;
    
    if (x >= 0)
    {
        strSign = '+';
    }
    else
    {
        strSign = ' ';
    }
    return strSign;   
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.