GLPK
I offer an answer using GLPK glpsol , but I hope that there are much better ways to do this (it seems GLPK is too powerful / general for such a simple simple case of a linear programming problem):
To generate the .mps file below, you must separate your matrices in a series of lines into a system of equations, so the description of the problem will look like this:
minimize cost = 1 x_1 + 2 x_2 + 3 x_3 st constraints: S1 = 1 x_1 + 0 x_2 + 0 x_3 S2 = 0 x_1 + 1 x_2 + 0 x_3 S3 = 1 x_1 + 0 x_2 + 1 x_3 S1 >= 1 S2 >= 1 S3 >= 1 0 <= x1 <= 1 0 <= x2 <= 1 0 <= x3 <= 1
The GLPK documentation contains detailed information about the .mps format, but you specify rows, columns, edges, and borders. In the ROWS section, 'N' and 'G' indicate the type of restriction (number and more than, respectively). In the BOUNDS section, 'UI' indicates that the bounds are the top integer type, causing the decision to be integer.
To run the solver according to the problem specification:
> glpsol --freemps example.mps -o example.out
example.mps file:
NAME VM ROWS N cost G S1 G S2 G S3 COLUMNS x_1 cost 1.0 x_1 S1 1.0 x_1 S3 1.0 x_2 cost 2.0 x_2 S2 1.0 x_3 cost 3.0 x_3 S3 1.0 RHS RHS1 cost 0.0 RHS1 S1 1.0 RHS1 S2 1.0 RHS1 S3 1.0 BOUNDS UI BND1 x_1 1.0 UI BND1 x_2 1.0 UI BND1 x_3 1.0 ENDATA
outputs:
Problem: VM Rows: 4 Columns: 3 (3 integer, 3 binary) Non-zeros: 7 Status: INTEGER OPTIMAL Objective: cost = 3 (MINimum) No. Row name Activity Lower bound Upper bound ------ ------------ ------------- ------------- ------------- 1 cost 3 2 S1 1 1 3 S2 1 1 4 S3 1 1 No. Column name Activity Lower bound Upper bound ------ ------------ ------------- ------------- ------------- 1 x_1 * 1 0 1 2 x_2 * 1 0 1 3 x_3 * 0 0 1 Integer feasibility conditions: INT.PE: max.abs.err. = 0.00e+00 on row 0 max.rel.err. = 0.00e+00 on row 0 High quality INT.PB: max.abs.err. = 0.00e+00 on row 0 max.rel.err. = 0.00e+00 on row 0 High quality End of output
Also, I don't understand how to directly get the vector x, which solves the problem, although it is encoded in the output above in this section:
No. Column name Activity ------ ------------ ------------- 1 x_1 * 1 2 x_2 * 1 3 x_3 * 0