大家好,欢迎来到IT知识分享网。
单纯形函数定义如下:
function [y,T]=Optimize(A,b,c)
%作者:MOK
%创作时间:2018/10/10
%A为系数矩阵
%b为常数约束矩阵
%c为目标函数系数矩阵
%y为最优函数值,T为最优化时的单纯形表
%以上条件默认优化问题是标准形式的
l=size(A,2);
r=rank(A);
Choose=nchoosek(1:l,r);
for i=size(Choose,1):-1:1
choose=Choose(i,:);
if (det(A(:,choose))~=0)
B=A(:,choose);
tem=A;
tem(:,choose)=[];
N=tem;
cB=c(choose);
tem=c;
tem(choose)=[];
cN=tem;
break
end
end
T=[(cB)*inv(B)*b,zeros(1,r),cB*(B)^(-1)*N-cN;(B^-1)*b,diag(ones(r,1)),(B^-1)*N];
flag=0;
while(any(T(1,2:end)>0))
frow=T(1,:);
[~,loc1]=max(frow);
fcolumn=T(2:end,loc1);
base=T(2:end,1);
cita=base./fcolumn;
[~,loc2]=min(cita);
loc2=loc2+1;
T(loc2,:)=T(loc2,:)/T(loc2,loc1);
%if (all(T(2:end,loc1)<=0)&&(T(1,loc1)>0))
% flag=1;
% break
%end
tem=T(2:end,loc1);
for i=2:(r+1)
if i~=loc2
T(i,:)=T(i,:)-tem(i-1)*T(loc2,:);
end
end
T(1,:)=T(1,:)-T(1,loc1)*T(loc2,:);
check=find(T(1,2:end)>0);
check=check+1;
if (~isempty(check))
for i=1:length(check)
if all(T(2:end,check(i))<=0)
flag=1;
%break
end
end
end
if flag
break
end
end
if flag==0
y=T(1,1);
else
y=-inf;
end
end
使用方法:
clear;clc
A=[1,2,-2,1,0,0;3,-1,-1,0,1,0;1,1,-1,0,0,-1];
b=[2;3;1];
c=[1,3,-2,0,0,0];
[y,T]=Optimize(A,b,c);
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22843.html