%        Задача о планировании производства
% Для выпуска двух типов продукции используется три вида сырья.
% Производственные коэффициенты (количество сырья, требующееся для производства
% единицы продукции), объёмы запасов
% и рыночные цены на продукции приведены в таблице:
%   Продукция         Сырьё   Цена
%       A         7   6   1     2
%       B         3   9   5     1
% Объём запасов  60  80  35
%    
% Требуется, предполагая ненасыщенность рынка, составить такой план производства
%  x = (x1 , x2),  при котором выручка от продаж будет максимальна.
% Как изменится решение в предположении, что x может иметь только целочисленные значения?
% Формальная постановка задачи
%  цель  2x1 +  x2 → max
%   7x1 + 3x2 <= 60
%   6x1 + 9x2 <= 80
%    x1 + 5x2 <= 35
%    x1,x2 >= 0
% Задача ЛП с ограничениями равенствами
% Двойственная задача  z = [bT,hT]y → min, [AT,E]y >= c,  y4,5,6,7,8 >= 0  
%  Исходная задача F = cTx → max, Ax=b, 0<=x<=u
clc; close all; clear all; 
c=[ 2; 1; 0; 0; 0]
u=[35, 20, 60, 80, 35]
b=[60; 80; 35]
A=[7, 3, 1, 0, 0;
   6, 9, 0, 1, 0;
   1, 5, 0, 0, 1]
fprintf('Решение задачи и значение целевой функции\n')   
[Xopt,Fval] = glpk(c,A,b,[],u,'SSS','CCCCC',-1)
fprintf('Решение задачи целочисленного программирования\n') 
[Xopt,Fval] = glpk(c,[A;eye(5)],[b;u'],[],[],'SSSUUUUU','IIIII',-1)
fprintf('Решение двойственной задачи\n')
[Yopt,Zval,extra,redcosts] = glpk([b;u'],[A',eye(5)],c,[-Inf(1,3),zeros(1,5)],[],'LLLLL','CCCCCCCC')
fprintf('Решение целочисленной двойственной задачи\n')
[Yopt,Zval,extra,redcosts] = glpk([b;u'],[A',eye(5)],c,[-Inf(1,3),zeros(1,5)],[],'LLLLL','IIICCCCC')