[계획 최적화 OR] 단순형법 사상과 코드 실현Simplex Method

4722 단어 계획 최적화OR
[플랜 최적화 OR] 단순형법 Simplex Method
 
더 많은 운기획학 관련:https://github.com/Amoiensis/Operational-Research
계획 최적화 - Operational Research - Github
주의: 허락 없이 전재하지 마십시오!
전재 출처를 밝혀주세요~
적용 과정: 운기획학
 
코드1: 호출 부분
(파일 이름: Simplex method main.m)
%   Simplex_Method   
%%
% Author: Amoiensis
% Email: [email protected]
% Data: 2019.10.01
clear;clc;
%%
% Import Data %
%      %
% A = [...
%     1	1	1	1   0	0	0;
%     -2	1	-1	0	-1	1	0;
%     0	3	1	0	0	0	1;...
%     ];
% b = [4  1   9]';
% C = [-3	0	1	0	0	-100  -1];

A = [...
    1	1	1	1	0	0	0
    1	0	0	0	1	0	0
    0	0	1	0	0	1	0
    0	3	1	0	0	0	1;...
    ];
b = [4 2 3 6]';
C = [1 14 6 0 0 0 0];

% %     %
% A = [...
%     4	0	1....
%     ];
% b = [16]';
% C = [2 3 0];

[~,~,RESULT] = Simplex_method_f(A,b,C);

코드 2: 바디 구현 섹션(함수 파일)
(파일 이름: Simplex method f.m)
function [max_value,result,PRINT] = Simplex_method_f(A,b,C)
% Simplex Method               
%       A、b、C       /   /      
%%
% Author: Amoiensis
% Email: [email protected]
% Data: 2019.10.01
%%
% Structure(Program Simplex_Method)%
%    max CX
% s.t. AX = b
%      X >= 0
% Program to solve the liner-program atomatically
%%
%        %
Size_A = size(A);
deta = zeros(1,Size_A(2));    %     
sita_arry = zeros(1,Size_A(1));    
sita = 0;   %sita 
Coef = zeros(1,Size_A(1));    %   
Base = zeros(1,Size_A(1));  %    
Decsion = b;%zeros(1,Size_A(1));%    

END_deta = ones(1,Size_A(2));   %  deta       
ZEROS_ceofA = zeros(Size_A(1),1);   %       ,  

FLAG = 0;   %      ;0-  //1-   (11)or    (12)//2-   //3-    
Step = 1;
PUTOUT_R = "<>C_B   //      //  b  //   x_1~x_n";
PUTOUT_C = " <> x_1~x_m   //  deta";
%%
%Operation
%STEP 1       %
 while 1
    %      
    if Size_A(1) == 1
        Position(find(A == 1)) = 1;
    else
        Position = ((sum(A) == 1)&(min(A) == 0));
    end
    index_I = zeros(1,Size_A(1));
    for i=1:Size_A(2)
       if  Position(i) 
           [~,temp] = max(A(:,i));
           index_I(temp) = i;
       end
    end

    Base = index_I;
    Coef = C(index_I);

    %  ,     /deta    sita 
    %      deta  , sita  ?         ?
    %deta
    for i=1:Size_A(2)
        deta(i) = C(i) - (Coef)*A(:,i);
    end
    [temp_deta,Position_in] = max(deta);    %      
    
    %%%%%%%%%%%%%%
    %      %
    PRINT = zeros(1+Size_A(1),3+Size_A(2));
    PRINT(1,1:3+Size_A(2)) =  [nan(1,3),C];
    PRINT(2:end,1) =  Coef';
    PRINT(2:end,2) =  Base';
    PRINT(2:end,3) =  Decsion;
    PRINT(2:end,4:3+Size_A(2)) = A;
    PRINT(end+1,4:3+Size_A(2)) = deta;
    PRINT(end,1:3) = [nan nan nan];
    disp(strcat("  :",num2str(Step)));
    disp(PUTOUT_C);
    disp(PUTOUT_R);
    disp(PRINT);
    %%%%%%%%%%%%%%
    Step = Step+1;
    %%%%%%%%%%%%%%
    %sita
    sita_arry = Decsion./A(:,Position_in);
    Size_sita_arry = size(sita_arry);
    for i=1:Size_sita_arry(1)
        if sita_arry(i)<=0
            sita_arry(i) = nan;
        end
    end
    %       ,        ;
    [sita,Position_out] = min(sita_arry);
    
    for i=1:Size_sita_arry(1)
        if sita_arry(i) == sita
               Base(Position_out) < Base(i);
               Position_out = i;
        end
    end

    %      %
    

    %   

        if sita == inf
            FLAG = 2;
            break;
        end
    
    %    -   or    %
    if isequal(deta<=0,END_deta)
        FLAG = 1;
        break;
    end

    %     
    Decsion(Position_out) = Decsion(Position_out)/temp_num;
    A(Position_out,:) = A(Position_out,:)/temp_num;
    for i=1:Size_A(1)
       if i~=Position_out
            Decsion(i) = Decsion(i)- A(i,Position_in)*Decsion(Position_out);
            A(i,:) = A(i,:)- A(i,Position_in)*A(Position_out,:);
       end
    end
end

%STEP 2     %
%  :     、      、   、    
Result = zeros(1,Size_A(2));
Result(Base) = Coef;
if FLAG == 1
    temp_tell = deta == 0;
    for i=1:Size_A(2)
        if deta(i)==0 && sum((sita>0))
             FLAG = 12;   %   
             break;
        end
    end
    if FLAG ==12
        disp("       ,  “   ”   .");
        disp("    ,      :(x1~xn)");
        disp(Result);
        disp("        :");
        disp(Coef*Decsion);
    else
        disp("       ,       .");
        disp("      :(x1~xn)");
        disp(Result);
        disp("        :");
        disp(Coef*Decsion);
    end
   
else
    if FLAG == 2
        disp("       ,    (   ).");
    else
        if FLAG == 3
            disp("       ,    .");
        end
    end
end
%%
%      %
result = Result;
max_value = Coef*Decsion;
end


좋은 웹페이지 즐겨찾기