首页 > 编程知识 正文

matlab单纯形表(运筹学单纯形法b逆)

时间:2023-05-06 08:08:51 阅读:72101 作者:3261

引言这段代码比较简单易懂,每一步几乎都有详细的评论,适合初学者,请放心阅读。

该matlab码在标准线性规划下求解极大值问题。 当然,在解决极小值问题时,稍微修正就可以了。

完整代码function [x_opt,fx_opt,ITER]=simplex(a,b,c ) %单纯形法标准型线性规划问题: max cx s.t. Ax=b x=0% x_opt forI=1:size(v,1 ) ifa ) :v ) I, )=eye ) m ) ind_B=v(i ) I, ); endend %步骤主要是从系数矩阵中随机选择几列,每次判断是否为单位矩阵(基矩阵),得到基矩阵的列索引ind_n=setdiff(1:n,ind_B ) %非基变量的索引返回出现在1:n处并且未出现在ind_B或基变量索引处的元素,并且按从小到大的顺序排列ST=[]; iter=0; %记录迭代次数递归求解%whiletruex0=Zeros(n,1 ); x0(ind_b )=b; %初始基可行解以基变量的位置为方程的右边系数,非基变量的取值为0CB=c(ind_b ); %计算cB,即基变量中目标函数的对应系数sigma=Zeros(1,n ); %Sigma是检验数向量sigma(ind_N )=c ) ind_N )-CB*a ) :ind_N ); %计算检查数(非基础变量)。 这是因为与基变量对应的初始检查数必须为0(~,k )=max(sigma )。 %选择最大检查数,确定基变量索引k; ~表示忽略第一个参数,即最大值,k表示索引theta=b./a(:k ); %计算(除法,即除法矩阵中相应的元素,得到新的矩阵) theta(theta=0)=10000; [~,q]=min(Theta ); 选出%最小El=ind_b(q ); 确定%系数矩阵中基变量的列索引el,主元为a(q,k ) vals=[cB ',ind_B ',b,a,Theta]; vals=[vals; NaN、NaN、NaN、Sigma、NaN]; ST=[ST; vals]; DISP(ST; if~any(sigma0) %所有检验数均小于0,该基可行解为最优解,any表示存在某检验数0 x_opt=x0; fx_opt=c * x_opt; 计算%最优解returnendifall (a (:k ) )表示检验数这一列中的每个数=0,无界解x_opt=[]; break end %取代基ind_b(ind_b==El )=k; %新的基础变量索引ind_n=setdiff(1:n,ind_B ); %非基础变量索引%更新a和ba(:ind_N ) a ) :ind_B )a ) :ind_N ); %基矩阵的反乘法非基矩阵b=a(:ind_B ) b; %基矩阵的反乘法ba(:ind_B )=eye(m,m ); 将%基矩阵更新为单位矩阵iter=iter 1; endend如果觉得还不错的话,请向博客发个赞再走。 谢谢~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。