# n es la cantidad de vertices param n:=5; # V es el conjunto de vertices set V:={1..n}; # c es la matriz de costos param c[V*V]:= |1,2,3,4,5| |1|0,1,1,1,1| |2|1,0,1,5,5| |3|1,1,0,5,5| |4|1,5,5,0,1| |5|1,5,5,1,0|; # x[i,j]=1 si y solo si en el recorrido la ciudad j viene inmediatamente despues que la ciudad i var x[V*V] binary; # variables auxiliares para eliminar subtours var u[ in V with i>=2] integer; # minimizamos el costo del recorrido minimize fobj: sum in V*V: c[i,j]*x[i,j]; # sujeto a que entramos una vez en cada ciudad subto entrar: forall in V: sum in V with i!=j: x[i,j] ==1; # salimos una sola vez de cada ciudad subto salir: forall in V: sum in V with i!=j: x[i,j] ==1; # y eliminamos subtours subto no_subtour: forall in V*V with i>=2 and j>=2 and i!=j: u[i]-u[j]+n*x[i,j]<=n-1;