日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

C++解决单纯形表

發布時間:2023/12/19 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 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++解决单纯形表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。