# Using GLPK to solve knapsack and related problems

I am taking a course in Supply Chain management from Edx. The transport-network problem in the Supply chain management domain maps directly with the network flow problem. The course recommends using Excel to formulate and solve the model problems. I never had a knack for Excel and while I find it useful for some use cases, I prefer programming using a text editor. I would rather work out numeric problems with R or Python than write formulae and values in cells in Excel. I was looking for an open source alternative to formulate and solve the network flow problems so that I can avoid the drudgery of dealing with Excel spreadsheets.

I came across the `glpk`

library for solving linear programs such as Network flow problems. GLPK uses MathProg as its programming
language. You specify your variables, objective function, and constraints in MathProg, run the `glpsol`

command providing the MathProg file as
an input, and the solver outputs a solution if the solution exists. The constraints and the objective function are specified using a math-like
notation for inequalities. Here is a sample MathProg specification ::

```
set Items;
param weight{t in Items};
param value{t in Items};
param quantity{t in Items};
var take{t in Items}, integer, >=0, <=quantity[t];
maximize knap_value: sum{t in Items} take[t] * value[t];
s.t. knap_weight : sum{t in Items} take[t] * weight[t] <= 25;
s.t. knap_vol : sum{t in Items} take[t] * volume[t] <= 0.25;
```

This is a specification for a knapsack problem. We are maximizing the value of the items in the knapsack subject to the constraint the total weight does exceed 400.
The expression `knap_value`

is the objective function which is the value of the items. The expression `knap_weight`

is the constraint.

Next, we’ll need to provide the `.dat`

file as data. We can structure the file like so:

```
data;
param : Items : weight value volume :=
A 0.3 3000 0.025
B 0.2 1800 0.015
C 2.0 2500 0.002
;
end;
```

We can solve the Knapsack problem like so:

```
glpsol --model knapsack.mod --data knapsack.dat -o result
```

The file `result`

produced as a result of the `glpsol`

command will have the details about the solution, if a solution exists.

[1] http://rosettacode.org/wiki/Knapsack_problem/Bounded#Mathprog