#####################################################
# Instancia: data/inst2.vrp
# Tipo: ACVRP
# Generada automaticamente
#####################################################

set N:={1..20};
set V:= N + {0,21};
set A2 := V*V; # solo se usa para poder leer matriz de costos
set A := {<i,j> in N*N with i!=j} + {0}*N + N*{21}; # para los arcos
set Ay := A + N*{0} + {21}*N; # para indexar y

# costos de desplazamiento
param c[A2] :=
    |       0,       1,       2,       3,       4,       5,       6,       7,       8,       9,      10,      11,      12,      13,      14,      15,      16,      17,      18,      19,      20,      21|
|  0|       0,    1354,    1627,    1509,    1768,    1426,    1378,    1851,    1759,    2205,    1600,    1227,    1650,    1613,    1165,    1526,    1744,    1709,    1069,    1505,     793,       0|
|  1|    1407,       0,     337,    1489,    1880,    1434,     584,    1937,    1806,    2477,    1047,     158,     327,     268,     500,     242,     402,     356,     300,     322,    2100,    1407|
|  2|    1620,     311,       0,    1772,    2163,    1722,     838,    2216,    2086,    2764,    1283,     400,     349,     270,     543,     100,     334,     250,     605,     158,    2248,    1620|
|  3|    2206,    1868,    2165,       0,     391,     122,    1115,     449,     320,     991,     641,    1906,    1753,    1832,    2222,    2096,    1836,    1912,    1692,    2190,    2966,    2206|
|  4|    2580,    2351,    2649,     483,       0,     582,    1595,      83,     104,     601,    1063,    2387,    2230,    2313,    2697,    2579,    2310,    2390,    2169,    2674,    3308,    2580|
|  5|    2084,    1773,    2077,      83,     449,       0,    1038,     514,     389,    1043,     629,    1805,    1678,    1753,    2115,    2004,    1765,    1836,    1587,    2096,    2845,    2084|
|  6|    1723,     799,    1063,     944,    1333,     902,       0,    1382,    1251,    1934,     463,     882,     640,     717,    1242,    1004,     728,     797,     734,    1111,    2509,    1723|
|  7|    2702,    2448,    2741,     582,     122,     688,    1682,       0,     161,     559,    1125,    2488,    2313,    2399,    2803,    2674,    2390,    2473,    2273,    2770,    3430,    2702|
|  8|    2574,    2287,    2579,     423,     100,     532,    1521,     130,       0,     687,     971,    2328,    2152,    2238,    2645,    2512,    2230,    2313,    2115,    2609,    3312,    2574|
|  9|    3148,    3063,    3365,    1199,     717,    1289,    2313,     640,     797,       0,    1765,    3092,    2948,    3030,    3391,    3294,    3027,    3107,    2868,    3386,    3819,    3148|
| 10|    2196,    1445,    1692,     605,     960,     600,     647,     992,     867,    1551,       0,    1528,    1224,    1324,    1884,    1642,    1289,    1385,    1363,    1753,    2989,    2196|
| 11|    1258,     134,     419,    1477,    1866,    1417,     618,    1926,    1797,    2457,    1080,       0,     459,     402,     367,     314,     536,     488,     216,     337,    1942,    1258|
| 12|    1781,     418,     500,    1502,    1888,    1462,     559,    1934,    1804,    2490,     968,     574,       0,     122,     908,     489,     104,     161,     620,     612,    2502,    1781|
| 13|    1708,     316,     382,    1545,    1934,    1502,     601,    1982,    1852,    2536,    1028,     474,      83,       0,     793,     367,     134,     104,     556,     489,    2414,    1708|
| 14|    1126,     350,     488,    1670,    2053,    1604,     860,    2118,    1991,    2634,    1317,     250,     664,     592,       0,     402,     720,     654,     389,     356,    1708,    1126|
| 15|    1528,     216,     104,    1694,    2086,    1642,     770,    2140,    2010,    2685,    1223,     300,     334,     250,     474,       0,     350,     272,     506,     122,    2169,    1528|
| 16|    1861,     474,     489,    1589,    1974,    1551,     650,    2018,    1888,    2575,    1043,     632,     100,     158,     946,     500,       0,     122,     703,     620,    2571,    1861|
| 17|    1791,     387,     367,    1630,    2018,    1589,     687,    2064,    1934,    2619,    1098,     543,     130,     100,     836,     380,      83,       0,     648,     500,    2485,    1791|
| 18|    1161,     314,     641,    1283,    1668,    1219,     501,    1732,    1604,    2255,     941,     242,     581,     550,     532,     538,     677,     651,       0,     578,    1897,    1161|
| 19|    1483,     260,     134,    1749,    2140,    1694,     835,    2197,    2067,    2738,    1293,     311,     418,     334,     387,      83,     431,     350,     527,       0,    2095,    1483|
| 20|     592,    1866,    2100,    2051,    2261,    1969,    1962,    2344,    2268,    2624,    2191,    1732,    2180,    2133,    1613,    2006,    2266,    2221,    1609,    1969,       0,     592|
| 21|       0,    1354,    1627,    1509,    1768,    1426,    1378,    1851,    1759,    2205,    1600,    1227,    1650,    1613,    1165,    1526,    1744,    1709,    1069,    1505,     793,       0|;

# demandas
param d[N] :=
<1> 7063,
<2> 51,
<3> 23,
<4> 3074,
<5> 349,
<6> 1047,
<7> 698,
<8> 3001,
<9> 31,
<10> 1135,
<11> 21611,
<12> 57,
<13> 51,
<14> 551,
<15> 179,
<16> 6,
<17> 528,
<18> 2832,
<19> 1514,
<20> 889;

# nmero de vehiculos
param K:= 4;

# capacidades
param C:= 21611;

# variables de seleccion de aristas
var x[A] binary;

# variables de flujo
var y[Ay] >= 0;

minimize costo_total : sum <i,j> in A : c[i,j] * x[i,j];
subto grado_sal_cliente : forall <i> in N do
  (sum <i,j> in A : x[i,j]) == 1;
subto grado_ent_cliente : forall <i> in N do
  (sum <j,i> in A : x[j,i]) == 1;
subto demanda_flujo : forall <i> in N do
  (sum <j,i> in Ay : y[j,i]) - (sum <i,j> in Ay : y[i,j]) == 2*d[i];
subto vinculacion_1 : forall <i,j> in N*N with i<j do
  y[i,j] + y[j,i] == C*(x[i,j]+x[j,i]);
subto vinculacion_2 : forall <j> in N do
  y[0,j] + y[j,0] == C*(x[0,j]);
subto vinculacion_3 : forall <i> in N do
  y[i,21] + y[21,i] == C*(x[i,21]);
subto eliminar_lazos_dobles : forall <i,j> in N*N with i<j do
  x[i,j] + x[j,i] <=1;
subto salida_deposito_ida :
  sum <0,j> in Ay : y[0,j] == sum <i> in N : d[i];
subto salida_deposito_retorno :
  sum <21,j> in Ay : y[21,j] == K*C;
