En el pseudocódigo que has planteado queda definida la matriz de adyacencia del grafo que representa el problema con la mitad de los datos, ya que la otra mitad es igual y por tanto no hace falta introducirla. Por ejemplo para este grafo:
Voy a ir planteando el problema con la solución que conozco, que es basada en grafos y ramificación y poda, esto es una solución compleja, se supone que se deben tener conocimientos previos.
Por si te sirvieran, aquí algunas referencias de wikipedia:
Sobre el problema en sí:
http://es.wikipedia.org/wiki/Problema_del_viajanteSobre la estrategia algorítmica:
http://es.wikipedia.org/wiki/Ramificaci%C3%B3n_y_podaCon la solución que conozco, partiríamos de la matriz de adyacencia completa, aunque tenga los datos repetidos (se supone que de la introducción de datos se ha encargado un programa o función previa)
El pseudocódigo de carga de datos quedaría así:
Función CARGA_DATOS () : matriz [1..n, 1..n] de enteros
Var grafo: matriz [1..n, 1..n] de enteros
Var i, j: entero;
Inicio
Para i ← 1 hasta 6 hacer
Para j ← 1 hasta 6 hacer
Leer (A[i,j])
Fin_para;
Fin_para;
Devolver grafo
Fin_función.
Para el grafo de la imagen anterior (suponiendo que la letra A es 1, la letra B 2, la letra C 3, la letra 4 D) la matriz quedaría así:
(0 20 42 35
20 0 30 34
42 30 0 12
35 34 12 0)
De forma que grafo[1,1] representa la distancia del punto 1 al punto 1, que es cero. grafo [1,2] representa la distancia del punto 1 al punto 2 que es 20, grafo[1,3] representa la distancia del punto 1 al punto 3 que es 42 y así sucesivamente.
El valor -1 significa que entre dos nodos del grafo no hay camino. Por ejemplo en este grafo:
tendríamos que grafo[1,4] = -1
¿Por qué coger el valor -1? Pues no hay un motivo concreto, también podríamos coger 0 ó coger -22 ó -99, simplemente es un valor que permita distinguir.
Para empezar a plantear el problema harían falta estructuras de datos auxiliares que permitan plantear el algoritmo. En esta solución usaríamos:
tipo Tnodo = registro
ruta = Tvector //Sirve para almacenar la solución parcial
asignados: TvectorB //vector de booleanos que indica los nodos del grafo que ya están incluidos en un camino que se está probando
k: entero //índice de número de elemento fijado en la ruta para este nodo
costeT: entero //Coste acumulado
estOpt: entero //Estimación optimista de mejor coste que se puede obtener a partir de la ruta
finRegistro
Supuesto el grafo que tiene 6 nodos anterior y que la ruta que estamos probando es 1, 2, 4. Los elementos del tipo registro serían:
ruta = [1, 2, 4, - , -, -]
asignados = [1, 1, 0, 0, 0, 1]
k: 3
costeT: 7+15 = 22
estOpt: un valor seguro se obtiene multiplicando el número de aristas que faltan por el peso mínimo de una arista en el grafo. Para cerrar un ciclo hacen falta tantas aristas como vértices, en este caso 6. Tenemos definidias 2 aristas (de 1 a 2 y de 2 a 4).
Nos faltan 4 aristas para completar el recorrido, así que viendo cuál es la arista de peso mínimo en el grafo la estimación optimista sería 4*2 = 8
Nos hace falta una función para calcular la arista de peso mínimo en el grafo. Intenta plantearla, no sé si me estoy enrollando mucho.