1、运筹单纯型算法 运筹学实验报告 题目:用单纯形法求解线性规划问题姓 名 王赛赛 学 号 2012436138 年级专业 12数电类2 指导教师 苏珂 2013年11月15日一、 实验目的:运用MATLAB科学计算软件完成单纯型算法求解线性规划问题。二、 实验内容:编写一个MATLAB的函数文件:matrix.m,用于求解标准型的线性规划问题: Ax=bmin f=c*x subject to x01.函数调用基本形式:x,minf,optmatrx,flag=matrix(A,c,b)2.参数介绍: Ax=bA:线性规划问题的约束 中各变量的系数组成的矩阵,是一个mn的矩阵。 x0c:线性规划
2、问题的目标函数f= c*x中各变量的系数变量,是一个n维的行向量。 Ax=bb:线性规划问题的约束 中的常数向量,是一个mn维德列向量。 x0X:输出线性规划问题的最优解,当线性规划问题没有可行解或者有可行解但没有优解X=。minf:输出线性规划问题的最优解,当线性规划问题没有可行解minf,当线性规划问题有可行解但没有最优解时minf=-inf。optmartx:输出最优解对应的单纯型表,当线性规划问题没有可行解或者有可行解但没有最优解时optmartx=。flag:相性规划问题的求解结果标志值,当线性规划问题有最优解时flag=1,当线性规划问题有可行解但没有最优解时flag=0,当线性规
3、划问题没有可行解时flag=-1.三、 MATLAB函数linprog的使用Function x,fval,exitflag,output,lambda=linprog(f,A,B,Aeq,Beq,lb,ub,x0,options)这个函数的功能是解决线性规划问题,它可以有变化的函数传递个数,函数内部根据传值的多少进行不同的功能操作。一、函数的传值1、X = LINPROG(f,A,b) 试图解决线性问题:求出f*x的最小值,且fx服从A*x=b,其中x为自变量2、X = LINPROG(f,A,b,Aeq,beq)解决满足添加约束等式:Aeq*x = beq的上述问题3、X = LINPRO
4、G(f,A,b,Aeq,beq,LB,UB)在以上的条件加下,与此同时定义了自变量的上下线,LB = X 0); % 寻找g1中大于零的数值列数存于dicide数组中while isempty(decide) %当存在大于零的值时 i=decide(1); %当列数赋给itext=find(A(1:m,i)0); %text存放该列中所有数值大于零的行数 if isempty(text) %当没有大于零的数值时无解 flag=0; break; end min=inf; for i1=1:m %当该列存在大于零的数值时 if A(i1,i)0&A(i1,s1)/A(i1,i)0); %再进行查
5、找end %* if g1(1,s1)0 %此时对应的为无解情况 flag=-1;end %*判断人工变量* if g1(1,s1)=0 g1(1,:)=; for i6=1:m A(:,n+1)=; end for i6=1:m c(n+1)=; end decide=find(A1(1:m,1)n); %查找是否有人工变量 if isempty(decide) %存在人工变量 while isempty(decide) x1=decide(1); %存放的是人工变量的行数 text=find(A(x1,1:n)=0); %该行的所有元素都不为零的列坐标 if isempty(text) %
6、都为零,则该行为多余的行,删除 decide(1)=; A1(x1,:)=; A(x1,:)=; m=m-1; else i=text(1); %i保存的是列数 A(x1,:)=A(x1,:)/A(x1,i); A1(x1,1)=i; c(1,:)=c(1,:)+(-1*c(1,i)*A(x1,:); for i1=1:m if i1=x1 A(i1,:)=A(i1,:)+(-1*A(i1,i)*A(x1,:); end end decide(1)=; text(1)=; end end end %*第二阶段* decide=find(c(1,1:n)0); %查找检验向量是否存在大于零的数,
7、将列数保存 while isempty(decide) i=decide(1); %将列数赋给i text=find(A(:,i)0); %保存大于零的项的行数 if isempty(text) %为空的时候,则无解 disp(有可行解但没有最优解) flag=0 c=c;A; optmatrx=c; x=zeros(n,1); for o=1:n for o1=1:m if o=A1(o1,1) x(o,1)=A(o1,n+1); end end end minf=-inf optmatrx x return; end min=inf; for i1=1:m if A(i1,i)0&A(i1
8、,n+1)/A(i1,i)0); end %*结果赋值结算*%* c=c;A;optmatrx=c;x=zeros(n,1); for o=1:n for o1=1:m if o=A1(o1,1) x(o,1)=A(o1,n+1); end endendminf=c(1,n+1);flag=1 ;end switch flag case 1 %有可行解 disp(输出最优解对应的单纯形表) optmatrx disp(输出最优解) x disp(输出线性规划问题的最优值 ) minf case 0 %有可行解但没有最优值 disp(输出可行解对应的单纯形表 ) optmatrx disp(输出
9、可行解 ) x disp(输出线性规划问题的最优值 ) minf case -1 %没有可行解 disp(没有可行解) disp(输出最优解对应的单纯形表 ) optmatrx= disp(输出最优解 ) x= disp(输出线性规划问题的最优值 ) minf=-inf end五、 例题求解 例题1(有最优解)题目:min z=4x1 + 3x3 s.t. 1/2x1 + x2 + 1/2x3 2/3x4= 2 3/2x1 + 1/2x3 = 3 3x1 - 6x2 + 4x4 = 0 xj 0, j = 1,4输入及函数的调用:测试结果:经过测试当线性规划问题存在最优解时,程序运行没有问题。
10、例题2(有可行解但无最优解)题目:min z=-2x1 - 5x2 s.t. -1x1 + x3 = 4 x2 + x4 = 3 -x1 + 2x2 + x5 = 8 xj 0, j = 1,5输入及函数的调用:测试结果:经过测试当线性规划问题有可行解但无最优解时,程序运行没有问题。例题3(没有可行解)题目: min z=2x1 + 2x2 s.t. -1x1 + x2 - x3 = 1 -x1 - x2 - x4 =2 xj 0, j = 1,4输入及函数的调用:测试结果:经过测试当线性规划问题没有可行解时,程序运行没有问题。 linpa请输入约束中的系数矩阵 A=1 0 0 0 0 1 -
11、1 0 0 0 0 0;1 1 0 0 0 0 0 -1 0 0 0 0;0 1 1 0 0 0 0 0 -1 0 0 0;0 0 1 1 0 0 0 0 0 -1 0 0;0 0 0 1 1 0 0 0 0 0 -1 0;0 0 0 0 1 1 0 0 0 0 0 -1A = Columns 1 through 11 1 0 0 0 0 1 -1 0 0 0 0 1 1 0 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 Co
12、lumn 12 0 0 0 0 0 -1请输入约束中的常数向量 b=10 15 25 20 18 12b = 10 15 25 20 18 12请输入目标函数中的系数向量 c=1 1 1 1 1 1 0 0 0 0 0 0c = Columns 1 through 11 1 1 1 1 1 1 0 0 0 0 0 Column 12 0i = 1j = 12i = 1j = 6b = 10 15 25 20 18 12输入的约束中的常数向量b为单行矩阵,已将其转化为单列矩阵b = 10 15 25 20 18 12c = Columns 1 through 11 -1 -1 -1 -1 -1
13、-1 0 0 0 0 0 Column 12 0输出最优解对应的单纯形表optmatrx = Columns 1 through 11 0 0 0 0 0 0 -1 0 -1 0 -1 1 0 0 0 0 1 -1 0 0 0 0 0 1 0 0 0 -1 0 0 -1 1 -1 0 0 1 0 0 1 0 0 0 -1 1 0 0 0 1 0 -1 0 0 0 0 -1 0 0 0 0 0 0 -1 1 -1 1 -1 0 0 0 0 1 1 0 0 0 0 0 Columns 12 through 13 0 53 0 10 1 11 -1 14 1 6 1 6 -1 12输出最优解x = 10 11 14 6 12 0 0 6 0 0 0 0输出线性规划问题的最优值 minf = 53ans = 10 11 14 6 12 0 0 6 0 0 0 0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1