matlab實現單純性算法和對偶單純性算法實現

單純性算法

  • 模型
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 一般線性規劃問題中當線性方程組的變量數大於方程個數,這時會有不定數量的解,而單純形法是求解線性規劃問題的通用方法。
    具體步驟是,從線性方程組找出一個個的單純形,每一個單純形可以求得一組解,然後再判斷該解使目標函數值是增大還是變小了,決定下一步選擇的單純形。通過優化迭代,直到目標函數實現最大或最小值。換而言之,單純形法就是秉承“保證每一次迭代比前一次更優”的基本思想:先找出一個基本可行解,對它進行鑑別,看是否是最優解;若不是,則按照一定法則轉換到另一改進後更優的基本可行解,再鑑別;若仍不是,則再轉換,按此重複進行。因基本可行解的個數有限,故經有限次轉換必能得出問題的最優解。如果問題無最優解,也可用此法判別。
  • 運算步驟
    在這裏插入圖片描述
  • matlab程序示例:我這裏使用的是改進單純性算法的步驟計算
%輸入參量'
function [ X,z ] = lp( N,b,Cn )%N:約束條件係數矩陣,b:資源向量,Cn:價值向量
%N=[1 0;0 2;3 2];%初始基變量,就是沒有使用的,沒有添加鬆弛變量的
[row,col] = size(N);
E=eye(row);%使用單位矩陣
A=[N E];%合起來的A
%Cn=[2 3];%目標函數的參數
Cb=zeros(1,row);%的函數
c=[Cn Cb];%合起來的C
Xb=find(c==0);%初始基變量下標
Xc=find(c~=0);
%b=[4;12;18];%右邊的約束條件
b1=b;
invb=inv(E);%B的-1次方
n=size(A,2); %提取A的列數
X=zeros(1,n);
z=0;
while(1)
    mat=Cn-Cb*invb*N;%看檢驗數
    if sum(sum(mat>0))>0
        p=(find(mat==max(mat)));%換入變量
        if size(p,2)>1 %提取A的列數
            p=1;
        end
        method = N(:,p);
        a=invb*method;
        m=b./a;
        if sum(sum(m>0))==0
            disp('無界解,不用求了');
            break;
        end
        q=(find(m==min(m(m>0))));%換出變量
        %交換一:使用改進單純形算法的矩陣形式表示,B-1=E'*B-1
        t=E(:,q);
        E(:,q)=a ;
        N(:,p)=t;
        invb=E\invb;
        %交換二
        b=invb*b1;
        t=Cb(q);
        Cb(q)=Cn(p);
        Cn(p)=t;
        %交換3
        t=Xc(p);
        Xc(p)=Xb(q);
        Xb(q)=t;
        E=eye(row);
        
    else
        if  sum(sum(mat==0))
            disp('有無窮多最優解,以下是其中之一')
            X(Xb)=invb*b1;
            X'
            z=c*X'
            break
        else
            disp('找到最優解')
            X(Xb)=invb*b1;
            X'
            z=c*X'
            break
        end      
    end
end

  • 解決問題例子
    在這裏插入圖片描述
  • 輸出結果
ans =

    2.0000
    6.0000
    2.0000
         0
         0


z =

    22





對偶單純性算法

  • 對偶單純形法是指從對偶可行性逐步搜索出原始問題最優解的方法。由線性規劃問題的對偶理論,原始問題的檢驗數對應於對偶問題的一組基本可行解或最優解;原始問題的一組基本可行解或最優解對應於對偶問題的檢驗數;原始問題約束方程的係數矩陣的轉置是對偶問題約束條件方程的係數矩陣。所以,在求解常數項小於零的線性規劃問題時,可以把原始問題的常數項視爲對偶問題的檢驗數,原始問題的檢驗數視爲對偶問題的常數項。
  • 模型
    在這裏插入圖片描述
  • matlab程序示例
function [x,Z] = lp2(N,b,Cn)
%採用對偶單純形法計算目標函數最小化的線性規劃問題
%   N初始係數矩陣 b資源向量 C價值係數
[row,col] = size(N);
A=[-N,eye(row)]
[n1,n2]=size(A);
C=[-Cn zeros(1,n1)]

b=-b;
Xb=find(C==0)
x=zeros(1,n2);             %定義最優解
checknum=zeros(1,n2);      %定義檢驗數
judgenum=zeros(1,n2);      %定義判斷換入變量的值
CB=C(Xb);                  %確定初始基變量
Z=0
while 1
    %計算檢驗數
    for i=1:n2
        checknum(i)=C(i)-sum(CB*A(:,i));
    end
    [MinJnum,l]=min(b); %找到b最小位置,換出變量
    
    %計算theta
    for i=1:n2
        if A(l,i)>=0
            judgenum(i)=inf;
        else
            judgenum(i)=checknum(i)/A(l,i);
        end
    end
      %找到judgenum最小位置
    [MinTnum,j]=min(judgenum);%換入變量
    %判斷最優解
    if b>=0
        if checknum<=0
            disp('得到最優解:')
            b'
            x(Xb)=b'
            disp('得到最優值爲:')
            Z=C*x';
            break;
        else
            disp('對偶問題有無界解,原問題無可行解')
            break;
        end      
    else
        %主元素所在行,變換狀態信息
        element=A(l,j);
        X=[b,A];
        X(l,:)=X(l,:)/element;%變換成單位
        for i=1:n1
            if i==l
                continue;
            end
            X(i,:)=X(i,:)-X(l,:)*X(i,j+1);%換入元素同列其他元素變爲0
        end
        b=X(:,1); %提取b
        A=X(:,2:n2+1);
        %更新CB XB的值
        CB(l)=C(j);
        Xb(l)=j;
    end
end


  • 解決問題示例
    在這裏插入圖片描述
  • 結果
得到最優值爲:

Z =

   -5.6000


ans =

    2.2000    0.4000         0         0         0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章