Задание к лабораторной работе:
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';
}


