/*本程序是利用单纯型法来求解线性规划问题
输入数据从文本中读入,按照如下的格式:
例如:需要求解如下的线性规划问题 max z = 2*x1 + 3*x2; 约束条件是: x1 + x2<=8; 4*x1 <=16; 4*x2<=12; x1,x2>=0;
则文件中的输入格式是:
2 3 未知数个数 约束条件个数 max 2 3
1 1 < 8 这里小于符号默认为小于等于, 4 0 < 16 注意为零的系数不能省略 0 4 < 12
所需数据从aa.txt中读取 */
#include
using namespace std;
ifstream in(\
class DanChun {
private: double MuBiao[100];//目标函数 double XiShu[100][100];//系数矩阵,最后一列是常数项 double JianYanShu[100];//检验数,第一个数是最大(或最小)检验数的坐标 double TheTa[100];//theta double CB[100];// int XB[100];// double Jie[100];//解 int BianLian;//变量个数 int FangCheng;//方程(约束条件)个数 string MaxMin;//求的是最大值还是最小值? public:
DanChun(int BL,int FC,string MaxOrMin); void Init(); void GetJianYanShu(); bool PanDuan(); void Display(); void setXiShu(); void setJie(); void playJie(); };
DanChun::DanChun(int BL,int FC,string MaxOrMin) { BianLian = BL; FangCheng = FC; MaxMin = MaxOrMin; int i,j; TheTa[0] = 9999.0; for(i=0;i<100;i++) { MuBiao[i]=0; JianYanShu[i]=0;// TheTa[i]=0;// CB[i]=0;// XB[i]=0;// Jie[i]=0; for(j=0;j<100;j++)XiShu[i][j]=0; } } void DanChun::Init() { for(int k=1;k<=BianLian;k++) { in>>MuBiao[k]; //XB[k]=MuBiao[k]; } for(int i=1;i<=FangCheng;i++) { char op;//操作符 for(int j=1;j<=BianLian;j++) { in>>XiShu[i][j]; } in>>op;
}
}
if(op=='<') { XiShu[i][0]=0; }
else if(op=='>') { XiShu[i][0]=1; }
int BL = BianLian + FangCheng;//加上松弛变量后的未知量个数 XiShu[i][BianLian+i] = 1;//加上单位矩阵 in>>XiShu[i][BL+1]; XB[i]=BianLian+i;
void DanChun::GetJianYanShu() { int h=-9999;//记录最大检验数的坐标 for(int i=1;i<=BianLian+FangCheng;i++) { double linshi=0; for(int j=1;j<=FangCheng;j++) { linshi += (CB[j] * XiShu[j][i]); //cout<<\ } double ta=MuBiao[i]-linshi; JianYanShu[i]=ta; if(JianYanShu[h] bool DanChun::PanDuan() { if(MaxMin==\ { for(int i=1;i<=BianLian+FangCheng;i++) { if(JianYanShu[i]>0) return 1; } } else if(MaxMin==\ { for(int i=1;i<=BianLian+FangCheng;i++) { if(JianYanShu[i]<0) return 1; } } return 0; } void DanChun::Display() { cout<<\输出系数矩阵:\ for(int i=1;i<=FangCheng;i++) { cout< / TheTa[0] = TheTa[k]; kk=k; } } // }//得到TheTa值 i = kk;//i=3,j=2 CB[i]=MuBiao[j]; XB[i]=j; //cout<<\ //cout<<\得到换处的数据XiShu[\ for(int x=1;x<=FangCheng;x++) { if(x!=i) { double chushu = (-XiShu[x][j]) (XiShu[i][j]);//cout<<\ for(int y=1;y<=FangCheng+BianLian+1;y++) { XiShu[x][y] += XiShu[i][y]*chushu; } }//end if else if(x==i) { double chushu = XiShu[i][j]; for(int y=1;y<=FangCheng+BianLian+1;y++) { XiShu[x][y] /= chushu; } } } } void DanChun::setJie() { for(int i=1;i<=FangCheng;i++)Jie[XB[i]]=XiShu[i][BianLian+FangCheng+1]; } void DanChun::playJie() { cout<<\该线性规划问题的最优解为:\ for(int i=1;i<=BianLian+FangCheng;i++) { cout< / } int main() { int x,y;//变量个数和约束条件个数 string str;//求max?min? while(in>>x>>y>>str) { DanChun danchun(x,y,str); danchun.Init(); danchun.GetJianYanShu(); danchun.Display(); while(danchun.PanDuan()) { danchun.setXiShu(); danchun.GetJianYanShu(); danchun.Display(); } danchun.setJie(); danchun.playJie(); } return 0; }