Python - Bucle infinito

 
Vista:
sin imagen de perfil
Val: 3
Ha disminuido su posición en 20 puestos en Python (en relación al último mes)
Gráfica de Python

Bucle infinito

Publicado por Mario (2 intervenciones) el 10/05/2020 21:01:29
Hola a todos
Estoy resolviendo un (tsp) problema del agente viajero con python me dieron unos datos pero me los entregaron como matriz de adyacencia, y el programa la logra convertir en una lista de listas pero al ejecutar el código se entra a un bucle infinito porque al final nunca imprime ni el recorrido ni el costo total. Y por más que lo he checado no he logrado ver mi error por lo que me gustaría recibir su apoyo.

La matriz es la siguiente:

Matriz

Y está guardada en un archivo de tipo .txt de la siguiente manera:

-1 6 9 -1 -1 -1 -1 -1
6 -1 4 4 2 -1 -1 -1
9 4 -1 8 -1 -1 -1 -1
-1 4 8 -1 -1 16 -1 3
-1 2 -1 -1 -1 -1 1 6
-1 -1 -1 16 -1 -1 -1 -1
-1 -1 -1 -1 1 -1 -1 -1
-1 -1 -1 3 6 -1 -1 -1

En la matriz si el número es un -1 eso quiere decir que desde esa posición no se puede avanzar a dicho nodo y si el número es diferente de -1 ese es el "costo" para ir a dicho nodo

Mi código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#Se convierte la matriz en una lista de listas
def Universo(A):
    A = []
    aux = []
    with open("prueba.txt", "r") as archivo:
        for linea in archivo:
            for num in linea:
                if num != '\n' and num != ' ':
                    if num == '-':
                        aux.append(-1)
                    elif num == '1':
                        pass
                    else:
                        num = int(float(num))
                        aux.append((num))
            A.append(aux)
            aux = []
    return A
 
A = []
 
inicio = int(input("Desde que nodo se va a recorrer? Recuerde que el primer nodo es el nodo 0 "))
fin = int(input("Hasta que nodo se va a recorrer? Recuerde que el último nodo es el 7 "))
 
print(Universo(A))
 
#Se obtendrá el recorrido en el caso de que se iteren los nodos de manera ascendente
def normal(U,B,inicio,fin):
    k = inicio
    costo = 0
    recorrido = []
    #Se recorren las líneas de la matriz
    while(k<fin):
        fila = U[k]
        n = k
        recorrido.append(B[k])
        #Recorrido de los elementos de la linea
        while (n<fin):
            #Se evalúa si ya no se puede avanzar
            if n != -1:
                costo = costo + fila[n]
                k = n-1
                break
            n = n+1
        k = k+1
    print("El recorrido fue:",recorrido)
    print("El costo total fue:",costo)
    return
 
#Se obtendrá el recorrido en el caso de que se iteren los nodos de manera descendente
def inverso(U,B,inicio,fin):
    k = fin
    costo = 0
    recorrido = []
    #Se recorren las líneas de la matriz
    while(k>=inicio):
        fila = U[k]
        n = k
        recorrido.append(B[k])
        #Recorrido de los elementos de la linea
        while (n<=fin):
            #Se evalúa si ya no se puede avanzar
            if n != -1:
                costo = costo + fila[n]
                k = n+1
                break
            n = n-1
        k = k-1
    print("El recorrido fue:",recorrido)
    print("El costo total fue:",costo)
    return
 
def backtrack(A,inicio,fin):
    U = []
    U = Universo(A)
    B=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    if fin > inicio:
        normal(U,B,inicio,fin)
    else:
        inverso(U,B,inicio,fin)
    return
 
backtrack(A,inicio,fin)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 3
Ha disminuido su posición en 20 puestos en Python (en relación al último mes)
Gráfica de Python

Error en recorrido

Publicado por Mario (2 intervenciones) el 10/05/2020 22:21:48
*Actualización: Ahora ya eliminé el bucle pero al intentar llegar al último lugar me aparece un "list index out of range" y el recorrido al intentar al nodo 6 lo hace como si fuera el camino al nodo 5 y el camino al nodo 4 también lo hace mal aunque las sumas del costo si las hace bien. Pero no estoy seguro del porqué sucede esto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#Se convierte la matriz en una lista de listas
def Universo(A):
    A = []
    aux=[]
    aux3=''
    with open("prueba.txt", "r") as archivo:
        for linea in archivo:
            posicion=0
            aux3=''
            for num in linea:
                if num != '\n' and num != ' ':
                    aux3+=num
                elif(num==' '):
                    aux3=int(float(aux3))
                    aux.append(aux3)
                    aux3=''
                posicion=posicion+1
            A.append(aux)
            aux = []
    return A
 
A = []
 
inicio = int(input("Desde que nodo se va a recorrer? Recuerde que el primer nodo es el nodo 0 "))
fin = int(input("Hasta que nodo se va a recorrer? Recuerde que el último nodo es el 7 "))
 
print(Universo(A))
 
#Se obtendrá el recorrido en el caso de que se iteren los nodos de manera ascendente
def normal(U,B,inicio,fin):
    k = inicio
    costo = 0
    recorrido = []
    #Se recorren las líneas de la matriz
    while(k<(fin+1)):
        fila = U[k]
        n = k
        posicion = B[k]
        recorrido.append(posicion)
        #Recorrido de los elementos de la linea
        while (n<(fin+1)):
            #Se evalúa si ya no se puede avanzar
            if fila[n] != -1:
                costo = costo + fila[n]
                break
            n = n+1
        k = n-1
        k = k+1
    print("El recorrido fue:",recorrido)
    print("El costo total fue:",costo)
    return
 
#Se obtendrá el recorrido en el caso de que se iteren los nodos de manera descendente
def inverso(U,B,inicio,fin):
    k = fin
    costo = 0
    recorrido = []
    #Se recorren las líneas de la matriz
    while(k>=inicio):
        fila = U[k]
        n = k
        recorrido.append(B[k])
        #Recorrido de los elementos de la linea
        while (n<=fin):
            #Se evalúa si ya no se puede avanzar
            if fila[n] != -1:
                costo = costo + fila[n]
                k = n+1
                break
            n = n-1
        k = k-1
    print("El recorrido fue:",recorrido)
    print("El costo total fue:",costo)
    return
 
def backtrack(A,inicio,fin):
    U = []
    U = Universo(A)
    B=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    if fin > inicio:
        normal(U,B,inicio,fin)
    else:
        inverso(U,B,inicio,fin)
    return
 
backtrack(A,inicio,fin)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar