Pregunta

Me estoy familiarizando con VBA y estoy intentando hacer un programa de aprendizaje automático para TIC TAC TOE. No quiero simplemente un código duro las posibilidades de ganar.

Lo mejor que he creado para un programa de aprendizaje de máquinas es tener una estructura de árbol con todos los movimientos posibles que se pueden hacer, y luego hacer que la computadora corte las ramas del árbol siempre que pierda con esa sucursal.

Por ejemplo, con la siguiente manera de denotar donde las personas han jugado, y la orden las letras se escriben como el orden que el juego ha progresado

a|b|c
-----
d|e|f
-----
g|h|i

abdgfce - significa que la computadora gana, se jugó primero, b segundo, d tercer ...

Me gustaría tener un árbol de datos que se vea:

Nivel 0: A (la computadora siempre comienza con A)

Nivel 1: Todas las letras excepto A, como ya se ha jugado

Nivel 2: Para cada letra en el nivel 0, todas las letras, excepto el derecho antes de él y un

y así sucesivamente para todos los niveles del árbol hasta que no sean más movimientos posibles.

Intenté buscar formas de implementar esta estructura en VBA, pero el sitio web de Microsoft no tenía ayuda y los foros solo hablan de árboles binarios o de clasificación. ¿Alguien me apuntará en la dirección correcta o me daría algunos punteros sobre qué debería intentarlo? ¿Cuál es una mejor manera de resolver este problema si esta solución no es factible?

Gracias,

karim

¿Fue útil?

Solución

Hay "solo" 362,880 manera de llenar los nueve lugares en una mesa Tic-Tac-Toe.El conjunto completo se puede generar en la columna a colocando:

abcdefghi

en la celda B1 y corriendo getstring ():

Dim ll As Long
Dim CurrentRow As Long

Sub GetString()
    Dim InString As String
    InString = Sheets("Sheet1").Range("B1")
    ActiveSheet.Columns(1).Clear
    CurrentRow = 1
    Application.ScreenUpdating = False
        Call GetPermutation("", InString)
    Application.ScreenUpdating = True
End Sub

Sub GetPermutation(x As String, y As String)
    '   The source of this algorithm is unknown
    Dim i As Long, j As Long
    j = Len(y)
    If j < 2 Then
        Cells(CurrentRow, 1) = x & y
        CurrentRow = CurrentRow + 1
    Else
        For i = 1 To j
            Call GetPermutation(x + Mid(y, i, 1), _
            Left(y, i - 1) + Right(y, j - i))
        Next
    End If
End Sub

xx

Por supuesto, la mayoría de los juegos terminarán antes de que se llenen los nueve lugares.Si la computadora pierde, ese artículo se elimina, etc.

Editar # 1:

Wayne G. Dunn sugirió que se puede reducir el número de variaciones.La computadora (Jugador # 1) tiene nueve lugares posibles, colocan su x. el jugador # 2 luego tiene ocho lugares posibles para colocarla o. etc.

Esto produce 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 o 9 factorial.

Sin embargo, el juego puede terminar antes de que se llenen los nueve lugares.Por lo tanto, muchas de las 362880 variaciones se pueden descartar ............ Simplemente no sé cuántos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top