單純形函式定義如下:
function [y,t]=optimize(a,b,c)
%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
endendt=[(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,:);
endendt(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
endendend
if flag
break
endend
if flag==0
y=t(1,1);
else
y=-inf;
endend
使用方法:
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);
單純形法python實現
coding utf 8 單純形法的實現,只支援最簡單的實現方法 且我們假設約束矩陣a的最後m列是可逆的 這樣就必須滿足a是行滿秩的 m n的矩陣 import numpy as np class x object def init self,c,a,b 形式 minf x c.tx s.t.ax ...
C語言實現單純形法與對偶單純形法
某次為了完成課程要求所做 單純形法 如下,使用方法修改二位陣列a ip jp include define ip 3 define jp 7 int i,j,m,n,flag 1 float max 1 min 1000 guiyi float c jp 1 float a ip jp float ...
單純形法簡介
考慮目標函式,ma xz 3 x1 4 x2增加x1 和x2 的值都將改進 z 的值,單純形法的設計要求每次都選擇使 z值有最大改善的那個變數。意味著在上述目標函式中,首先選擇增加x2 的值。通過對問題約束施加以下兩項要求來方便單純形法的計算 1.所有的約束都是等式,並且具有非負右端項 2.所有變數...