VUELTA ATRÁS
243
número de estación que compone el trayecto más corto. La n-tupla estará rellena hasta la posición k-ésima, siendo k el número de estaciones que debe recorrer, dándose además que x1 = So y xk = Sd. Por comodidad y sin ninguna pérdida de generalidad supondremos que las estaciones están numeradas del 1 al n. En cada etapa iremos probando estaciones, con la restricción de que no pasemos dos veces por la misma y que la que añadamos nueva en cada paso esté conectada con la anterior. Como además se trata de un problema de optimización utilizaremos una restricción adicional, como es la comprobación de que el tiempo acumulado hasta el momento por una solución en proceso no supere el tiempo alcanzado por una solución ya conocida. Estas ideas dan lugar al siguiente algoritmo: CONST n = ...; (* numero de estaciones *) TYPE SOLUCION = ARRAY [1..n] OF CARDINAL; HORARIOS = ARRAY [1..n],[1..n] OF CARDINAL; VAR estacionorigen,estaciondestino,minimo:CARDINAL; tablatiempos:HORARIOS; X,solucionoptima:SOLUCION; PROCEDURE Estaciones(k:CARDINAL;tiempoacum:CARDINAL); BEGIN X[k]:=0; REPEAT INC(X[k]); IF Aceptable(k) THEN tiempoacum:=tiempoacum+tablatiempos[X[k-1],X[k]]; IF tiempoacum<=minimo THEN IF X[k]=estaciondestino THEN (* hemos llegado *) solucionoptima:=X; minimo:=tiempoacum ELSIF k<n THEN Estaciones(k+1,tiempoacum) END END END UNTIL X[k]=n END Estaciones;
Las variables estacionorigen y estaciondestino son las que el usuario elige, y la matriz tablatiempos determina el tiempo de conexión entre cada par de estaciones, puediendo ser tablatiempos[i,j] = ∞ si no existe conexión entre las estaciones i y j. Por su parte, la función Aceptable comprueba las restricciones definidas anteriormente para el problema: PROCEDURE Aceptable(k:CARDINAL):BOOLEAN; VAR i:CARDINAL;