使用C语言实现单纯形法求解线性规划问题Word文件下载.docx

上传人:b****3 文档编号:14497679 上传时间:2022-10-23 格式:DOCX 页数:14 大小:74.44KB
下载 相关 举报
使用C语言实现单纯形法求解线性规划问题Word文件下载.docx_第1页
第1页 / 共14页
使用C语言实现单纯形法求解线性规划问题Word文件下载.docx_第2页
第2页 / 共14页
使用C语言实现单纯形法求解线性规划问题Word文件下载.docx_第3页
第3页 / 共14页
使用C语言实现单纯形法求解线性规划问题Word文件下载.docx_第4页
第4页 / 共14页
使用C语言实现单纯形法求解线性规划问题Word文件下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

使用C语言实现单纯形法求解线性规划问题Word文件下载.docx

《使用C语言实现单纯形法求解线性规划问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《使用C语言实现单纯形法求解线性规划问题Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。

使用C语言实现单纯形法求解线性规划问题Word文件下载.docx

1、单纯形算法的步骤及程序流程图。

(1)、算法步骤

(1)将线性规划化为标准形。

(2)用最快的方法确定一个初始基本可行解X(0)。

当s·

t均为“≤”形式时,以松驰变量做初始基本变量最快。

(3)求X(0)中非基本变量xj的检验数σj。

若,则停止运算,X(0)=X*(表示最优解),否则转下一步。

(4)①由确定xk进基;

②由确定xl出基,其中alk称为主元素;

③利用初等变换将alk化为1,并利用alk将同列中其它元素化为0,得新解X

(1)。

(5)返回(3),直至求得最优解为止。

(2)、程序图

2、单纯形算法程序的规格说明

各段代码功能描述:

(1)、定义程序中使用的变量

#include<

stdio.h>

math.h>

#definem3/*定义约束条件方程组的个数*/

#definen5/*定义未知量的个数*/

floatM=1000000.0;

floatA[m][n];

/*用于记录方程组的数目和系数;

*/

floatC[n];

/*用于存储目标函数中各个变量的系数*/

floatb[m];

/*用于存储常约束条件中的常数*/

floatCB[m];

/*用于存储基变量的系数*/

floatseta[m];

/*存放出基与入基的变化情况*/

floatdelta[n];

/*存储检验数矩阵*/

floatx[n];

/*存储决策变量*/

intnum[m];

/*用于存放出基与进基变量的情况*/

floatZB=0;

/*记录目标函数值*/

(2)、定义程序中使用的函数

voidinput();

voidprint();

intdanchunxing1();

intdanchunxing2(inta);

voiddanchunxing3(inta,intb);

(3)、确定入基变量,对于所有校验数均小于等于0,则当前解为最优解。

intdanchunxing1()

{

inti,k=0;

intflag=0;

floatmax=0;

for(i=0;

i<

n;

i++)

if(delta[i]<

=0)

flag=1;

else{flag=0;

break;

}

if(flag==1)

return-1;

i++){

if(max<

delta[i])

{max=delta[i];

k=i;

returnk;

(4)、确定出基变量,如果某个大于0的校验数,对应的列向量中所有元素小于等于0,则线性规划问题无解。

intdanchunxing2(inta)

inti,k,j;

floatmin;

k=a;

m;

if(A[i][k]<

{printf("

\n该线性规划无最优解!

\n"

);

return-1;

if(A[i][k]>

0)

seta[i]=b[i]/A[i][k];

elseseta[i]=M;

min=M;

if(min>

=seta[i])

{min=seta[i];

j=i;

num[j]=k+1;

CB[j]=C[k];

returnj;

(5)、迭代运算,计算新的单纯形表。

voiddanchunxing3(intp,intq)

inti,j,c,l;

floattemp1,temp2,temp3;

c=p;

/*行号*/

l=q;

/*列号*/

temp1=A[c][l];

b[c]=b[c]/temp1;

for(j=0;

j<

j++)

A[c][j]=A[c][j]/temp1;

if(i!

=c)

if(A[i][l]!

{

temp2=A[i][l];

b[i]=b[i]-b[c]*temp2;

for(j=0;

A[i][j]=A[i][j]-A[c][j]*temp2;

}

temp3=delta[l];

delta[i]=delta[i]-A[c][i]*temp3;

(6)、输入函数,输入方程组的系数矩阵、初始基变量的数字代码、方程组右边的值矩阵、目标函数各个变量的系数所构成的系数阵。

voidprint()

inti,j=0;

printf("

\n--------------------------------------------------------------------------\n"

printf("

%8.2f\tX(%d)%8.2f"

CB[i],num[i],b[i]);

%8.2f"

A[i][j]);

\t\t\t"

%8.2f"

delta[i]);

voidinput()

inti,j;

/*循环变量*/

intk;

请输入方程组的系数矩阵A(%d行%d列):

m,n);

scanf("

%f"

&

A[i][j]);

\n请输入初始基变量的数字代码num矩阵:

%d"

num[i]);

\n请输入方程组右边的值矩阵b:

b[i]);

\n请输入目标函数各个变量的系数所构成的系数阵C:

C[i]);

delta[i]=C[i];

k=num[i]-1;

CB[i]=C[k];

}}

(7)、主函数,调用前面定义的函数。

main()

intp,q,temp;

input();

\tCB\tXB\tb\t"

X(%d)\t"

i+1);

x[i]=0;

while

(1)

q=danchunxing1();

if(q==-1)

print();

\n所得解已经是最优解!

\n最优解为:

temp=num[j]-1;

x[temp]=b[j];

for(i=0;

x%d=%.2f"

i+1,x[i]);

ZB=ZB+x[i]*C[i];

ZB=%.2f"

ZB);

break;

p=danchunxing2(q);

\np=%d,q=%d"

p,q);

if(q==-1)break;

danchunxing3(p,q);

输入:

(1)、输入方程组的系数矩阵A(3行5列)

(2)、输入初始基变量的数字代码num矩阵

(3)、输入方程组右边的值矩阵b

(4)、输入目标函数各个变量的系数所构成的系数阵C

输出:

(1)、输出是否为最优解

(2)、输出最优解为多少

3、使用所编程序求解如下LP问题并给出结果。

请输入方程组的系数矩阵A(3行5列):

22100

40010

05001

请输入初始基变量的数字代码num矩阵:

345

请输入方程组右边的值矩阵b:

121615

请输入目标函数各个变量的系数所构成的系数阵C:

23000

--------------------------------------------------------------------------

CBXBbX

(1)X

(2)X(3)X(4)X(5)

0.00X(3)12.002.002.001.000.000.00

0.00X(4)16.004.000.000.001.000.00

0.00X(5)15.000.005.000.000.001.00

2.003.000.000.000.00

p=2,q=1

0.00X(3)6.002.000.001.000.00-0.40

3.00X

(2)3.000.001.000.000.000.20

2.000.000.000.00-0.60

---------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1