Как решить задачу линейного программирования с помощью симплексного алгоритма - PullRequest
0 голосов
/ 08 ноября 2018

Я решаю следующую задачу линейного программирования с помощью функции linprog

%Objective Function
     %X1    X2    X3    X4    X5    X6    X7    X8    X9    X10   X11   X12   X13   X14   X15   X16   X17   X18
f = [0.669 0.654 0.503 0.683 0.670 0.673 0.749 0.655 0.660 0.583 1.243 0.639 2.024 2.156 1.672 0.473 0.139 0.687];

A = [];   b = [];   %Sin restricciones de desigualdad

%Restricciones de igualdad son:
     %X1  X2    X3   X4   X5   X6   X7   X8   X9   X10  X11   X12  X13  X14  X15  X16  X17  X18
Aeq=[0.1 0.12 0.335 0.15 0.18 0.19 0.12 0.15 0.15 0.15   0   0.15 0.11  0   0.13  0     0  0.46; %Nitrogeno
     0.3 0.24   0   0.03 0.05 0.04 0.27 0.03 0.24 0.15   0    0   0.52 0.52  0    0     0    0 ; %Fosforo
     0.1 0.12   0   0.31 0.15 0.19 0.08 0.2  0.12 0.15  0.50  0    0   0.34 0.44  0     0    0 ; %Potasio
      0    0    0    0    0    0    0    0    0    0     0   0.26  0    0    0    0    0.50  0 ; %Calcio
      0    0    0    0   0.06  0    0    0    0    0     0    0    0    0    0   0.17   0    0]; %Magnesio


beq = [285.71 ; %Demanda nutricional de Nitrogeno (kg/ha)
       305.33 ; %Demanda nutricional de Fosforo (kg/ha)
          450 ; %Demanda nutricional de Potasio (kg/ha)
       262.50 ; %Demanda nutricional de Calcio (kg/ha)
        41.50]; %Demanda nutricional de Magnesio (kg/ha)

%Limite inferior
lb = zeros(18,1);   
%Limite superior
ub = inf(18,1);        

x = linprog(f, A, b, Aeq, beq, lb, ub, options)

Solucion_optima = f*x

Когда я решаю, это результат, который выбрасывает меня, но не показывает никаких результатов таблицы симплекса, и я выполняю его с помощью следующей команды

options = optimoptions('linprog','Algorithm','dual-simplex');

Итак, у меня есть симплекс-алгоритм

iterM=100;

In=size(Aeq,1);

Xsol=[Aeq eye(In) beq
    f zeros(1,In) 0];

for iter=1:1:iterM
    fin=Xsol(end,1:end-1)<0;
    if fin==0
        break
    end
[a,c]=min(Xsol(end,:));

Xre=Xsol(:,end)./Xsol(:,c);

i=Xre<=0;

d=Xre;
d(i)=inf;

[beq,f]=min(d);

Xsol(f,1:end)=Xsol(f,1:end)/Xsol(f,c);

for i=1:1:size(Xsol,1)

    if i~=f
        Xsol(i,:)=Xsol(i,:)-(Xsol(i,c)*Xsol(f,:));
    end
end

end

for i=1:1:size(f,2)
    d=logical(Xsol(:,i));
    X(i,1)=Xsol(d,end)
end

Когда я запускаю функцию Xsol, она не показывает ни оптимального решения, ни других значений, которые должна иметь симплексная таблица

1 Ответ

0 голосов
/ 09 ноября 2018

Основываясь на ОП: «Мне нужны сниженные затраты, двойное решение и теневые цены».

1) Двойное решение - это теневые цены. Теневые цены являются решением двойного.

2) Окончательная симплексная таблица - не единственный способ достижения поставленных целей (хотя это сработает).

Двойное решение (теневые цены)
Вы можете получить двойное решение через [x,fval,exitflag,output,lambda] = linprog(___). lambda - это двойное решение; см. документацию и примеры MATLAB для linprog ( ссылка ). Документация называет эти множители Лагранжа.

Снижение затрат
Сокращенные затраты достижимы с или без двойного решения. Если f - это коэффициенты целевой функции (затрат), то сокращенные затраты = f'- p'*A, когда ЛП записывается в стандартной форме A*x=b. Если кто-то знает лучший способ получить уменьшенную стоимость от продукции, пожалуйста, напишите. Я пытался избежать первичной формулы, чтобы избавиться от вытягивания индекса основных переменных.

Четкая ссылка на это:
Берцимас, Димистрис и Цициклис, Джон Н. 1997. Введение в линейную оптимизацию , Athena Scientific & Dynamic Ideas, LLC, Belmont, MA. страница 148

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...