單純形法的MATLAB實現

2021-08-29 16:06:48 字數 1596 閱讀 3486

單純形函式定義如下:

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.所有變數...