Задание к лабораторной работе:

8. F= 2x1 – 4x2 ® max

8x1 – 5x2 £ 16

x1 + 3x2 £ 2

2x1 + 7x2 ³ 9

x1, x2 ³ 0

Текст программы:

#include "iostream"

#include "iomanip"

#include <cstdlib>

using namespace std;

const int m=3;

const int n=5;

void Form_Csi(const double CJ[],const int Bazis_num[],double Csi[]);

int Rasc_Ocenki(const double Csi[],const double CJ[],const double matrix[][n],double Ocenki[]);

int Tetta(double Q[],int nov_bazis_stolb, double matrix[][n],double A0[]);

void Vvod_Dannih(double matrix[][n],double A0[], double CJ[], int Bazis_num[]);

void Vivod_Rez(const double Csi[],const double CJ[],const double matrix[][n],const double Ocenki[],const double A0[],const int Bazis_num[],double F, const double Q[]);

void Vvod_Dannih_2TABL(double matrix2[][n],double A02[],double matrix[][n],double A0[],int nov_bazis_str, int nov_bazis_stolb);

void Vivod_Rez2(const double Csi[],const double CJ[],const double matrix[][n],const double Ocenki[],const double A0[],const int Bazis_num[],double F, const double Q[]);

int main(int argc, char *argv[])

{

double F=0;

double matrix[m][n];

double matrix2[m][n];

double CJ[n];

double A0[m];

double A02[m];

int Bazis_num[m];

double Csi[m];

double Ocenki[n];

double Q[m];

int nov_bazis_stolb=-1, nov_bazis_str=-1;

for(int i=0;i<m;i++)

Q[i]=0;

Vvod_Dannih(matrix, A0,CJ, Bazis_num);

Form_Csi(CJ, Bazis_num, Csi);

nov_bazis_stolb=Rasc_Ocenki(Csi, CJ, matrix, Ocenki);

НЕ нашли? Не то? Что вы ищете?

for(int i=0;i<m;i++)

F=F+Csi[i]*A0[i];

if (nov_bazis_stolb!=-1)

{

nov_bazis_str=Tetta(Q, nov_bazis_stolb, matrix, A0);

cout<<'\n';

cout<<"Reshenie ne naydeno\n"<<'\n';

Vivod_Rez(Csi, CJ, matrix, Ocenki, A0,Bazis_num, F,Q);

for(int i=0;i<m;i++)

{

if (i==nov_bazis_str)

Bazis_num[i]=nov_bazis_stolb+1;

}

Vvod_Dannih_2TABL(matrix2, A02, matrix, A0, nov_bazis_str, nov_bazis_stolb);

Form_Csi(CJ, Bazis_num, Csi);

for (int i=0;i<m;i++){

for(int j=0;j<n;j++){

matrix[i][j]=matrix2[i][j];}}

for (int i=0;i<m;i++)

{A0[i]=A02[i];}

nov_bazis_stolb=Rasc_Ocenki(Csi, CJ, matrix, Ocenki);

for(int i=0;i<m;i++)

F=F+Csi[i]*A0[i];

if (nov_bazis_stolb!=-1)

{

nov_bazis_str=Tetta(Q, nov_bazis_stolb, matrix, A0);

cout<<"Reshenie ne naydeno";

}

else cout<<"Reshenie naydeno";

cout<<'\n';

Vivod_Rez2(Csi, CJ, matrix, Ocenki, A0,Bazis_num, F,Q);

}

else cout<<"Reshenie naydeno";

// Âûâîä ðåçóëüòàòîâ

system("PAUSE");

return EXIT_SUCCESS;

}

void Form_Csi(const double CJ[],const int Bazis_num[],double Csi[])

{

for(int i=0;i<m;i++)

Csi[i]=CJ[Bazis_num[i]-1];

}

int Rasc_Ocenki(const double Csi[],const double CJ[],const double matrix[][n],double Ocenki[])

{

int nov_bazis_stolb=0;

double Ocen_min;

for(int j=0;j<n;j++)

{

Ocenki[j]=0;

for(int i=0;i<m;i++)

Ocenki[j]=Ocenki[j]+matrix[i][j]*Csi[i];

Ocenki[j]-=CJ[j];

}

Ocen_min=Ocenki[0];

for(int i=0;i<n;i++)

{

if (Ocen_min>Ocenki[i])

{

Ocen_min=Ocenki[i];

nov_bazis_stolb=i;

}

}

if (Ocen_min>=0)

nov_bazis_stolb=-1;

cout<<"Noviy bazisniy stolbec="<<nov_bazis_stolb+1<<'\n';

return nov_bazis_stolb;

}

int Tetta(double Q[],int nov_bazis_stolb, double matrix[][n],double A0[])

