p align="left"> if ((Mat[tmpX][tmpY]!=0)&&(tmpY!=3)) if (Mat[0][tmpY]/Mat[tmpX][tmpY]<tmp) { tmp=Mat[0][tmpY]/Mat[tmpX][tmpY]; tmpP=tmpY; } } //Делим на получившийся главный элемент tmpY=tmpP; for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat1[i][j]=Mat[i][j]; tmp=Mat[tmpX][tmpY]; for (tmpP=0; tmpP<=4; tmpP++) Mat1[tmpX][tmpP]=Mat1[tmpX][tmpP]/tmp; for (tmpP=0; tmpP<=4; tmpP++) Mat1[tmpP][tmpY]=Mat1[tmpP][tmpY]/tmp; switch (tmpY) { case 0: { X5->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X5"; break; case 2: X2->Caption="X5"; break; case 3: X3->Caption="X5"; break; case 4: X4->Caption="X5"; break; } }; break; case 1: { X6->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X6"; break; case 2: X2->Caption="X6"; break; case 3: X3->Caption="X6"; break; case 4: X4->Caption="X6"; break; } }; break; case 2: { X7->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X7"; break; case 2: X2->Caption="X7"; break; case 3: X3->Caption="X7"; break; case 4: X4->Caption="X7"; break; } }; break; } Mat1[tmpX][4]=Mat1[tmpX][4]*(-1); for (tmpI=0; tmpI<=4; tmpI++) for (tmpJ=0; tmpJ<=4; tmpJ++) if ((tmpI!=tmpX)&&(tmpJ!=tmpY) ) { Mat1[tmpI][tmpJ]=Mat[tmpI][tmpJ]-(Mat[tmpX][tmpJ]*Mat[tmpI][tmpY])/tmp; } //********************************************************* //поиск оптимального решения for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat2[i][j]=Mat1[i][j]; sMemo1->Lines->Add("Задача №1."); sMemo1->Lines->Add("Опорное решение:"); sMemo1->Lines->Add(X5->Caption+"="+FloatToStr(Mat2[0][0])+" "+X6->Caption+"="+FloatToStr(Mat2[0][1])+" "+X7- >Caption+"="+FloatToStr(Mat2[0][2])); sMemo1->Lines->Add("f(x)="+FloatToStr(Mat2[0][3])); tmp=0; tmpP=0; for (tmpX=0; tmpX<=4; tmpX++) if (Mat1[tmpX][3]<0) if (fabs(tmp)<fabs(Mat1[tmpX][3])) { tmp=Mat1[tmpX][3]; tmpP=tmpX; } //ShowMessage(FloatToStr(tmp)+" "+IntToStr(tmpP)); //В столбце находим минимальный элемент tmp=400; tmpX=tmpP; tmpJ=tmpY; for (tmpY=0; tmpY<=2; tmpY++) { if ((Mat1[tmpX][tmpY]!=0) && (tmpY!=tmpJ) ) if (Mat1[0][tmpY]/Mat1[tmpX][tmpY]<tmp ) { tmp=Mat1[0][tmpY]/Mat1[tmpX][tmpY]; tmpP=tmpY; } } //ShowMessage(FloatToStr(tmp)+" "+IntToStr(tmpP)); //Делим на получившийся элемент tmpY=tmpP; for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat2[i][j]=Mat1[i][j]; tmp=Mat1[tmpX][tmpY]; for (tmpP=0; tmpP<4; tmpP++) Mat2[tmpP][tmpY]=Mat2[tmpP][tmpY]/tmp; for (tmpP=0; tmpP<3; tmpP++) Mat2[tmpX][tmpP]=Mat2[tmpX][tmpP]/tmp; switch (tmpY) { case 0: { X5->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X5"; break; case 2: X2->Caption="X5"; break; case 3: X3->Caption="X5"; break; case 4: X4->Caption="X5"; break; } }; break; case 1: { X6->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X6"; break; case 2: X2->Caption="X6"; break; case 3: X3->Caption="X6"; break; case 4: X4->Caption="X6"; break; } }; break; case 2: { X7->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X1->Caption="X7"; break; case 2: X2->Caption="X7"; break; case 3: X3->Caption="X7"; break; case 4: X4->Caption="X7"; break; } }; break; } Mat2[tmpX][3]=Mat2[tmpX][3]*(-1); //вывод получившегося решения for (tmpI=0; tmpI<=4; tmpI++) for (tmpJ=0; tmpJ<=4; tmpJ++) if ((tmpI!=tmpX)&&(tmpJ!=tmpY) ) { Mat2[tmpI][tmpJ]=Mat1[tmpI][tmpJ]-(Mat1[tmpX][tmpJ]*Mat1[tmpI][tmpY])/tmp; } Mat2[1][3]=Mat2[1][3]*(-1); sMemo1->Lines->Add("Оптимальное решение:"); sMemo1->Lines->Add(X5->Caption+"="+FloatToStr(Mat2[0][0])+" "+X6->Caption+"="+FloatToStr(Mat2[0][1])+" "+X7->Caption+"="+FloatToStr(Mat2[0][2])); sMemo1->Lines->Add("f(x)="+FloatToStr(Mat2[0][3])); Edit00->Text=FloatToStr(Mat2[0][0]); Edit01->Text=FloatToStr(Mat2[0][1]); Edit02->Text=FloatToStr(Mat2[0][2]); Edit03->Text=FloatToStr(Mat2[0][3]); Edit04->Text=FloatToStr(Mat2[0][4]); Edit10->Text=FloatToStr(Mat2[1][0]); Edit11->Text=FloatToStr(Mat2[1][1]); Edit12->Text=FloatToStr(Mat2[1][2]); Edit13->Text=FloatToStr(Mat2[1][3]); Edit14->Text=FloatToStr(Mat2[1][4]); Edit20->Text=FloatToStr(Mat2[2][0]); Edit21->Text=FloatToStr(Mat2[2][1]); Edit22->Text=FloatToStr(Mat2[2][2]); Edit23->Text=FloatToStr(Mat2[2][3]); Edit24->Text=FloatToStr(Mat2[2][4]); Edit30->Text=FloatToStr(Mat2[3][0]); Edit31->Text=FloatToStr(Mat2[3][1]); Edit32->Text=FloatToStr(Mat2[3][2]); Edit33->Text=FloatToStr(Mat2[3][3]); Edit34->Text=FloatToStr(Mat2[3][4]); Edit40->Text=FloatToStr(Mat2[4][0]); Edit41->Text=FloatToStr(Mat2[4][1]); Edit42->Text=FloatToStr(Mat2[4][2]); Edit43->Text=FloatToStr(Mat2[4][3]); Edit44->Text=FloatToStr(Mat2[4][4]); Price1=Mat2[0][3]; //Расчет для второй задачи for (tmpX=0; tmpX<=4; tmpX++) for (tmpY=0; tmpY<=2; tmpY++) Mat[tmpX][tmpY]=0; Mat[0][0]=StrToFloat(Edit001->Text); Mat[0][1]=StrToFloat(Edit011->Text); Mat[0][2]=StrToFloat(Edit021->Text); Mat[1][0]=StrToFloat(Edit101->Text); Mat[1][1]=StrToFloat(Edit111->Text); Mat[1][2]=StrToFloat(Edit121->Text); Mat[2][0]=StrToFloat(Edit201->Text); Mat[2][1]=StrToFloat(Edit211->Text); Mat[2][2]=StrToFloat(Edit221->Text); Mat[3][0]=StrToFloat(Edit301->Text); Mat[3][1]=StrToFloat(Edit311->Text); Mat[3][2]=StrToFloat(Edit321->Text); Mat[4][0]=StrToFloat(Edit401->Text); Mat[4][1]=StrToFloat(Edit411->Text); Mat[4][2]=StrToFloat(Edit421->Text); //Находим среди отрицательных максимальное по модулю tmp=0; tmpP=0; for (tmpX=0; tmpX<=4; tmpX++) if (Mat[tmpX][2]<0) if (fabs(tmp)<fabs(Mat[tmpX][2])) { tmp=Mat[tmpX][2]; tmpP=tmpX; } //В столбце находим минимальный элемент tmp=100; tmpX=tmpP; for (tmpY=0; tmpY<=1; tmpY++) { if (Mat[tmpX][tmpY]!=0) if (Mat[0][tmpY]/Mat[tmpX][tmpY]<tmp) { tmp=Mat[0][tmpY]/Mat[tmpX][tmpY]; tmpP=tmpY; } } //Делим на получившийся главный элемент tmpY=tmpP; for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat1[i][j]=Mat[i][j]; for (tmpP=0; tmpP<= 2; tmpP++) tmp=Mat[tmpX][tmpY]; Mat1[tmpX][tmpP]=Mat1[tmpX][tmpP]/tmp; for (tmpP=0; tmpP<= 4; tmpP++) Mat1[tmpP][tmpY]=Mat1[tmpP][tmpY]/tmp; switch (tmpY){ case 0: { X51->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X11->Caption="X5"; break; case 2: X21->Caption="X5"; break; case 3: X31->Caption="X5"; break; case 4: X41->Caption="X5"; break; } }; break; case 1: { X61->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X11->Caption="X6"; break; case 2: X21->Caption="X6"; break; case 3: X31->Caption="X6"; break; case 4: X41->Caption="X6"; break; } } break; } Mat1[tmpX][2]=Mat1[tmpX][2]*(-1); for (tmpI=0; tmpI<=4; tmpI++) for (tmpJ=0; tmpJ<=2; tmpJ++) if ((tmpI!=tmpX)&&(tmpJ!=tmpY)) { Mat1[tmpI][tmpJ]=Mat[tmpI][tmpJ]-(Mat[tmpX][tmpJ]*Mat[tmpI][tmpY])/tmp; } //Вывод базового решения. for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat2[i][j]=Mat1[i][j]; sMemo1->Lines->Add("Задача №2."); sMemo1->Lines->Add("Опорное решение:"); sMemo1->Lines->Add(X51->Caption+"="+FloatToStr(Mat2[0][0])+" "+X61->Caption+"="+FloatToStr(Mat2[0][1])); sMemo1->Lines->Add("f(x)="+FloatToStr(Mat2[0][2])); //********************************************************* // поиск оптимального решения tmp=0; tmpP=0; for (tmpX=0; tmpX<=4; tmpX++) if (Mat1[tmpX][2]<0) if (fabs(tmp)<fabs(Mat1[tmpX][2])) { tmp=Mat1[tmpX][2]; tmpP=tmpX; } //В столбце находим минимальный элемент tmp=1000; tmpX=tmpP; tmpJ=tmpY; for (tmpY=0; tmpY<=1; tmpY++) { if ((Mat1[tmpX][tmpY]!=0) && (tmpY!=tmpJ)) if (Mat1[0][tmpY]/Mat1[tmpX][tmpY]<tmp) { tmp=Mat1[0][tmpY]/Mat1[tmpX][tmpY]; tmpP=tmpY; } } //Делим на получившийся элемент tmpY=tmpP; for (int i = 0; i <= 4; i++) for (int j=0; j <= 4; j++) Mat2[i][j]=Mat1[i][j]; tmp=Mat1[tmpX][tmpY]; for (tmpP=0; tmpP<=4; tmpP++) Mat2[tmpP][tmpY]=Mat2[tmpP][tmpY]/tmp; for (tmpP=0; tmpP<=2; tmpP++) Mat2[tmpX][tmpP]=Mat2[tmpX][tmpP]/tmp; switch (tmpY){ case 0: { X51->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X11->Caption="X5"; break; case 2: X21->Caption="X5"; break; case 3: X31->Caption="X5"; break; case 4: X41->Caption="X5"; break; } }; break; case 1: { X61->Caption="X"+IntToStr(tmpX); switch (tmpX) { case 1: X11->Caption="X6"; break; case 2: X21->Caption="X6"; break; case 3: X31->Caption="X6"; break; case 4: X41->Caption="X6"; break; } } break; } Mat2[tmpX][2]=Mat2[tmpX][2]*(-1); //вывод получившегося решения for (tmpI=0; tmpI<=4; tmpI++) for (tmpJ=0; tmpJ<=2; tmpJ++) if ((tmpI!=tmpX)&&(tmpJ!=tmpY)) { Mat2[tmpI][tmpJ]=Mat1[tmpI][tmpJ]-(Mat1[tmpX][tmpJ]*Mat1[tmpI][tmpY])/tmp; } sMemo1->Lines->Add("Оптимальное решение:"); sMemo1->Lines->Add(X51->Caption+"="+FloatToStr(Mat2[0][0])+" "+X61->Caption+"="+FloatToStr(Mat2[0][1])); sMemo1->Lines->Add("f(x)="+FloatToStr(Mat2[0][2])); Edit001->Text=FloatToStr(Mat2[0][0]); Edit011->Text=FloatToStr(Mat2[0][1]); Edit021->Text=FloatToStr(Mat2[0][2]); Edit101->Text=FloatToStr(Mat2[1][0]); Edit111->Text=FloatToStr(Mat2[1][1]); Edit121->Text=FloatToStr(Mat2[1][2]); Edit201->Text=FloatToStr(Mat2[2][0]); Edit211->Text=FloatToStr(Mat2[2][1]); Edit221->Text=FloatToStr(Mat2[2][2]); Edit301->Text=FloatToStr(Mat2[3][0]); Edit311->Text=FloatToStr(Mat2[3][1]); Edit321->Text=FloatToStr(Mat2[3][2]); Edit401->Text=FloatToStr(Mat2[4][0]); Edit411->Text=FloatToStr(Mat2[4][1]); Edit421->Text=FloatToStr(Mat2[4][2]); sMemo1->Lines->Add("*********************************"); sMemo1->Lines->Add("Прибыль по первому сорту бензина: "+FloatToStr(Price1)); sMemo1->Lines->Add("Прибыль по второму сорту бензина: "+FloatToStr(Mat2[0][2])); if (Price1<Mat2[0][2]) { sMemo1->Lines->Add("Второй сорт бензина выгоднее на "+FloatToStr(Mat2[0][2]-Price1)); } if (Price1>Mat2[0][2]) { sMemo1->Lines->Add("Первый сорт бензина выгоднее на "+FloatToStr(Price1-Mat2[0][2])); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::N4Click(TObject *Sender) { ShowMessage("Симплекс-метод для решения задачи на смеси!"); }
Страницы: 1, 2, 3, 4
|