单纯形法——两阶段法
(2012-10-11 10:08:35)
标签:
杂谈 |
分类: 菜鸟成长日记 |
clear;clc;close all
% 两阶段法
disp('在运行程序之前,请确认已经将LP化为标准型');
tic;
A=[1 1 1 1 0 0 0;-2 1 -1 0 -1 1 0;0 3 1 0 0 0 1];
c0=[-3 0 1 0 0 -1 -1];
b=[4;1;9];
% A=[2 2 1 0 0;4 0 0 1 0;0 5 0 0 1];
% c=[2 3 0 0 0];
% b=[12;16;15];
% A=input('请输入系数矩阵A=');
% c=input('请输入目标函数的系数c=');
% b=input('请输入右端向量b=');
[m,n]=size(A);
% C_B B b x
bigm=zeros(m,m+n);
% 第一阶段
c=[0 0 0 0 0 -1 -1];
% 加入松弛变量以后,直接就会形成单位阵
% 第一步:形成初始的单纯形表
% bigm(:,2)=n-m+1:n;
total_m=nchoosek(1:n,m);
for i=1:size(total_m,1)
end
bigm(:,1)=c(bigm(:,2));
bigm(:,3)=b;
bigm(:,4:end)=A;
sigma=c-bigm(:,1)'*A;
% 第二步:进行最优性检验
while any(sigma>0)
end
% 第二阶段
c=[-3 0 1 0 0];
s_temp=setdiff(1:n,1:length(c));
bigm(:,1)=c(bigm(:,2));
bigm(:,s_temp+3)=[];
sigma=c-bigm(:,1)'*bigm(:,4:end);
% 第二步:进行最优性检验
while any(sigma>0)
end
n=length(c);
zyj=zeros(2,n);
zyj(1,:)=1:n;
zyj(2,bigm(:,2))=bigm(:,3);
zyz=c*zyj(2,:)';
toc;
fprintf('x%d=%f\n',zyj);
fprintf('Z=%f\n',zyz);