alpar@9: # A TRANSPORTATION PROBLEM alpar@9: # alpar@9: # This problem finds a least cost shipping schedule that meets alpar@9: # requirements at markets and supplies at factories. alpar@9: # alpar@9: # References: alpar@9: # Dantzig G B, "Linear Programming and Extensions." alpar@9: # Princeton University Press, Princeton, New Jersey, 1963, alpar@9: # Chapter 3-3. alpar@9: alpar@9: set I; alpar@9: /* canning plants */ alpar@9: alpar@9: param a{i in I}; alpar@9: /* capacity of plant i in cases */ alpar@9: alpar@9: table plants IN "MySQL" alpar@9: 'Database=glpk;UID=glpk;PWD=gnu' alpar@9: 'SELECT PLANT, CAPA AS CAPACITY FROM transp_capa' : alpar@9: I <- [ PLANT ], a ~ CAPACITY; alpar@9: alpar@9: set J; alpar@9: /* markets */ alpar@9: alpar@9: param b{j in J}; alpar@9: /* demand at market j in cases */ alpar@9: alpar@9: table markets IN "MySQL" alpar@9: 'Database=glpk;UID=glpk;PWD=gnu' alpar@9: 'transp_demand' : alpar@9: J <- [ MARKET ], b ~ DEMAND; alpar@9: alpar@9: param d{i in I, j in J}; alpar@9: /* distance in thousands of miles */ alpar@9: alpar@9: table dist IN "MySQL" alpar@9: 'Database=glpk;UID=glpk;PWD=gnu' alpar@9: 'transp_dist' : alpar@9: [ LOC1, LOC2 ], d ~ DIST; alpar@9: alpar@9: param f; alpar@9: /* freight in dollars per case per thousand miles */ alpar@9: alpar@9: param c{i in I, j in J} := f * d[i,j] / 1000; alpar@9: /* transport cost in thousands of dollars per case */ alpar@9: alpar@9: var x{i in I, j in J} >= 0; alpar@9: /* shipment quantities in cases */ alpar@9: alpar@9: minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; alpar@9: /* total transportation costs in thousands of dollars */ alpar@9: alpar@9: s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; alpar@9: /* observe supply limit at plant i */ alpar@9: alpar@9: s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; alpar@9: /* satisfy demand at market j */ alpar@9: alpar@9: solve; alpar@9: alpar@9: table result{i in I, j in J: x[i,j]} OUT "MySQL" alpar@9: 'Database=glpk;UID=glpk;PWD=gnu' alpar@9: 'DELETE FROM transp_result;' alpar@9: 'INSERT INTO transp_result VALUES (?,?,?)' : alpar@9: i ~ LOC1, j ~ LOC2, x[i,j] ~ QUANTITY; alpar@9: alpar@9: data; alpar@9: alpar@9: param f := 90; alpar@9: alpar@9: end;