summaryrefslogtreecommitdiff
path: root/code/linprog/AirforceBombDuality.sce
blob: 3bc2ef3c24f62c9c49b41a558fb002fff4948926 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//Reference: J.K. Sharma,"OPerations Research Theory and Applications", Macmillan Publishers India Ltd., 5th edition, 2013, Chapter 4.

//An Air Force is experimenting with three types of bombs P,Q and R in which three kinds of explosives, viz., A, B and C will be used. Taking the various factors into account, it has been decided to use the maximum 600 kg of explosive A, at least 480 kg of B and exactly 540 kg of explosive C. Bomb P requires 3,2,2 kg, bomb Q requires 1,4,3 kg and bomb R requires 4,2,3 kg of explosives A,B and C respectively. Bomb P is estimated to give the equivalent of a 2 ton explosion, bomb Q, a 3 ton of explosion and bomb R, a 4 ton of explosion respectively. Under what production schedule can the Air Force make the biggest bang?
//=============================================================================
// Copyright (C) 2018 - IIT Bombay - FOSSEE
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
// Author: Remya Kommadath
// Organization: FOSSEE, IIT Bombay
// Email: toolbox@scilab.in
//============================================================================

clc; 
// =============================Primal Model===================================
nVar = 3;

// Linear inequalities
A = [3 1 4; -2 -4 -2];
b = [600 -480]';
nIneqCon = length(b);

// Linear equality
Aeq = [2 3 3];
beq = 540;
nEqCon = length(beq);

lb = zeros(1,nVar);
ub = [];

Cost = -[2 3 4 ]';

// =============================Dual Model===================================

// Inequality constraints
dual_A =  -[A;Aeq]';
dual_beq = Cost;
n_dualIneq = length(dual_beq);
Coeff_Slack = [eye(n_dualIneq,n_dualIneq);];
dual_Aeq = [dual_A Coeff_Slack];
dual_Cost = [b;beq; zeros(n_dualIneq,1)];

dual_nVar = length(dual_Cost);
lb = [zeros(1,nIneqCon) -%inf*ones(nEqCon) zeros(1,(dual_nVar-nIneqCon-nEqCon))];
ub = [];

[xopt,fopt,exitflag,output,lambda]=linprog(dual_Cost, [],[], dual_Aeq, dual_beq, lb,ub);
clc

select exitflag
case 0
    disp(xopt(1:nIneqCon+nEqCon)',"Dual values of the primal constraints")
    disp(xopt(nIneqCon+nEqCon+1:dual_nVar)',"Dual values of the primal variables")
    TopRow = ["Variable     "  "Rate of change in optima"];
    Table = string([(1:length(xopt))' -xopt]);
    disp("The change in optima due to one unit increase in each variables are given as below")
    disp([TopRow;Table])
    disp(["The optimal cost is ", string(fopt)])
case 1
    disp("Primal Infeasible")
case 2
    disp("Dual Infeasible")
case 3
    disp("Maximum Number of Iterations Exceeded. Output may not be optimal")
case 4
    disp("Solution Abandoned")
case 5
    disp("Primal objective limit reached")
case 6
    disp("Dual objective limit reached")
end