lemon-project-template-glpk

annotate deps/glpk/examples/assign.mod @ 9:33de93886c88

Import GLPK 4.47
author Alpar Juttner <alpar@cs.elte.hu>
date Sun, 06 Nov 2011 20:59:10 +0100
parents
children
rev   line source
alpar@9 1 /* ASSIGN, Assignment Problem */
alpar@9 2
alpar@9 3 /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
alpar@9 4
alpar@9 5 /* The assignment problem is one of the fundamental combinatorial
alpar@9 6 optimization problems.
alpar@9 7
alpar@9 8 In its most general form, the problem is as follows:
alpar@9 9
alpar@9 10 There are a number of agents and a number of tasks. Any agent can be
alpar@9 11 assigned to perform any task, incurring some cost that may vary
alpar@9 12 depending on the agent-task assignment. It is required to perform all
alpar@9 13 tasks by assigning exactly one agent to each task in such a way that
alpar@9 14 the total cost of the assignment is minimized.
alpar@9 15
alpar@9 16 (From Wikipedia, the free encyclopedia.) */
alpar@9 17
alpar@9 18 param m, integer, > 0;
alpar@9 19 /* number of agents */
alpar@9 20
alpar@9 21 param n, integer, > 0;
alpar@9 22 /* number of tasks */
alpar@9 23
alpar@9 24 set I := 1..m;
alpar@9 25 /* set of agents */
alpar@9 26
alpar@9 27 set J := 1..n;
alpar@9 28 /* set of tasks */
alpar@9 29
alpar@9 30 param c{i in I, j in J}, >= 0;
alpar@9 31 /* cost of allocating task j to agent i */
alpar@9 32
alpar@9 33 var x{i in I, j in J}, >= 0;
alpar@9 34 /* x[i,j] = 1 means task j is assigned to agent i
alpar@9 35 note that variables x[i,j] are binary, however, there is no need to
alpar@9 36 declare them so due to the totally unimodular constraint matrix */
alpar@9 37
alpar@9 38 s.t. phi{i in I}: sum{j in J} x[i,j] <= 1;
alpar@9 39 /* each agent can perform at most one task */
alpar@9 40
alpar@9 41 s.t. psi{j in J}: sum{i in I} x[i,j] = 1;
alpar@9 42 /* each task must be assigned exactly to one agent */
alpar@9 43
alpar@9 44 minimize obj: sum{i in I, j in J} c[i,j] * x[i,j];
alpar@9 45 /* the objective is to find a cheapest assignment */
alpar@9 46
alpar@9 47 solve;
alpar@9 48
alpar@9 49 printf "\n";
alpar@9 50 printf "Agent Task Cost\n";
alpar@9 51 printf{i in I} "%5d %5d %10g\n", i, sum{j in J} j * x[i,j],
alpar@9 52 sum{j in J} c[i,j] * x[i,j];
alpar@9 53 printf "----------------------\n";
alpar@9 54 printf " Total: %10g\n", sum{i in I, j in J} c[i,j] * x[i,j];
alpar@9 55 printf "\n";
alpar@9 56
alpar@9 57 data;
alpar@9 58
alpar@9 59 /* These data correspond to an example from [Christofides]. */
alpar@9 60
alpar@9 61 /* Optimal solution is 76 */
alpar@9 62
alpar@9 63 param m := 8;
alpar@9 64
alpar@9 65 param n := 8;
alpar@9 66
alpar@9 67 param c : 1 2 3 4 5 6 7 8 :=
alpar@9 68 1 13 21 20 12 8 26 22 11
alpar@9 69 2 12 36 25 41 40 11 4 8
alpar@9 70 3 35 32 13 36 26 21 13 37
alpar@9 71 4 34 54 7 8 12 22 11 40
alpar@9 72 5 21 6 45 18 24 34 12 48
alpar@9 73 6 42 19 39 15 14 16 28 46
alpar@9 74 7 16 34 38 3 34 40 22 24
alpar@9 75 8 26 20 5 17 45 31 37 43 ;
alpar@9 76
alpar@9 77 end;