Demo entry 2723579

Lab 2

   

Submitted by anonymous on Sep 22, 2015 at 10:50
Language: Matlab. Code size: 2.5 kB.

load(input('Ange datafil: ','s'))
tic;
[m,n] = size(A);

% Skapa nix, dvs indexvektorn för ickebasvariabler
nix = setdiff([1:n],bix);

% Skapa initial partition
B = A(:,bix);
N = A(:,nix);
cB = c(bix,:);
cN = c(nix,:);

opt=0;
iter = 0;
while opt==0,
    iter = iter + 1;
    % Beräkna reducerad kostnad och högerled
    % -------
    %Skapar invers, räknar högerled osvosv
    iB=inv(B);
    hl=iB*b;
    y=(cB'*iB)';
    z=b'*y;
    rc = (cN-N'*y);
    %index är indexet i nix som minsta värdet har incIndex är As column
    [rc_min,index] = min(rc);
     incIndex = nix(index);
        %inc är inkommande värdets kolumn
    % Beräkna mest negativ reducerad kostnad, rc_min,
    %  och index för inkommande variabel, inkix
    % -------

    if rc_min >= -1.0E-10
        opt=1;
        disp('Optimum');
    else
        % Beräkna inkommande kolumn, inc
        % --------
       
        inc = A(:,incIndex);
        inc = iB*inc;
        
        if max(inc) <= 0
            disp('Obegränsad lösning');
            %Om obegränsat, gå ur loopen
            break
        else
            % Bestäm utgående variabel, utgix
            % -------
            %skapar en vektor med högerled genom inkommande variabel.
            %Sätter till infinity om det är någon vi inte får ta
            counter = 1;
            outVector = [1:m];
            while counter <= m
                if inc(counter) <= 0 
                    outVector(counter) = inf;
                elseif hl(counter) == 0
                    outVector(counter) = inf; 
                else
                outVector(counter) = hl(counter)/inc(counter);
                end
                counter = counter + 1;
            end
            [outValue,outIndex] = min(outVector);

            disp(sprintf('Iter: %d, z: %f, rc_min: %f, ink: %d, utg: %d ',iter,z,rc_min,nix(index),bix(outIndex)));

            % Konstruera ny partitionering mha ink och utg
            %Byter plats på ink och utg, uppdatera B,N,cB & cN
            temp = bix(outIndex);
            bix(outIndex) = nix(index);
            nix(index) = temp;
            B = A(:,bix);
            N = A(:,nix);
            cB = c(bix,:);
            cN = c(nix,:);
            % --------
    
        end
    end
end

toc
disp(sprintf('z: %f',z));
x = zeros(n,1);
x(bix) = hl;
disp(sprintf('sum(x-xcheat): %f',sum(x-xcheat)));
disp(sprintf('z-zcheat: %f',z-zcheat));

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).