单纯形法MATLAB程序(线性与非线性规划大作业)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第 4 页
wenku.baidu.com
单纯形法程序整理.txt %% 子程序-迭代 function [ TableK,BK ] = SubFc_DieDai( TableK,BK,h,l ) %迭代一步 % 给出上一步得到的TableK,和这一步的主元位置BK,得到这一步的TableK和下一步的BK %% 初等行变换 将主元对应列化成单位列向量 [TableK]=SubFc_ChuDengHangBianHuan(TableK,BK); disp('当前标准性表:'); disp(TableK); %检查判别数是否全为正 t=0; for i=1:l if(TableK(h+1,i)<=t) t=TableK(h+1,i);%记录判别数最小值 s=i;%记录下标 end end if(t==0) return; end % TableK=function[Table,B]; % TableK=Table; %% 选主元素 [r,s]= SubFc_XuanZhuYuan(TableK,h,l); disp('更换主元位置:行/列'); disp([r,s]); %% 更换主元 BK(r,:)=[r,s];%更换主元 end
单纯形法程序整理.txt for i=1:h%判断有无相等的最小值及最小值的重数 if(TableK(i,l+1)/TableK(i,s)==t) R(k)=i;%记录下标 k=k+1; end end %移动比较列 flag=0;%标记跳出循环位置,判断标记跳出多重循环 for j=1:l if(k>2)%有两个及以上最小值时,移动分子的列位 k=k-1; for i=1:k%检查比值是否为负 if(TableK(R(i),j)/TableK(R(i),s)>=0) t=TableK(R(i),j)/TableK(R(i),s); break; end if(i==k)%若比值全为负,则寻找下一列 flag=1; break; end end if(j==6) asdfa=1; end if(flag==1)%判断是否需要移动列位 flag=0;%重置标记 k=k+1;%恢复k continue; end for i=1:k if(TableK(R(i),j)/TableK(R(i),s)<0)%排除负元素 continue; end if(TableK(R(i),j)/TableK(R(i),s)<=t) t=TableK(R(i),j)/TableK(R(i),s);%记录判别数最小值 r=i;%记录下标 end end end k=1; for i=1:h%判断有无相等的最小值及最小值的重数 if(TableK(i,s)==0) continue;%跳过为0的项 end if(TableK(i,j)/TableK(i,s)==t) R(k)=i;%记录下标 k=k+1; end end if(k==2)%若已无重复最小值,退出循环 break; end end end %————————————————% 第 3 页
单纯形法程序整理.txt [hB,lB]=size(B);%测算B的行、列数 for j=1:hB if(A(B(j,1),B(j,2))~=1)%如果主元不为1,将对应行除以主元化为1 A(B(j,1),:)=A(B(j,1),:)/A(B(j,1),B(j,2)); end for i=1:hA%将其他元化为零 if(i==B(j,1)) continue; end A(i,:)=A(i,:)-A(B(j,1),:)*A(i,B(j,2)); end end end %————————————————% %% 子程序-选主元 function [r,s]=SubFc_XuanZhuYuan(TableK,h,l) %选主元素 % 选出表矩阵TableK中的主元素 %% 选列主元 t=0; for i=1:l if(TableK(h+1,i)<=t) t=TableK(h+1,i);%记录判别数最小值 s=i;%记录下标 end end if(t==0) error('判别数全为正'); end %% 选行主元 for i=1:h%检查元素是否为负,并赋予t初值 if(TableK(i,s)>0) t=TableK(i,l+1)/TableK(i,s); break; end if(i==h)%若元素全为负,则报错 error('主列元素全为非正,规划问题有无界解!'); end end %k=1; for i=1:h %若未知数出现负值,则是初始迭代标准性表产生的,应更换初始主元; if(TableK(i,l+1)<0) error('b向量出现负值,更换初始主元'); end if(TableK(i,s)<=0)%排除A表负元素 continue; end if(TableK(i,l+1)/TableK(i,s)<=t) t=TableK(i,l+1)/TableK(i,s);%记录判别数最小值 r=i;%记录下标 end end %补充判据 k=1; 第 2 页
单纯形法程序整理.txt %% 单纯形法 %% 主程序 %————————————————% %% 单纯形法 % 求解线性规划问题 % 编程:范中允 %% 标准矩阵A % 输入标准形式的约束条件系数矩阵A、右端列向量b、约束条件未知数对应目标函数的系数 c; % 有需要可以指定迭代的初始单位阵(一组基本可行解); A=[1,1,2,1,0; 1,4,-1,0,1; ]; c=[-2,-1,1,0,0]; b=[6;4]; Table=[A,b;c,0];%初始表 [h,l]=size(A); %% 给出初始基本主元 B=[1,1;2,4]; BK=B; TableK=Table; %% 迭代 for j=1:100 [TableK,BK]=SubFc_DieDai(TableK,BK,h,l); t=0; disp(['第',num2str(j),'次迭代']); for i=1:l if(TableK(h+1,i)<=t) t=TableK(h+1,i);%记录判别数最小值 s=i;%记录下标 end end if(t==0) disp('迭代结束'); break; end end if(j==100) sprintf('迭代100次未收敛'); end disp('最终的标准型表:'); disp(TableK); disp('最优解的目标函数:'); disp(-TableK(h+1,l+1)); disp('基本可行解下标:'); disp(BK(:,2)); disp('基本可行解系数:'); disp(TableK(1:h,l+1)); %————————————————% %% 子程序-初等行变换 function [ A ] = SubFc_ChuDengHangBianHuan( A,B ) %初等行变换 % 将矩阵指定的主元对应列,由初等行变换,化为主元为1其他元为0 % A为需要变换的矩阵,B为用于指定主元位置的矩阵 [hA,lA]=size(A);%测算A的行、列数 第 1 页
相关文档
最新文档