Python - Crear Tkinter para el algoritmo de Bellman-Ford Python 3.7

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

Crear Tkinter para el algoritmo de Bellman-Ford Python 3.7

Publicado por Diego (2 intervenciones) el 27/08/2019 02:38:08
Hola buenos días tardes o noches depende de tu país , agradecería mucho la ayuda por favor con mi siguiente problema :
empiezo diciendo que soy novato en esto de programación.
modifique un código (extraido de esta web) en python 3.7 con el algoritmo de Bellman-Ford para determinar las rutas mas cortas de una ciudad a otra, dentro un país, en este caso Bolivia .

Lo que quiero hacer es poder crear alguna ventana con Tkinter para que en ella se ejecute este código y se pueda seleccionar el origen y el destino para obtener la ruta mas corta.
de verdad agradecería mucho la ayuda .

el 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""
           PA
        /   |   \     
      644   |   448  
      /     |     \     
     LP     |    BN  
    /  \    |    /  \
  233   387 | 356   434
  /      \  |  /      \
OR — 214 — CB — 477 — SC
  \      /  |  \      /
  311   520 | 651   406
    \  /    |    \  / 
     PT    798    CH  
      \     |     / 
       346  |  397   
        \   |   /    
           TJ

"""
import math
 
 
# Cada elemento de este diccionario contiene una posición del camino y 
# como valor tiene una lista con el cálculo del camino más corto, y el origen del mismo.
 
valores={
 
    "Pando":[math.inf,""],
    "La Paz":[math.inf,""],
    "Beni":[math.inf,""],
    "Cochabamba":[math.inf,""],
    "Oruro":[math.inf,""],
    "Santa Cruz":[math.inf,""],
    "Chuquisaca":[math.inf,""],
    "Potosi":[math.inf,""],
    "Tarija":[math.inf,""]
}
 
# aquí establecemos cada uno de los caminos en una sola dirección y la distancia en kilometros.
 
caminos=[
 
    ["Pando","La Paz",644],
    ["Pando","Beni",448],
    ["La Paz","Oruro",233],
    ["La Paz","Cochabamba",387],
    ["Beni","Cochabamba",356],
    ["Beni","Santa Cruz",434],
    ["Oruro","Cochabamba",214],
    ["Oruro","Potosi",311],
    ["Cochabamba","Potosi",520],
    ["Cochabamba","Santa Cruz",477],
    ["Cochabamba","Chuquisaca",651],
    ["Santa Cruz","Chuquisaca",406],
    ["Potosi","Tarija",346],
    ["Chuquisaca","Tarija",397],
    ["Tarija","Cochabamba",798]
 
    ]
 
print()
def setValores(origen,destino,valor):
    """
