Discretas

También podría gustarte

Está en la página 1de 27

Universidad Fermn Toro Facultad de Ingeniera Cabudare Edo Lara

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

es un vrtice de un grafo, se denomina grado de

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:

Grafo simple G(V,E) consta de V , un conjunto no vaco

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.

Multigrafo G(V,E) consta de un conjunto V de vrtices, un V, u 6= v}.

conjunto E de aristas y una funcin f de E en {{u, v}|u, v

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.

Pseudografo G(V,E) consta de un conjunto V de vrtices, V }. Se

un conjunto E de aristas y una funcin f de E en {{u, v}|u, v

dice que una arista e es un bucle o lazo si f(e) = {u, u} = {u} para algn u V.

Grafo dirigido o dgrafo G = (V,E) consta de un conjunto

V de vrtices, un conjunto E de aristas, que son pares ordenados de elementos de V .

Multigrafo dirigido G(V,E) consta de un conjunto V de

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).

Teorema: Un grafo es euleriano y sin vrtices aislados es conexo y el

grado de todos sus vrtices es par. Demostracin:




Si

es euleriano entonces contiene un circuito euleriano y como y estn es

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

es euleriano contiene un circuito euleriano, es

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

Procedemos por induccin: supongamos que

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

y un vrtice con grado . Es decir, no hay ninguno

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.

= Suma total Resultado es comparado con Referencia.

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.

Ahora probemos con un grafo euleriano cuyo nmero de aristas es 8

Valor Referencia= 8+1 = 9 Vrtice par /2

Vrtices

Grado de C/vrtice

Vrtice impar /2 llevado a la unidad sig.

A B C D E F

2 2 4 4 2 2
=8

1 1 2 2 1 1

Resultado es comparado con Referencia.

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.

Requerimientos del sistema requerimiento minima recomendada

procesador

procesador 486DX/66-MHz o superior Windows 98

Pentium4 o superior

Sistema operativo

Windows xp o superior

Memoria Ram

128 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

Microsoft Internet Explorer 4.01

Espacio en disco duro Instalacin tpica: 76 MB Instalacin mxima: 94 MB Unidad de CD-ROM

monitor Microsoft mouse o dispositivo sealador compatible

Monitor VGA

se recomienda Super VGA

Codigo Fuente del programa en visual basic

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

Ultimo = Origen X = Origen

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)

lblResultado.Text = "" lblResultado.Text = "Camino desde 1 a R:" + Camino(0, 1) & vbCrLf

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 + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(1))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizD:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizD2(i)) + ", " Next End Sub

Private Sub btn2R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn2R.Click Dijkstra2(0, 2)

lblResultado.Text = ""

lblResultado.Text = "Camino desde 2 a R:" + vbCrLf

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 + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(2))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizD:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizD2(i)) + ", " Next

End Sub

Private Sub btn3R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn3R.Click Dijkstra2(0, 3)

lblResultado.Text = "" lblResultado.Text = "Camino desde 3 a R:" + vbCrLf

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 + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(3))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizD:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizD2(i)) + ", " Next End Sub

Private Sub btn4R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn4R.Click Dijkstra2(0, 4)

lblResultado.Text = "" lblResultado.Text = "Camino desde 4 a R:" + vbCrLf

If MatrizPredecesores2(4) <> 0 Then lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(4)) Else lblResultado.Text = lblResultado.Text + "4" End If

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", "

Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(4))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizD:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizD2(i)) + ", " Next End Sub

Private Sub btn5R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn5R.Click Dijkstra2(0, 5)

lblResultado.Text = "" lblResultado.Text = "Camino desde 5 a R:" + vbCrLf

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 + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(5))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next End Sub

Private Sub btn6R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn6R.Click Dijkstra2(0, 6)

lblResultado.Text = "" lblResultado.Text = "Camino desde 6 a R:" + vbCrLf

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 + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "Distancias mnimas:" + vbCrLf lblResultado.Text = lblResultado.Text + CStr(MatrizD2(6))

lblResultado.Text = lblResultado.Text + vbCrLf lblResultado.Text = lblResultado.Text + "MatrizPredecesores:"

For i = 1 To (N - 1) lblResultado.Text = lblResultado.Text + CStr(MatrizPredecesores2(i)) + ", " Next End Sub

Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub End Class

También podría gustarte