Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Discretas
Discretas
Discretas
7 Puentes de Konigsbergc
Integrantes: Jos Manuel Silva 20.667.213 Yohanderson Colmenares 25.142.725 Hernan Barboza 23.537.961 kevin Silva 21.129.563 Prof. Edecio Freitez
La ciudad de Kaliningrado, antiguamente llamada Knigsberg, es un lugar situado en la desembocadura del ro Pregolya, en la antigua Prusia Oriental. Este ro atravesaba la ciudad, dividiendo la zona en varias partes. Para no perder la comunicacin, sta estaba llena de un sistema de puentes conectores. En total, haba siete grandes puentes en Kaliningrado: El puente del herrero, el puente conector, el puente verde, el puente del mercado, el puente de madera, el puente alto y, por ltimo, el puente de la miel. El problema consista en comenzar en un punto, pasar por los siete puentes sin repetir ninguno y volver al punto de partida. Fue Euler quien fue represento la ciudad de Knigsberg como un grafo en el que las cuatro partes de la misma eran los vrtices y los siete puentes eran las aristas: Por tanto el problema de los puentes de Knigsberg pasa a ser un problema de teora de grafos cuya solucin public Euler en su artculo Solucin de un problema relativo a la geometra de posicin.
Bases Tericas Grafos: Definiciones Bsicas Un grafo es bsicamente un conjunto de puntos se dice que es no vaco (al menos contiene un elemento) de puntos llamados vrtices y un conjunto de lneas llamadas aristas cada una de las cuales une dos vrtices. Se llama lazo a una arista que une un vrtice consigo mismo. Se dice que dos vrtices son adyacentes si existe una arista que los une, es decir comparten la misma arista.
Si
al nmero
de aristas que inciden en el mismo (por convenio de considera que un lazo cuenta dos veces al determinar el grado de su vrtice). Se dice que un grafo es conexo si no puede expresarse como la unin de dos grafos de vrtices disjuntos. Se llama trayectoria a un camino simple en el que todos sus vrtices (salvo probablemente el inicial y el final) son distintos y se
denomina circuito a una trayectoria cerrada con al menos una arista. Se llama camino euleriano a un camino simple que contiene todas las aristas del grafo y se denomina circuito euleriano a un camino euleriano cerrado. Se dice que un grafo es euleriano si contiene un circuito euleriano.
Clasificacin:
de vrtices, y de E, un conjunto de pares no ordenados de elementos distintos de V . A esos pares se les llama aristas o lados. En algunos casos lo grafos simples no bastan para modelar ciertas situaciones en las cuales se requiere de la existencia de mltiples aristas entre par de vrtices. En este caso no es suficiente definir las aristas como par de vrtices.
Se dice que las aristas e1, e2 son aristas mltiples o paralelas si f(e1) = f(e2). Los multigrafos definidos no admiten bucles o lazos (aristas que
conectan un vrtice consigo mismo). Usamos en este caso, pseudografos que son ms generales que los multigrafos.
dice que una arista e es un bucle o lazo si f(e) = {u, u} = {u} para algn u V.
vrtices, un conjunto E de aristas y una funcin f de E en {(u, v)|u, v V } Se dice que las aristas e1, e2 son aristas mltiples o paralelas si f(e1) = f(e2). La diferencia entre grafo y digrafo es que el ltimo tiene los lados dirigidos y se entiende como un grafo dirigido.
Teniendo ya nociones bsicas referentes a grafos es posible representar concretamente la situacin referente al problema de los 7 puentes de konigsbergs el grafo quedara de la siguiente manera
Segn las definiciones que hemos visto, lo que se desea saber es si este grafo en euleriano, es decir, si contiene un circuito euleriano (es decir, un camino que contiene a todas las aristas del grafo sin que ninguna se repita y que comienza y termina en el mismo vrtice).
Si
no tiene vrtices aislados entonces cualquier par de vrtice conectados por la parte del circuito que va de conexo. Por otra parte, como
a . Por tanto
decir, un camino simple y cerrado que contiene a todas las aristas. Por tanto por cada arista que llegue a un vrtice debe haber otra
que salga del mismo y en consecuencia el grado de cada vrtice es un nmero par.
Partimos de que
es conexo y todos sus vrtices tienen grado par. es 1 2 el resultado es inmediato. tiene aristas y que
Si el nmero de aristas de
el resultado es cierto para los grafos que cumplan las condiciones y tengan menos de aristas
En el grafo de la ciudad de Knigsberg que se obtuvo, se calculan el grado de todos sus vrtices. Dando como resultado vrtices con grado que hay tres
con grado par. Por tanto, segn el teorema anterior, este grafo no contiene un circuito euleriano, esto es, no podemos comenzar en un punto de la ciudad y recorrer cada uno de los puentes slo una vez y terminar en el punto de partida.
Dejando demostrado que el problema de los puentes de Knigsberg no posee solucin, sin embargo se procede al diseo de un programa que determine mediante el ingreso de ciertos datos la posibilidad de recorrer todos los caminos una y solo una vez partiendo de un origen y llegando al mismo punto de origen. Se ha determinado un procedimiento para probar si en un sistema dado de vrtices y aristas, que seran a su vez los ros y puentes; la
posibilidad de cruzar cada puente una sola vez, en el cual se diga si dicho grafo posee o no un camino euleriano, dicho procedimiento es el siguiente: 1. Son nombrados los distintos vrtices, que seran en nuestro caso las llamadas regiones separadas por el agua mediante A, B, C, etc. (agrupadas en una columna) 2. Luego se contabilizan el total de aristas, que vendran siendo el nmero total de puentes, a dicho nmero se le suma 1 es decir, lo aumento en una unidad, el total es almacenado, y es la variable a comparar, podra decirse de referencia 3. Escribo un asterisco junto a cada vrtice es decir al lado de cada letra a la que corresponde un nmero par. 4. Posteriormente en una segunda columna se anota el grado de cada vrtice, es decir el nmero de puentes que conducen a cada regin particular. 5. En una tercera columna escribo, junto a cada nmero par la mitad de dicho nmero, y junto a cada nmero impar, la mitad de este nmero impar aumentado en una unidad. Por ejemplo de ser A de grado 3, por ser impar en dicha 3era columna ira 1,5 aumentado a la siguiente unidad seria 2.
6. Sumo la tercera columna. Si el resultado de la suma es una unidad menor que, o igual que a la variable de referencia se dice que la ruta es posible. 7. Si el resultado de la suma es una unidad menor que el nmero de la parte superior, la ruta entonces ha de comenzar en una regin sealada con un asterisco, y que cuando estos dos nmeros son iguales, entonces la ruta ha de comenzar en una regin que no contenga ningn asterisco. En modo contrario si el resultado de dicha suma es superior al valor de referencia se dice que la ruta no es posible.
Valor Referencia= Naristas + 1 Vrtice par /2 Vrtices Grado de C/vrtice Vrtice impar /2 llevado a la unidad sig.
Para los siete puentes de Knigsberg seria: Valor Referencia= 7+1 = 8 Vrtice par /2 Vrtices Grado de C/vrtice Vrtice impar /2 llevado a la unidad sig. A B C D 5 3 3 3 3 2 2 2
=9 Resultado es comparado con Referencia.
Vrtices
Grado de C/vrtice
A B C D E F
2 2 4 4 2 2
=8
1 1 2 2 1 1
Dando como conclusin del grafo anterior que: El total de la suma es 8, se compara con el valor de referencia 8 = 8, por ser iguales dicha ruta es posible
Solucin
La propuesta final, es que deduciendo que el problema del puente de konigsberks, no tiene solucin alguna, aplicando la teora de grafos utilizando el algoritmo de dijsktra para establecer los caminos ms cortos posibles entre los vrtices 1, 2, 3, 4, 5, 6, teniendo un punto de referencia.
procesador
Pentium4 o superior
Sistema operativo
Windows xp o superior
Memoria Ram
512 en memoria Ram o superior Microsoft Internet Explorer 8.0 Espacio adicional en el disco duro puede ser necesario para algunos productos productos
Internet explorer
Monitor VGA
Public Class frmPrincipal Const N = 7 Const NoSeVe = -1 Public Matriz(N, N) As Integer Public MatrizD2(N), MatrizPredecesores2(N), MatrizVistos2(N) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load lblPresentacion.Width = Me.Width Panel1.Width = Me.Width - 30 End Sub Private Sub DeshabilitarBotones() btn1R.Enabled = False btn2R.Enabled = False btn3R.Enabled = False btn4R.Enabled = False btn5R.Enabled = False btn6R.Enabled = False End Sub
Private Sub HabilitarBotones() btn1R.Enabled = True btn2R.Enabled = True btn3R.Enabled = True btn4R.Enabled = True
btn5R.Enabled = True btn6R.Enabled = True End Sub Private Sub CargarMatriz() Matriz(0, 0) = 0 Matriz(0, 1) = txtR1.Text Matriz(0, 2) = txtR2.Text Matriz(0, 3) = txtR3.Text Matriz(0, 4) = NoSeVe Matriz(0, 5) = NoSeVe Matriz(0, 6) = NoSeVe Matriz(1, 0) = txtR1.Text Matriz(1, 1) = 0 Matriz(1, 2) = txt12.Text Matriz(1, 3) = txt13.Text Matriz(1, 4) = txt14.Text Matriz(1, 5) = txt15.Text Matriz(1, 6) = NoSeVe Matriz(2, 0) = txtR2.Text Matriz(2, 1) = txt12.Text Matriz(2, 2) = 0 Matriz(2, 3) = txt23.Text Matriz(2, 4) = txt24.Text Matriz(2, 5) = NoSeVe Matriz(2, 6) = NoSeVe Matriz(3, 0) = txtR3.Text Matriz(3, 1) = txt13.Text
Matriz(3, 2) = txt23.Text Matriz(3, 3) = 0 Matriz(3, 4) = txt34.Text Matriz(3, 5) = txt35.Text Matriz(3, 6) = txt36.Text Matriz(4, 0) = NoSeVe Matriz(4, 1) = txt14.Text Matriz(4, 2) = txt24.Text Matriz(4, 3) = txt34.Text Matriz(4, 4) = 0 Matriz(4, 5) = txt45.Text Matriz(4, 6) = txt46.Text Matriz(5, 0) = NoSeVe Matriz(5, 1) = txt15.Text Matriz(5, 2) = NoSeVe Matriz(5, 3) = txt35.Text Matriz(5, 4) = txt45.Text Matriz(5, 5) = 0 Matriz(5, 6) = txt56.Text Matriz(6, 0) = NoSeVe Matriz(6, 1) = NoSeVe Matriz(6, 2) = NoSeVe Matriz(6, 3) = txt36.Text Matriz(6, 4) = txt46.Text Matriz(6, 5) = txt56.Text Matriz(6, 6) = 0
Label1R.Text = txtR1.Text Label2R.Text = txtR2.Text Label3R.Text = txtR3.Text Label12.Text = txt12.Text Label13.Text = txt13.Text Label14.Text = txt14.Text Label15.Text = txt15.Text Label23.Text = txt23.Text Label24.Text = txt24.Text Label34.Text = txt34.Text Label35.Text = txt35.Text Label36.Text = txt36.Text Label45.Text = txt45.Text Label46.Text = txt46.Text Label56.Text = txt56.Text
End Sub Private Sub Dijkstra2(ByRef Origen, ByRef Destino) Dim i, Ultimo, X As Integer
CargarMatriz()
For i = 0 To (N - 1) MatrizPredecesores2(i) = 0 'Inicializa la Matriz con valores "" MatrizD2(i) = 999999 'Inicializa la Matriz con valores "infinitos" MatrizVistos2(i) = False
Next
MatrizD2(Origen) = 0 'Distancia del Vrtice Origen (Refugio "R") MatrizVistos2(Origen) = True 'Marca el Vrtice Origen (Refugio "R") como visitado
While MatrizVistos2(Destino) = False For i = 1 To (N - 1) If MatrizVistos2(i) = False Then If Matriz(Ultimo, i) <> NoSeVe Then If MatrizD2(i) > (MatrizD2(Ultimo) + Matriz(Ultimo, i)) Then MatrizD2(i) = (MatrizD2(Ultimo) + Matriz(Ultimo, i)) 'Se actualiza la matriz de distancias MatrizPredecesores2(i) = Ultimo 'Se guarda el Vrtice visitado End If End If End If Next X = VerticeMenor2() 'Vrtice no visitado con menor distancia MatrizVistos2(X) = True
'Se actualizan las coordenadas del ltimo vrtice Ultimo = X End While
End Sub Private Function VerticeMenor2() As Integer Dim i, MenorVertice, Menor As Integer
Menor = 999999
For i = 0 To (N - 1) If MatrizVistos2(i) = False Then If Menor > MatrizD2(i) Then Menor = MatrizD2(i) MenorVertice = i End If End If
Next
VerticeMenor2 = MenorVertice End Function Private Function Camino(ByRef Origen As Integer, ByVal Destino As Integer) As String Dim SumaCamino, i As Integer Dim Camino2 As String
Camino2 = "" For i = 0 To (N - 1) If (Matriz(0, i) <> -1) Then If Camino2 = "" Then If Matriz(0, i) = 0 Then
Camino2 = "R" End If Camino2 = CStr(i) SumaCamino = Matriz(0, i) Else Camino2 = Camino2 + CStr(i) SumaCamino = SumaCamino + Matriz(0, i) End If End If If SumaCamino = MatrizD2(Destino) Then i = (N - 1) End If Next Camino = Camino2 End Function Private Sub btn1R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1R.Click Dijkstra2(0, 1)
If MatrizPredecesores2(1) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(1)) Else lblResultado.Text = lblResultado.Text + "1"
End If
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(1))
Private Sub btn2R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn2R.Click Dijkstra2(0, 2)
lblResultado.Text = ""
If MatrizPredecesores2(2) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(2)) Else lblResultado.Text = lblResultado.Text + "2" End If
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(2))
End Sub
Private Sub btn3R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn3R.Click Dijkstra2(0, 3)
If MatrizPredecesores2(3) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(3)) Else lblResultado.Text = lblResultado.Text + "3" End If
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(3))
Private Sub btn4R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn4R.Click Dijkstra2(0, 4)
If MatrizPredecesores2(4) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(4)) Else lblResultado.Text = lblResultado.Text + "4" End If
Next
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(4))
Private Sub btn5R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn5R.Click Dijkstra2(0, 5)
If MatrizPredecesores2(5) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(5)) Else lblResultado.Text = lblResultado.Text + "5" End If
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(5))
Private Sub btn6R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn6R.Click Dijkstra2(0, 6)
If MatrizPredecesores2(6) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(6)) Else lblResultado.Text = lblResultado.Text + "6" End If
lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(6))