#Función que actualiza el valor del diccionario valores, actualizando
    el valor al mas bajo e indicando de  que punto viene el camino mas corto
    
    """
    if valor<valores[destino][0]:
 
        # guardamos el nuevo valor mas bajo
        valores[destino][0]=valor
 
        # guardamos de donde viene el valor mas bajo
        valores[destino][1]=origen
        return True
    return False
 
# definimos el inicio y el destino :
 
inicio = input("Introduzca la ciudad de partida : ")
final = input("Introduzca su destino final : " )
 
valores[inicio][0]=0
 
# realizamos un bucle hasta que no haya ningun otro cambio de valores
while True:
    cancel=True
 
    # recorremos cada uno de los caminos
    for i in caminos:
 
        # enviamos los datos del camino
        if setValores(i[0],i[1],valores[i[0]][0]+i[2]):
            cancel=False
 
        # enviamos los datos del camino de forma invertida
        if setValores(i[1],i[0],valores[i[1]][0]+i[2]):
            cancel=False
 
    # finalizamos el bucle cuando ya no hay ningun cambio en los valores
    if cancel:
        break
 
# iniciamos la busqueda del camino mas corto
camino=[final]
 
while True:
    if camino[-1]==inicio:
        break
    camino.append(valores[camino[-1]][1])
 
print("El camino mas corto desde la ciudad de  '{}' a la ciudad de  '{}' es:{}  ".format(inicio, final, camino[::-1]))
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: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Crear Tkinter para el algoritmo de Bellman-Ford Python 3.7

Publicado por tincopasan (1082 intervenciones) el 27/08/2019 08:36:16
hola:
1) la verdad es que hay muchas formas de hacerlo, eso depende de cada uno.
2) No hago tareas, pero en este caso el proyecto está interesante y además no es python 2.x, así que te muestro una posible forma.
3)No he revisado todos los errores posibles, eso ya te toca a vos, pero seguro está funcional.
4)hace años no uso tkinter así que seguro se puede implementar mejor.
5) solo como recordatorio lo podés guardar con extensión pyw, para no ver la ventana de cmd, pero cuando hayas corregido los errores.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#-*- coding: utf -8 -*-
import tkinter as tk
from tkinter import messagebox
 
import math
valores={"Pando":[math.inf,""],"La Paz":[math.inf,""],
    "Beni":[math.inf,""],"Cochabamba":[math.inf,""],
    "Oruro":[math.inf,""],"Santa Cruz":[math.inf,""],
    "Chuquisaca":[math.inf,""],"Potosi":[math.inf,""],
    "Tarija":[math.inf,""]}
caminos=[["Pando","La Paz",644],["Pando","Beni",448],
    ["La Paz","Oruro",233],["La Paz","Cochabamba",387],
    ["Beni","Cochabamba",356],["Beni","Santa Cruz",434],
    ["Oruro","Cochabamba",214],["Oruro","Potosi",311],
    ["Cochabamba","Potosi",520],["Cochabamba","Santa Cruz",477],
    ["Cochabamba","Chuquisaca",651],["Santa Cruz","Chuquisaca",406],
    ["Potosi","Tarija",346], ["Chuquisaca","Tarija",397],
    ["Tarija","Cochabamba",798]]
 
class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x500+0+0")
        self.title("Camino más corto")
        self.lblorigen = tk.Label(self,text="Origen")
        self.lblorigen.place(x=80,y=10)
        self.lbldestino = tk.Label(self,text="Destino")
        self.lbldestino.place(x=320, y = 10)
        self.listOrigen = tk.Listbox(self,selectforeground="#ffffff",selectbackground="#00aa00",selectborderwidth=5)
        self.listOrigen.place(x=40,y=40)
        self.listOrigen.insert(0, *valores)
        self.listDestino = tk.Listbox(self,selectforeground="#ffffff",selectbackground="#ff0000",selectborderwidth=5)
        self.listDestino.insert(0, *valores)
        self.listDestino.place(x= 300, y= 40)
        self.btnOrigen = tk.Button(self,text = "Elegir",command=self.selOrigen)
        self.btnOrigen.place(x=40,y=370)
        self.btnDestino = tk.Button(self,text="Elegir",command=self.selDestino)
        self.btnDestino.place(x=300, y=370)
        self.Origen = tk.Label(self,text="Origen")
        self.Origen.place(x=100, y=380)
        self.Destino = tk.Label(self,text="Destino")
        self.Destino.place(x=360,y=380)
        self.Buscar = tk.Button(self,text="Buscar",command=self.BuscarRuta)
        self.Buscar.place(x=40,y=430)
        self.Ruta = tk.Label(self,text="Ruta a buscar...")
        self.Ruta.place(x= 100, y= 440)
        self.Ruta1 = tk.Label(self,)
        self.Ruta1.place(x= 100, y= 470)
 
 
    def selOrigen(self):
        self.desde = ""
        try:
            self.desde = self.listOrigen.get(self.listOrigen.curselection())
            self.Origen.config(text=self.desde)
        except:
            messagebox.showinfo("Atención","Debe elegir algún origen")
 
    def selDestino(self):
        self.hasta = ""
        try:
            self.hasta = self.listDestino.get(self.listDestino.curselection())
            self.Destino.config(text=self.hasta)
        except:
            messagebox.showinfo("Atención","Debe elegir algún destino")
 
 
    def BuscarRuta(self):
        def setValores(origen,destino,valor):
            if valor<valores[destino][0]:
                valores[destino][0]=valor
                valores[destino][1]=origen
                return True
            return False
 
        if self.desde != "":
            inicio = self.desde
        else:
            messagebox.showinfo("Atención","Debe elegir algún origen")
            return
        if self.hasta!="":
            final = self.hasta
        else:
            messagebox.showinfo("Atención","Debe elegir algún destino")
            return
 
        valores[inicio][0]=0
 
        while True:
            cancel=True
            for i in caminos:
                if setValores(i[0],i[1],valores[i[0]][0]+i[2]):
                    cancel=False
 
                if setValores(i[1],i[0],valores[i[1]][0]+i[2]):
                    cancel=False
 
            if cancel:
                break
        camino=[final]
        while True:
            if camino[-1]==inicio:
                break
            camino.append(valores[camino[-1]][1])
 
            ruta = "El camino mas corto desde '{}' a '{}' es: ".format(inicio, final)
            ruta1 = camino[::-1]
        self.Ruta.config(text=ruta)
        self.Ruta1.config(text=ruta1)
 
if __name__ == "__main__":
    app = App()
    app.mainloop()

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 4
Ha disminuido su posición en 20 puestos en Python (en relación al último mes)
Gráfica de Python

Crear Tkinter para el algoritmo de Bellman-Ford Python 3.7

Publicado por diego (2 intervenciones) el 27/08/2019 19:22:15
Muchísimas gracias , en verdad me ayudo bastante , ahora tengo una base de como puedo hacerlo.
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