使用C语言实现单纯形法求解线性规划问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
float ZB=0; /*记录目标函数值*/
(2)、定义程序中使用的函数
void input();
void print();
int danchunxing1();
int danchunxing2(int a);
void danchunxing3(int a,int b);
(3)、确定入基变量,对于所有校验数均小于等于 0,则当前解为最优解。
for(i=0;i<n;i++)
printf(" %8.2f",delta[i]);
printf("\n--------------------------------------------------------------------------\n");
}
void input()
{
int i,j; /*循环变量*/
自动化系上机实验报告(课程名称:运筹学)
学生姓名:
学号:
上
机
实Baidu Nhomakorabea
验
报
告
班级:自动化班
专业/方向:自动化
姓名:
实验成绩
学号:
(10 分制)
上机实验名称:使用 C 语言实现单纯形法求解线性规划问题
上机时间:2015 年 5 月 20 日
上机地点:信自 234
一、实验目的和要求
1、目的:
掌握单纯形算法的计算步骤,并能熟练使用该方法求解线性规划问题。
else {flag=0;break;}
if(flag==1)
return -1;
for(i=0;i<n;i++){
if(max <delta[i])
{ max =delta[i];k=i;}
}
return k;
}
(4)、确定出基变量,如果某个大于 0 的校验数,对应的列向量中所有元素小于等于 0,则线性规
(2)、输入初始基变量的数字代码 num 矩阵
(3)、输入方程组右边的值矩阵 b
(4)、输入目标函数各个变量的系数所构成的系数阵 C
输出:
(1)、输出是否为最优解
(2)、输出最优解为多少
3、使用所编程序求解如下 LP 问题并给出结果。
学号:
4/23/2021 7:33:32 AM
第 11 页 共 14 页
j
0}确定 xk 进基;
②由 xk
min { bi i aik
| aik
0}
bl alk
确定 xl 出基,其中 alk 称为主元素;
③利用初等变换将 alk 化为 1,并利用 alk 将同列中其它元素化为 0,得新解 X(1)。
(5)返回(3),直至求得最优解为止。
(2)、程序图
4/23/2021 7:33:32 AM
for(i=0;i<m;i++)
{
if(i!=c)
if(A[i][l]!=0)
{
temp2=A[i][l];
b[i]=b[i]-b[c]*temp2;
for(j=0;j<n;j++)
A[i][j]=A[i][j]-A[c][j]*temp2;
}
}
temp3=delta[l];
for(i=0;i<n;i++)
了解算法程序实现的过程和方法。
2、要求:
使用熟悉的编程语言编制单纯形算法的程序。
独立编程,完成实验,撰写实验报告并总结。
二、实验内容和结果
1、单纯形算法的步骤及程序流程图。
(1)、算法步骤
4/23/2021 7:33:32 AM
第 1 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
学生姓名:
ZB=ZB+x[i]*C[i];
}
printf("ZB=%.2f",ZB);
break;
}
print();
p=danchunxing2(q);
printf("\np=%d,q=%d",p,q);
if(q==-1) break;
danchunxing3(p,q);
}}
输入:
(1)、输入方程组的系数矩阵 A(3 行 5 列)
/*用于存储常约束条件中的常数*/
float CB[m]; /*用于存储基变量的系数*/
float seta[m]; /*存放出基与入基的变化情况*/
float delta[n]; /*存储检验数矩阵*/
float x[n];
/*存储决策变量*/
int num[m]; /*用于存放出基与进基变量的情况*/
printf(" \tCB\tXB\tb\t");
for(i=0;i<n;i++)
printf(" X(%d)\t",i+1);
for(i=0;i<n;i++)
x[i]=0;
printf("\n");
while(1)
{
q=danchunxing1();
if(q==-1)
{
print();
printf("\n 所得解已经是最优解!\n");
printf("\n 请输入初始基变量的数字代码 num 矩阵:\n");
for(i=0;i<m;i++)
scanf("%d",&num[i]);
printf("\n 请输入方程组右边的值矩阵 b:\n");
for(i=0;i<m;i++)
scanf("%f",&b[i]);
printf("\n 请输入目标函数各个变量的系数所构成的系数阵 C:\n");
(1)将线性规划化为标准形。
学生姓名:
学号:
(2)用最快的方法确定一个初始基本可行解 X(0)。当 s·t 均为“≤”形式时,以松驰变
量做初始基本变量最快。
(3)求 X(0)中非基本变量 xj 的检验数σj。若 j 0 ,则停止运算,X(0)=X*(表示最
优解),否则转下一步。
(4)①由 k
max{ j
{
if(min>=seta[i])
{min=seta[i];j=i;}
}
num[j]=k+1;
CB[j]=C[k];
return j;
}
(5)、迭代运算,计算新的单纯形表。
void danchunxing3(int p,int q)
{
int i,j,c,l;
float temp1,temp2,temp3;
delta[i]=delta[i]-A[c][i]*temp3;
}
(6)、输入函数,输入方程组的系数矩阵、初始基变量的数字代码、方程组右边的值矩阵、目标函
数各个变量的系数所构成的系数阵。
4/23/2021 7:33:32 AM
第 7 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
void print()
x1=31.020 x2=31.060 x3=01.050 x4=4.00 x5=0.00 ZB=15.00
序 运 行 结 果 输 出:
请输入目标函数各个变量的系数所构成的系数阵 C:
2
3 请输入0方程组的0系数矩阵0A(3 行 5 列):
--------------1---------0----------0-.-5-------0-----------0-.-2--------------------
划问题无解。
int danchunxing2(int a)
{
int i,k,j;
int flag=0;
float min;
k=a;
for(i=0;i<m;i++)
if(A[i][k]<=0)
flag=1;
else {flag=0;break;}
4/23/2021 7:33:32 AM
第 5 页 共 14 页
学生姓名:
学号:
{
int i,j=0;
printf("\n--------------------------------------------------------------------------\n");
for(i=0;i<m;i++)
{
printf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);
CB 0 XB 0 b -2 X(11) X(02.)8 X(3) X(4) X(5)
--------------0---------1----------0---------0---------0--.2---------------------
4/23/2021 7:33:32 AM
第 9 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
input();
学生姓名:
学号:
printf("\n--------------------------------------------------------------------------\n");
请输入初始基变量的数字代码 num 矩阵: 0.00 0.00 -1.00 0.00 -0.20
所得解3 已经是最4 优解! 5 --------------------------------------------------------------------------
最优解请为输:入方程组右边的值矩阵 b:
for(i=0;i<n;i++)
scanf("%f",&C[i]);
for(i=0;i<n;i++)
delta[i]=C[i];
for(i=0;i<m;i++)
{
k=num[i]-1;
CB[i]=C[k];
}}
(7)、主函数,调用前面定义的函数。
main()
{
int i,j=0;
int p,q,temp;
int k;
printf("请输入方程组的系数矩阵 A(%d 行%d 列):\n",m,n);
for(i=0;i<m;i++)
4/23/2021 7:33:32 AM
第 8 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
for(j=0;j<n;j++)
学生姓名:
学号:
scanf("%f",&A[i][j]);
int danchunxing1()
{
int i,k=0;
int flag=0;
float max=0;
for(i=0;i<n;i++)
4/23/2021 7:33:32 AM
第 4 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
if(delta[i]<=0)
学生姓名:
学号:
flag=1;
4/23/2021 7:33:32 AM
学号: 第 6 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
c=p;/*行号*/
学生姓名:
学号:
l=q;/*列号*/
temp1=A[c][l];
b[c]=b[c]/temp1;
for(j=0;j<n;j++)
A[c][j]=A[c][j]/temp1;
for(j=0;j<n;j++)
printf("%8.2f ",A[i][j]);
printf("\n");
}
printf("\n--------------------------------------------------------------------------\n");
printf("\t\t\t");
第 2 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
学生姓名:
找出初始基可行
解列出初始单纯
形表 计算校验数
学号:
计算新的单纯形 表
所有δ j<=0?
对于某个δ j>0,是否存在 Pj<=0 确定为入基变量
确定出基变量
已得最优解,结 束
无最优解,结 束
2、单纯形算法程序的规格说明 各段代码功能描述: (1)、定义程序中使用的变量 #include<stdio.h> #include<math.h> #define m 3 /*定义约束条件方程组的个数*/ #define n 5 /*定义未知量的个数*/
4/23/2021 7:33:32 AM
第 3 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
float M=1000000.0;
学生姓名:
学号:
float A[m][n]; /*用于记录方程组的数目和系数;*/
float C[n];
/*用于存储目标函数中各个变量的系数*/
float b[m];
自动化系上机实验报告(课程名称:运筹学)
P26
学生姓名:
学号:
例5
程 请输入方程组的系数矩阵 A(3 行 5 列):
序
运2
2
1
0
0
行
结4
0
0
1
0
果
0
5
0
0
1
--------------------------------------------------------------------------
printf("\n 最优解为:\n");
for(j=0;j<m;j++)
{
temp=num[j]-1;
x[temp]=b[j];
}
for(i=0;i<n;i++)
{
4/23/2021 7:33:32 AM
第 10 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
printf("x%d=%.2f ",i+1,x[i]);
自动化系上机实验报告(课程名称:运筹学)
if(flag==1)
学生姓名:
{printf("\n 该线性规划无最优解!\n"); return -1;}
for(i=0;i<m;i++)
{
if(A[i][k]>0)
seta[i]=b[i]/A[i][k];
else seta[i]=M;
}
min=M;
for(i=0;i<m;i++)