上机实验报告一、实验目的和要求1、目的:●掌握单纯形算法的计算步骤,并能熟练使用该方法求解线性规划问题。
●了解算法→程序实现的过程和方法。
2、要求:●使用熟悉的编程语言编制单纯形算法的程序。
●独立编程,完成实验,撰写实验报告并总结。
二、实验内容和结果1、单纯形算法的步骤及程序流程图。
(1)、算法步骤(2)、程序图各段代码功能描述:(1)、定义程序中使用的变量#include<stdio.h>#include<math.h>#define m 3 /*定义约束条件方程组的个数*/#define n 5 /*定义未知量的个数*/float M=1000000.0;float A[m][n]; /*用于记录方程组的数目和系数;*/float C[n]; /*用于存储目标函数中各个变量的系数*/float b[m]; /*用于存储常约束条件中的常数*/float CB[m]; /*用于存储基变量的系数*/float seta[m]; /*存放出基与入基的变化情况*/float delta[n]; /*存储检验数矩阵*/float x[n]; /*存储决策变量*/int num[m]; /*用于存放出基与进基变量的情况*/float ZB=0; /*记录目标函数值*/(2)、定义程序中使用的函数void input();void print();int danchunxing1();int danchunxing2(int a);void danchunxing3(int a,int b);(3)、确定入基变量,对于所有校验数均小于等于0,则当前解为最优解。
int danchunxing1(){int i,k=0;int flag=0;float max=0;for(i=0;i<n;i++)if(delta[i]<=0)flag=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,则线性规划问题无解。
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;}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++){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;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(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++)delta[i]=delta[i]-A[c][i]*temp3;}(6)、输入函数,输入方程组的系数矩阵、初始基变量的数字代码、方程组右边的值矩阵、目标函数各个变量的系数所构成的系数阵。
void print(){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]);for(j=0;j<n;j++)printf("%8.2f ",A[i][j]);printf("\n");}printf("\n--------------------------------------------------------------------------\n");printf("\t\t\t");for(i=0;i<n;i++)printf(" %8.2f",delta[i]);printf("\n--------------------------------------------------------------------------\n");}void input(){int i,j; /*循环变量*/int k;printf("请输入方程组的系数矩阵A(%d行%d列):\n",m,n);for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%f",&A[i][j]);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");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)、主函数,调用前面定义的函数。
{int i,j=0;int p,q,temp;input();printf("\n--------------------------------------------------------------------------\n"); 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最优解为:\n");for(j=0;j<m;j++){temp=num[j]-1;x[temp]=b[j];}for(i=0;i<n;i++){printf("x%d=%.2f ",i+1,x[i]);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列)(2)、输入初始基变量的数字代码num矩阵(3)、输入方程组右边的值矩阵b(4)、输入目标函数各个变量的系数所构成的系数阵C(1)、输出是否为最优解(2)、输出最优解为多少3、使用所编程序求解如下LP问题并给出结果。
P26 例5 程序运行结果输出:P33 例7程序运行结果输出:P34例8程序运行结果输出:P35 例9 程序运行结果自动化系上机实验报告(课程名称:运筹学)学生姓名:学号:输出:三、实验总结通过使用C语言实现单纯形法求解线性规划问题和用matlab优化工具箱求解LP问题,使得问题的求解更加简单和容易,而且也更加快速的求解问题,我们也对这两种方法有了更深刻的了解。
4/26/2022 12:49:07 AM 第11 页共11 页。