{

int nov_bazis_str=-1;

for(int i=0;i<m;i++)

{

if (matrix[i][nov_bazis_stolb]>0)

Q[i]= A0[i]/matrix[i][nov_bazis_stolb];

else

Q[i]=-1;

}

double Q_min=;

for(int i=0;i<m;i++)

{

if ((Q[i]<Q_min)&&(Q[i]>0))

{

Q_min=Q[i];

nov_bazis_str=i;

}

}

cout<<"Novaya bazisnaya stroka="<<nov_bazis_str+1<<'\n';

return nov_bazis_str;

}

void Vvod_Dannih(double matrix[][n],double A0[], double CJ[], int Bazis_num[])

{

int i, j;

cout<<"Vvedite matritsu razmernost'ju "<<m<<" na "<<n<<" ("<<n*m<<" chisel cherez probel):\n";

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

cin >> matrix[i][j];

}

}

cout << endl<<endl;

cout<<"Vvedite elementi svobodnogo stolbca A0 ("<<m<<" chisel cherez probel):\n";

for (i=0;i<m;i++)

{

cin >> A0[i];

}

cout<<"Vvedite koeficienti CJ ("<<n<<" chisel)\n";

for(j=0;j<n;j++)

{

cin>>CJ[j];

}

cout<<"Vvedite nomera bazisnih elementov ("<<m<<" chisel)\n";

for(i=0;i<m;i++)

{

cin>>Bazis_num[i];

}

}

void Vivod_Rez(const double Csi[],const double CJ[],const double matrix[][n],const double Ocenki[],const double A0[],const int Bazis_num[],double F, const double Q[])

{

int i, j;

cout<<setw(12)<<"Cj"<<setw(25)<<" ";

for(j=0;j<n;j++)

cout<<setw(13)<<CJ[j];

cout<<'\n';

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

cout<<setw(12)<<"Csi"<<setw(12)<<"Bazis_num";

for(j=0;j<n+1;j++)

cout<<setw(12)<<"A"<<j;

cout<<setw(12)<<"Q"<<'\n';

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

for (i=0;i<m;i++)

{

cout<<setw(12)<<Csi[i]<<setw(12)<<"x"<<Bazis_num[i]<<setw(12)<<A0[i];

for(j=0;j<n;j++)

cout<<setw(13)<<matrix[i][j];

cout<<setw(12)<<Q[i]<<'\n';

}

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

cout<<setw(12)<<" "<<setw(12)<<"F="<<setw(13)<<F;

for(j=0;j<n;j++)

cout<<setw(13)<<Ocenki[j];

cout<<'\n';

}

void Vvod_Dannih_2TABL(double matrix2[][n],double A02[],double matrix[][n],double A0[],int nov_bazis_str, int nov_bazis_stolb)

{

int i=0,j=0;

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{ if (i==nov_bazis_str)

matrix2[nov_bazis_str][j]=matrix[nov_bazis_str][j]/matrix[nov_bazis_str][nov_bazis_stolb];

else

matrix2[i][j]=matrix[i][j]-(matrix[nov_bazis_str][j]*matrix[i][nov_bazis_stolb]/matrix[nov_bazis_str][nov_bazis_stolb]);

}

}

for (i=0;i<m;i++)

{ if (i==nov_bazis_str)

A02[nov_bazis_str]=A0[nov_bazis_str]/matrix[nov_bazis_str][nov_bazis_stolb];

else

A02[i]=A0[i]-(A0[nov_bazis_str]*matrix[i][nov_bazis_stolb]/matrix[nov_bazis_str][nov_bazis_stolb]);

}

}

void Vivod_Rez2(const double Csi[],const double CJ[],const double matrix[][n],const double Ocenki[],const double A0[],const int Bazis_num[],double F, const double Q[])

{

int i, j;

cout<<setw(12)<<"Cj"<<setw(25)<<" ";

for(j=0;j<n;j++)

cout<<setw(13)<<CJ[j];

cout<<'\n';

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

cout<<setw(12)<<"Csi"<<setw(12)<<"Bazis_num";

for(j=0;j<n+1;j++)

cout<<setw(12)<<"A"<<j;

cout<<setw(12)<<"Q"<<'\n';

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

for (i=0;i<m;i++)

{

cout<<setw(12)<<Csi[i]<<setw(12)<<"x"<<Bazis_num[i]<<setw(12)<<A0[i];

for(j=0;j<n;j++)

cout<<setw(13)<<matrix[i][j];

cout<<setw(12)<<Q[i]<<'\n';

}

for(i=0;i<2+n;i++)

cout<<"_________________";

cout<<'\n';

cout<<setw(12)<<" "<<setw(12)<<"F="<<setw(13)<<F;

for(j=0;j<n;j++)

cout<<setw(13)<<Ocenki[j];

cout<<'\n';

}