
Бывалый

Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск
Репутация: нет Всего: нет
|
Привет! Вообщем ситуация такая, у меня есть алгоритм на паскале, я его перевел на С++, но работает он не на всех примерах. Я на 100 % уверен, что дело в индексах  Я уже их и так и так...Прошу глянуть, может кто заменит что не так. 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; }
|
--------------------
Мечты не работают, пока ты не работаешь!
|