利用单纯形求解一般线性规划问题概述.doc

利用单纯形求解一般线性规划问题概述.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
利用单纯形算法求解一般的线性规划问题 一:实验目的 掌握利用单纯形算法求解一般线性规划问题的步骤。并能够利用matlab编写程序,求解一般的线性规划问题。掌握matlab的使用技巧。 二:实验内容 利用matlab编写程序,求解下面线性规划的实际问题: 某商场决定,营业员每周连续工作5天后连续休息2天,轮流休息,据统计,商场每天需要的营业员如下: 星期一:300人 星期二:300人 星期三:350人 星期四:400人 星期五:480人 星期六:600人 星期日:550人 问题:(1)商场的人力资源部应如何安排每天的上班人数,使商场总的营业员最少? 若商场雇佣临时工,上班时间同正式工。若正式工工资每天80元,临时工每天100元,问商场是否应雇佣临时工及雇佣多少名? 三:求解问题形式如下: min f=cTx s.t. Ax=b x=0 四:函数的调用形式如下: [x,minf,flag,cpt]=dcxsf(A,b,c) 其中: A:表示约束条件的系数矩阵 b:表示约束条件的常数列向量 c:表示目标函数的系数行向量 x:为线性规划解向量,当函数有可行解并且有最优值时输出最优解,当有可行解但无最优值或没有可行解时输出x[]。 minf:为目标函数的最优值,当函数有可行解并且有最优值时输出最 优值;当有可行解但没有最优值时minf=-inf,输出-1/0;当 没有可行解时输出 minf=[]。 flag:为记录函数解的情况,当函数有可行解并且有最优值时,flag=1;当函数有可行但没有最优值时,flag=0;当函数没有可行解时,flag=-1. cpt:为单纯形表,当函数有可行解并且有最优值时输出最优解对应的单纯形表;当有可行解但没有最优值时cpt=[]。 五:函数实现方法 该程序由用户输入约束方程组的系数矩阵、常数列向量和目标函 数的系数行向量。通过调用函数的形式,采用两阶段法求解线性规划 问题,并输出相应结果。 程序的第一阶段判断问题是否有可行解,若没有,程序停止,输出结果;若有可行解,按第一阶段的方法可以求得一个初始的基本可行解,使运算进入第二阶段。第二阶段是从这个初始的基本可行解开始,使用单纯形法或者判定线性规划问题无界,或者求得一个最优解。 六:函数代码及注释: function [x,minf,flag,cpt]=dcxsf(A,b,c) format rat %使数据可以以分数形式输出 c=-c; %将目标函数系数向量加负号得到单纯形表第0行 [m,n]=size(A); %求约束矩阵的行数和列数 m1=m; %保存下原来的行数 s=eye(m); %生成秩为m的单位矩阵 A=[A s]; %将s矩阵添加到A矩阵右侧 A=[A b]; %将b向量添加到A矩阵右侧 g1=zeros(1,n); %生成一个1行n列的零矩阵g1 x=ones(1,m); %生成一个1行m列元素全为1的矩阵 g1=[g1 -x]; %将g1和-x合并,产生一个新的前n列为0后m列为-1的单行矩阵 g=[0]; %初始化一个单元素零矩阵 g1=[g1 g];%将单元素零矩阵添加到g1右侧,生成人工向量的检验向量g1 s1=n+m+1; %记录目前列数之和 s2=zeros(1,m+1);%生成1行m+1列的零矩阵s2 c=[c s2];%将s2添加到c右侧 A1=zeros(m,1);%生成一个m行1列的零矩阵A1 for i1=1:m A1(i1,1)=i1+n;%基变量的数值存储区 end for i=1:m g1(1,:)= g1(1,:)+A(i,:); end decide=find(g1(1,1:m+n)0); %寻找g1中大于零的数值列数存于decide数组中 while ~isempty(decide) %当decide不为空 i=decide(1); %将列数赋给i text=find(A(1:m,i)0); %text存放该列中所有数值大于零的行数 if isempty(text) %如果text为空则无解 flag=0; break; end min=inf;%min初始化为无穷大 for i1=1:m % 当该列存在大于零的数值时 if A(i1,i)0A(i1,s1)/A(i1,i)min % 寻找比值最小的 min=A(i1,s1)/A(i1,i);

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档