this repo has no description
at develop 3.6 kB view raw
1/*** 2!Test 3expected: 4- !Result 5 solution: !Solution 6 Total: 383 7 cost: [30, 27, 70, 2, 4, 22, 5, 13, 35, 55] 8 objective: 383 9 open: [true, true, true, false, true] 10 supplier: [5, 2, 5, 1, 5, 2, 2, 3, 2, 3] 11***/ 12 13%----------------------------------------------------------------------------- 14% Warehouse allocation 15% (Problem 034 in CSPLib) 16% vim: ft=zinc ts=2 sw=2 et tw=0 17% 18% Guido Tack, tack@gecode.org 19% 2007-02-22 20% 21% Ported from the Gecode example 22%----------------------------------------------------------------------------- 23% A company needs to construct warehouses to supply stores with goods. Each 24% warehouse possibly to be constructed has a certain capacity defining how many 25% stores it can supply. Constructing a warehouse incurs a fixed cost. Costs 26% for transportation from warehouses to stores depend on the locations of 27% warehouses and stores. 28% 29% Determine which warehouses should be constructed and which warehouse should 30% supply which store such that overall cost (transportation cost plus 31% construction cost) is smallest. 32%----------------------------------------------------------------------------- 33 34include "globals.mzn"; 35 36%----------------------------------------------------------------------------- 37% Instance 38 39n_suppliers = 5; 40n_stores = 10; 41building_cost = 30; 42 43capacity = [1,4,2,1,3]; 44 45cost_matrix = 46 [|20, 24, 11, 25, 30 47 |28, 27, 82, 83, 74 48 |74, 97, 71, 96, 70 49 | 2, 55, 73, 69, 61 50 |46, 96, 59, 83, 4 51 |42, 22, 29, 67, 59 52 | 1, 5, 73, 59, 56 53 |10, 73, 13, 43, 96 54 |93, 35, 63, 85, 46 55 |47, 65, 55, 71, 95|]; 56 57%----------------------------------------------------------------------------- 58% Model 59 60int: n_suppliers; 61int: n_stores; 62int: building_cost; 63array[1..n_suppliers] of int: capacity; 64array[1..n_stores,1..n_suppliers] of int: cost_matrix; 65 66int: MaxCost = max(i in 1..n_stores, j in 1..n_suppliers)(cost_matrix[i,j]); 67int: MaxTotal = (n_suppliers * building_cost) 68 + sum(i in 1..n_stores, j in 1..n_suppliers)(cost_matrix[i,j]); 69 70array[1..n_stores] of var 1..n_suppliers: supplier; 71array[1..n_suppliers] of var bool: open; 72array[1..n_stores] of var 1..MaxCost: cost; 73var 1..MaxTotal: Total; 74 75constraint 76 sum (i in 1..n_suppliers) (building_cost * bool2int(open[i])) + 77 sum (i in 1..n_stores) (cost[i]) 78 = Total; 79 80constraint 81 forall (i in 1..n_stores) ( 82 cost_matrix[i,supplier[i]] = cost[i] 83 ); 84 85constraint 86 forall (i in 1..n_suppliers) ( 87 let { 88 var int: use 89 } in 90 count(supplier,i,use) /\ use <= capacity[i] 91 ); 92 93constraint 94 forall (i in 1..n_suppliers) ( 95 (exists (j in 1..n_stores) (supplier[j] == i)) == open[i] 96 ); 97 98solve 99 :: int_search( 100 supplier ++ cost ++ [bool2int(open[i]) | i in 1..n_suppliers], 101 first_fail, 102 indomain_split, 103 complete 104 ) 105 minimize Total; 106 107output 108 [ "warehouses:" ] 109 ++ 110 [ "\nTotal = ", show(Total) ] 111 ++ 112 [ "\nsupplier = [\n" ] 113 ++ 114 [ "\t" ++ show(supplier[i]) ++ 115 if i = n_stores then "\n]" 116 elseif i mod 5 = 0 then ",\n" 117 else "," 118 endif 119 | i in 1..n_stores 120 ] 121 ++ 122 [ "\ncost = [\n" ] 123 ++ 124 [ "\t" ++ show(cost[i]) ++ 125 if i = n_stores then "\n]" 126 elseif i mod 5 = 0 then ",\n" 127 else "," 128 endif 129 | i in 1..n_stores 130 ] 131 ++ 132 [ "\nopen = [\n" ] 133 ++ 134 [ "\t" ++ show(open[i]) ++ 135 if i = n_suppliers then "\n]\n" 136 elseif i mod 5 = 0 then ",\n" 137 else "," 138 endif 139 | i in 1..n_suppliers 140 ] 141 142%----------------------------------------------------------------------------- 143%-----------------------------------------------------------------------------