?? danchunxing.m
字號:
% 求最大值
% a為約束條件矩陣(n*m);b為約束條件邊界(n*1);c價值系數(shù)(1*m)
function [z,X]=danchunxing(f,A,b)
echo on
q1=size(A);
q2=size(b);
n=q1(1); % n為約束條件個數(shù)
m=q2(1); %為約束條件邊界的個數(shù)
if m~=n
fprintf('A與b的行數(shù)不相等?\n');
break
end
f1=zeros(1,n); % 松弛變量在目標函數(shù)中的系數(shù)
f2=[f,f1];
A1=eye(n,n); % 松弛變量在約束條件中的系數(shù)矩陣
A2=[A,A1];
b1=b;
N=(q1(2)+1):1:(q1(2)+n);
while 1
s=f2-f1*A2; % 求檢驗數(shù)
if s<=0 % 判斷檢驗數(shù)是否全大于零
break
end
[Y,k]=max(s); % 尋找換出變量
for i=1:n
if A2(i,k)>0
t=b1(i)/A2(i,k);
l=i;
break
end
end
for i=1:n % 尋找換入變量
if A2(i,k)>0&b1(i)/A2(i,k)<t
t=b1(i)/A2(i,k);
l=i;
end
end
f1(l)=f2(k);
N(l)=k;
for i=1:n % 高斯迭代
if i~=l
b1(i)=b1(i)-A2(i,k)*b1(l)/A2(l,k);
A2(i,:)=A2(i,:)-A2(i,k).*(A2(l,:)./A2(l,k));
end
end
b1(l)=b1(l)/A2(l,k);
A2(l,:)=A2(l,:)/A2(l,k);
end
p=1:1:(q1(2)+n);
p0=p;
p0(N)=[];
if s(p0)<0
z=-f1*b1; % 求解
X=b1;
fprintf('唯一最優(yōu)解是 : %f\n',-z);
fprintf('基變量是:\n');
for i=1:length(N)
fprintf(' x%d ',N(i));
if rem(i,10)==0
fprintf('\n');
end
end
fprintf('\n');
fprintf('各檢驗數(shù)為:\n');
for i=p
fprintf('r%d=%0.3f \n',i,s(i));
if rem(i,8)==0
fprintf('\n');
end
end
else
fprintf('無窮最優(yōu)解!\n');
end
echo off
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -