##################################################################3
# Modelos de enrutamiento vehicular - Ejemplos
#  Modelo ACVRP de 2 ndices
#
# Instancia 0
# Adaptada de la instancia F-n72-k4.vrp de Fisher
##################################################################3


set N := {1..10};
set V := N + {0};
set A := { <i,j> in V*V };
set S[] := powerset(N);
set H := indexset(S);

param costo[A] :=
    | 0       , 1       , 2       , 3       , 4       , 5       , 6       , 7       , 8       , 9       , 10      |
|0  | 0       , 19.8947 , 13.6821 , 15.9687 , 19.7434 , 23.1344 , 18.6494 , 15.9311 , 24.224  , 23.0369 , 28.6967 |
|1  | 17.4557 , 0       , 11.0363 , 13.3866 , 7.42967 , 11.8617 , 7.34847 , 4.89898 , 12.3085 , 10.7331 , 19.2562 |
|2  | 15.6461 , 13.5167 ,0        , 3.1305  , 18.8229 , 23.7487 , 18.0748 , 7.52994 , 24.5194 , 22.8801 , 31.2202 |
|3  | 18.9077 , 16.3951 , 3.83406 , 0       , 22.289  , 27.2158 , 21.6056 , 10.6207 , 27.9339 , 26.2907 , 34.7275 |
|4  | 16.1462 , 6.0663  , 15.3688 , 18.1989 , 0       , 4.9295  , 0.89442 , 9.63328 , 5.71839 , 4.09878 , 12.4419 |
|5  | 18.8892 , 9.68504 , 19.3907 , 22.2216 , 4.02492 , 0       , 4.66905 , 13.6308 , 1.09545 , 1       , 7.52994 |
|6  | 15.2545 , 6       , 14.758  , 17.6409 , 1.09545 , 5.71839 , 0       , 9.16515 , 6.59545 , 5.01996 , 13.1453 |
|7  | 15.3851 , 6       , 6.14817 , 8.67179 , 11.7983 , 16.6943 , 11.225  , 0       , 17.3638 , 15.7226 , 24.224  |
|8  | 19.7788 , 10.0499 , 20.02   , 22.8079 , 4.66905 , 0.89442 , 5.38516 , 14.1774 , 0       , 1.34164 , 6.94982 |
|9  | 18.8096 , 8.76356 , 18.6815 , 21.4663 , 3.34664 , 1.22474 , 4.09878 , 12.8374 , 1.64317 , 0       , 8.5557  |
|10 | 23.4307 , 15.7226 , 25.4912 , 28.3549 , 10.1587 , 6.14817 , 10.7331 , 19.7788 , 5.6745  , 6.9857  , 0       |;

param demandas[N] :=
<1> 1135,
<2> 7063,
<3> 51,
<4> 23,
<5> 3074,
<6> 349,
<7> 1047,
<8> 698,
<9> 3001,
<10> 31;

param K:= 4;    # nmero de vehculos
param C:= 7200;  # capacidad de los vehculos

defnumb r(h):= ceil((sum <i> in S[h] : demandas[i]) / C);

var x[A] binary;

minimize costo_total : sum <i,j> in A : costo[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 grado_sal_deposito :
  sum <j> in N : x[0,j] == K;
subto grado_ent_deposito :
  sum <j> in N : x[j,0] == K;
subto capacidad_corte : forall <h> in H with card(S[h])>0 do
  sum <i,j> in A with (<i> in S[h]) and (<j> in V - S[h]) : x[i,j] >= r(h);

