Teoría de colas y generación de variables

Buenas tardes experto, espero pueda ayudarme con esta pregunta. Gracias de antemano.Suponga que tres barcos A, B y C se encuentran en combate. La fuerza de cada barco se mide por la probabilidad que tiene de acertar a su oponente al disparar. La probabilidad que tiene el barco A de eliminar a un oponente es de 0.5 mientras que las probabilidades de B y C son de 0.40 y 0.3 respectivamente. El tiempo entre disparos es una distribución exponencial con media de 1 minuto entre cada disparo. Un barco siempre disparará al más fuerte de sus oponentes (o de los que aún queden). El combate continuará hasta que queden uno o ceros barcos. Resuelve utilizando un modelo de simulación y Realiza 10 combates. Nota: en este caso no existe posibilidad de que los barcos disparen simultáneamente ya que el tiempo de disparo es aleatorio.

  1. Determina el número de veces que cada barco gana.
  2. Determina cuánto tiempo en promedio duran los combates.

1 respuesta

Respuesta
3

·

Por fin lo tengo.

He hecho el simulador en Excel por las facilidades de da en la presentación, aunque no es el lenguaje más eficiente no mucho menos, pero para lo que te piden es más que suficiente y yo he probado hasta una partida de 100000 combates. Lo que no sé por qué pasa es que deja de marcar el número de partida a partir de la 5 mil y pico, problema de Excel, pero aunque no marca evolución no significa que no siga trabajando y tras el rato que corresponde da los resultados.

Como puedes ver he hecho que puedas elegir el número de combates, es que con 10 solo los resultados no eran nada representativos. Si manejas un poco las macros incluso puedes cambiar el número de contendientes y la probabilidad de acierto. Si cambias las probabilidades de acierto que estén en orden descendente, ya que lo que el disparador dispara al primero de la lista que está vivo, por eso has debido hacer que sea el que más probabilidad tenga entre ellos.

La notación de barcos A, B, C la he cambiado por 1,2,3

La macro es la macro sin comentarios, nunca los he escrito.

La parte más delicada es calcular el tiempo transcurrido de acuerdo al promedio de tiempo de la exponencial.

Yo lanzo un número aleatorio y la hago corresponder el tiempo que en la función de distribución da la probabilidad de ese número aleatorio, es decir, si p es el promedio de tiempo será

$$\begin{align}&F(t)=rnd=1-e^{-\frac tp}\\&\\&e^{-\frac tp}=1-rnd\\&\\&-\frac tp=ln(1-rnd)\\&\\&t=-p·ln(1-rnd)\\&\\&\end{align}$$

No te preocupes por el signo ya que el logaritmo es negativo y da un tiempo positivo.  Y aunque yo he puesto ln(1-rnd)  en VisualBasic el logaritmo neperiano es log(1-rnd)

·

Y ya te pasaré la hoja de Excel para que tu puedas hacer las pruebas que quieras.

Lo que a mi me interesaba eran los datos de ejecutar muchas partidas y lo he hecho con 100000 que podría ser alguna más a lo mejor.

El resultado es que

Jugador 1, gana el 26.41% de las partidas

Jugador 2, gana el 33.03% de las partidas

Jugador 3, gana el 40.56% de las partidas

Y el promedio de tiempo es 5.21 minutos.

Y todo tiene su explicación. Aunque el jugador 1 tiene más fuerza de disparo, es al que atacan siempre los otros dos si esta vivo, por eso lo lleva peor. Y en el extremo opuesto está el jugador 3, que tiene el que menos fuerza de disparo, pero siempre llega a la final ya que los otros dos no le disparan mientras estén los dos.

Te dejo la simulación que te piden de 10, aunque te decía que no es representativa de nada

Los rojos son los disparos donde hay sangre.

Este es el enlace donde puedes descargar la hoja.

https://drive.google.com/file/d/0B3nG6r7qbZZ_d1RUMlV6bXVmUmM/view?usp=sharing

Y eso es todo.

¡Ah bueno!

El listado del programa puede servirle a alguien, lo voy a poner.

Sub proceso()
Const RIVALES = 3, PROMED = 1#
Dim fuerza
fuerza = Array(0.5, 0.4, 0.3)
Dim vive(RIVALES) As Boolean
Dim ganadas(RIVALES), disparos(RIVALES), aciertos(RIVALES) As Long
Dim tiempo, tiempoCombate, tiempoTotal As Double
Dim COMBATES, combate, viven, disparador, disparosCombate, atacado As Integer
Do
  COMBATES = InputBox("Introduzca el número de combates", "Número de combates", "10")
Loop Until COMBATES > 1
Worksheets("Hoja Combates").Activate
Cells.Clear
Randomize
tiempoTotal = 0
For i = 1 To RIVALES
    ganadas(i) = 0
    disparos(i) = 0
    aciertos(i) = 0
Next
For combate = 1 To COMBATES
    tiempoCombate = 0
    viven = RIVALES
    For i = 1 To RIVALES
        vive(i) = True
    Next
    disparo = 1
    While viven > 1
        tiempo = -PROMED * Log(1 - Rnd)
        tiempoCombate = tiempoCombate + tiempo
        Do
            disparador = 1 + Int(RIVALES * Rnd())
        Loop Until vive(disparador)
        disparos(disparador) = disparos(disparador) + 1
        For i = 1 To RIVALES
            If i <> disparador And vive(i) Then
                atacado = i
                Exit For
            End If
        Next
        Cells(combate + 10, disparo) = Format(tiempoCombate, "0.00   ") & Str(disparador) & " a" & Str(atacado)
        If Rnd() < fuerza(disparador - 1) Then
            vive(atacado) = False
            viven = viven - 1
            aciertos(disparador) = aciertos(disparador) + 1
            Cells(combate + 10, disparo).Interior.Color = vbRed
        End If
        disparo = disparo + 1
    Wend
    ganadas(disparador) = ganadas(disparador) + 1
    Cells(combate + 10, disparo) = "GANA " & Str(disparador)
    Cells(combate + 10, disparo).Interior.Color = vbYellow
    tiempoTotal = tiempoTotal + tiempoCombate
    If combate Mod 100 = 0 Then
        Cells(1, 1) = combate
    End If
Next
Cells(1, 1) = "JUGADOR"
Cells(1, 2) = "GANADAS"
Cells(1, 3) = "%GANADAS"
Cells(1, 4) = "DISPAROS"
Cells(1, 5) = "ACIERTOS"
Cells(1, 6) = "%ACIERTOS"
For i = 1 To RIVALES
    Cells(1 + i, 1) = i
    Cells(1 + i, 2) = ganadas(i)
    Cells(1 + i, 3) = Format(ganadas(i) / COMBATES, "    ##0.00 %")
    Cells(1 + i, 4) = disparos(i)
    Cells(1 + i, 5) = aciertos(i)
    Cells(1 + i, 6) = Format(aciertos(i) / disparos(i), "    ##0.00 %")
Next
Cells(RIVALES + 3, 1) = "Time Prom"
Cells(RIVALES + 3, 2) = Format(tiempoTotal / COMBATES, "    ##0.00")
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas