最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

单纯形法的C++实现

IT圈 admin 34浏览 0评论

2024年2月19日发(作者:浮涵梅)

/*本程序是利用单纯型法来求解线性规划问题

输入数据从文本中读入,按照如下的格式:

例如:需要求解如下的线性规划问题

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

所需数据从中读取

*/

#include

#include

#include

#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<<" linshi="<

}

double ta=MuBiao[i]-linshi;

JianYanShu[i]=ta;

if(JianYanShu[h]

{

h=i;

}

}

JianYanShu[0]=h;

//for(int w=1;w<6;w++)cout<<"检验数:"<

//cout<<"最大检验数坐标:"<

}

bool DanChun::PanDuan()

{

if(MaxMin=="max")

{

for(int i=1;i<=BianLian+FangCheng;i++)

{

if(JianYanShu[i]>0) return 1;

}

}

else if(MaxMin=="min")

{

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<

for(int j=1;j<=BianLian+1+FangCheng;j++)

cout<

cout<

}

cout<<"输出检验数:"<

for(i=1;i<=FangCheng+BianLian;i++)

{

cout<

}

cout<

}

void DanChun::setXiShu()

{

TheTa[0]=9999.0;

int kk=0;

int j = JianYanShu[0] , i;//确定换位的坐标

for(int k=1;k<=FangCheng;k++)

{

if(XiShu[k][ (int)JianYanShu[0] ] != 0)

{

TheTa[k] = XiShu[k][(int)(BianLian+FangCheng+1)]

XiShu[k][ (int)(JianYanShu[0]) ];

if((TheTa[0] > TheTa[k]) && TheTa[k] > 0)

{

/

TheTa[0] = TheTa[k];

kk=k;

}

}

//

}//得到TheTa值

i = kk;//i=3,j=2

CB[i]=MuBiao[j];

XB[i]=j;

//cout<<"TheTa[0]="<

//cout<<"得到换处的数据XiShu["<

for(int x=1;x<=FangCheng;x++)

{

if(x!=i)

{

double chushu = (-XiShu[x][j])

(XiShu[i][j]);//cout<<"chushu="<

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<

}

cout<<")t"<

/

}

int main()

{

int x,y;//变量个数和约束条件个数

string str;//求max?min?

while(in>>x>>y>>str)

{

DanChun danchun(x,y,str);

();

nYanShu();

y();

while(n())

{

hu();

nYanShu();

y();

}

();

e();

}

return 0;

}

2024年2月19日发(作者:浮涵梅)

/*本程序是利用单纯型法来求解线性规划问题

输入数据从文本中读入,按照如下的格式:

例如:需要求解如下的线性规划问题

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

所需数据从中读取

*/

#include

#include

#include

#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<<" linshi="<

}

double ta=MuBiao[i]-linshi;

JianYanShu[i]=ta;

if(JianYanShu[h]

{

h=i;

}

}

JianYanShu[0]=h;

//for(int w=1;w<6;w++)cout<<"检验数:"<

//cout<<"最大检验数坐标:"<

}

bool DanChun::PanDuan()

{

if(MaxMin=="max")

{

for(int i=1;i<=BianLian+FangCheng;i++)

{

if(JianYanShu[i]>0) return 1;

}

}

else if(MaxMin=="min")

{

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<

for(int j=1;j<=BianLian+1+FangCheng;j++)

cout<

cout<

}

cout<<"输出检验数:"<

for(i=1;i<=FangCheng+BianLian;i++)

{

cout<

}

cout<

}

void DanChun::setXiShu()

{

TheTa[0]=9999.0;

int kk=0;

int j = JianYanShu[0] , i;//确定换位的坐标

for(int k=1;k<=FangCheng;k++)

{

if(XiShu[k][ (int)JianYanShu[0] ] != 0)

{

TheTa[k] = XiShu[k][(int)(BianLian+FangCheng+1)]

XiShu[k][ (int)(JianYanShu[0]) ];

if((TheTa[0] > TheTa[k]) && TheTa[k] > 0)

{

/

TheTa[0] = TheTa[k];

kk=k;

}

}

//

}//得到TheTa值

i = kk;//i=3,j=2

CB[i]=MuBiao[j];

XB[i]=j;

//cout<<"TheTa[0]="<

//cout<<"得到换处的数据XiShu["<

for(int x=1;x<=FangCheng;x++)

{

if(x!=i)

{

double chushu = (-XiShu[x][j])

(XiShu[i][j]);//cout<<"chushu="<

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<

}

cout<<")t"<

/

}

int main()

{

int x,y;//变量个数和约束条件个数

string str;//求max?min?

while(in>>x>>y>>str)

{

DanChun danchun(x,y,str);

();

nYanShu();

y();

while(n())

{

hu();

nYanShu();

y();

}

();

e();

}

return 0;

}

发布评论

评论列表 (0)

  1. 暂无评论