生活随笔
收集整理的這篇文章主要介紹了
C++解决单纯形表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//用單純形法求解線性規劃問題
//求解max z=2*x(1)+3*x(2)
// 2*x(1)+2*(x2)<=12
// 4*x(1)<=16
// 5*x(2)<=15
// x(1),x(2)>=0
//Matrix.dat文件中存放的是x的系數
// x1 x2 x3 x4 x5
// a11 a12 a13 a14 a15
// a21 a22 a23 a24 a25
// a31 a32 a33 a34 a35
//Cb.dat文件中存放的數據是Cb和B中的數據
// Cb1 B1
// Cb2 B2
// Cb3 B3
//Check.dat文件中存放的數據是檢驗數Check中的數據
// Check1 Check2 Check3 Check4 Check5
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
double *Cj; //目標函數各個系數所組成的數組
double *Cb; //松弛變量系數數組
double *B; // 標準式中的常數
double *Check; //檢驗數
double **Matrix; //矩陣
int Row=0; //行數
int Column=0; //列數
int *BasicOrder;//基序列,用來表示x1,x2,x3……
double Aim=0; //目標函數值
string s;
double dd; //緩存用
char c;
ifstream Ma("Matrix.dat");
while(getline(Ma,s)) //統計行數
{
Row++;
}
Ma.close(); //關閉文件
Ma.open("Matrix.dat");
while(1) //統計列數
{
Ma>>dd;
Column++;
c=Ma.peek();
if('
'==c)
break;
}
Ma.close();
Cj=new double[Column];
Cb=new double[Row];
B=new double[Row];
Check=new double[Column];
Matrix=(double **)new double*[Row]; //為矩陣Matrix分配空間
for(int i=0;i!=Row;i++)
{
Matrix[i]=new double[Column];
}
Ma.open("Matrix.dat");
while(!Ma.eof()) //讀取矩陣
{
for(int i=0;i!=Row;i++)
{
for(int j=0;j!=Column;j++)
{
Ma>>Matrix[i][j];
}
}
}
Ma.close();
ifstream CB("Cb.dat"); //其中Cb和B的數據在同一文件中,第一行為Cb第二行為B
int temI=0;
while(!CB.eof()) //讀取Cb
{
CB>>Cb[temI]>>B[temI];
temI++;
}
CB.close();
ifstream CH("Check.dat");
while(!CH.eof()) //讀取Check
{
for(int i=0;i!=Column;i++)
{
CH>>Cj[i];
Check[i]=Cj[i];
}
}
CH.close();
//接下來是一個大while循環
while(1)
{
for(int i=0;i!=1;i++)
{
cout<<Cb[i]<<" "<<B[i]<<" "; //輸出Cb和B
for(int j=0;j!=Column;j++)
{
cout<<Matrix[i][j]<<" ";//輸出矩陣Matrix
}
cout<<endl;
}
int MaxCheck; //最大檢驗數所在的列數
double TemMin; //緩存最小值
double *TemArray;
int TemI; //確定需要換出的基所在的行數
TemArray=new double[Row];
MaxCheck=0; //默認最大檢驗數為第一個檢驗數
TemI=0; //緩存最小值所在的行
for(int i=0;i!=Column;i++) //
{
if(Check[MaxCheck]<Check[i])
{
MaxCheck=i;
}
}
if(Check[MaxCheck]>0) //如果檢驗數的最大值大于0則進行換出基操作
{
for(int j=0;j!=Row;j++) //計算除法所得的值
{
if(Matrix[j][MaxCheck]==0) //如果除數為0
{
TemArray[j]=10000; //代表無窮大
}
else
{
TemArray[j]=B[j]/Matrix[j][MaxCheck];
}
}
TemMin=TemArray[0];
for(int j=1;j!=Row;j++) //找出最小值
{
if(TemMin>TemArray[j])
{
TemMin=TemArray[j];
TemI=j;
}
}
Cb[TemI]=Cj[MaxCheck]; //將Cb中的值更換
double TemElem=Matrix[TemI][MaxCheck]; //將定位好的值緩存
for(int j=0;j!=Column;j++) //將此行中的對應換入基的數變為1,并對相應的值更改
{
Matrix[TemI][j]/=TemElem;
}
B[TemI]/=TemElem; //將B中的元素更改
for(int j=0;j!=Row;j++) //將Matrix中的定位的值的上下方的元素變為0
{
if(j!=TemI) //將變為1的數字所在的行排除
{
TemElem=-Matrix[j][MaxCheck]; //1的上面的值要想變為0,則它的值加上它的相反數
for(int k=0;k!=Column;k++)
{
Matrix[j][k]+=Matrix[TemI][k]*TemElem; //更改當前行的元素
}
B[j]+=B[TemI]*TemElem; //更改當前行的B元素
}
}
double TemCheck=-Check[MaxCheck]; //檢驗數也要改
for(int j=0;j!=Column;j++)
{
Check[j]+=Matrix[TemI][j]*TemCheck; //更改檢驗和
}
}
else
{
for(int i=0;i!=Row;i++)
{
Aim+=Cb[i]*B[i];
}
for(int i=0;i!=Row;i++)
{
cout<<Cb[i]<<" "<<B[i]<<" "; //輸出Cb和B
for(int j=0;j!=Column;j++)
{
cout<<Matrix[i][j]<<" ";//輸出矩陣Matrix
}
cout<<endl;
}
for(int i=0;i!=Column;i++)
{
cout<<Check[i]<<" "; //輸出檢驗數
}
cout<<endl;
cout<<"目標函數值為"<<Aim<<endl;
break;
}
}
system("pause");
return 0;
}
總結
以上是生活随笔為你收集整理的C++解决单纯形表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。