在VBA中使用树数据结构

时间:2014-08-01 20:18:00

标签: excel vba excel-vba tree

我越来越熟悉VBA,我正在尝试为Tic Tac Toe做一个机器学习计划。我不想只是硬编码获胜的可能性。

我为机器学习程序提出的最好的方法是拥有一个树形结构,其中包含可以进行的所有可能的移动,然后让计算机在树枝丢失的时候剪掉树枝。

例如,通过以下方式表示人们在哪里玩,以及字母的顺序是按照游戏进度的顺序编写的

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

abdgfce - 表示计算机获胜,a先播放,b秒播放,第三播放....

我想要一个看起来像这样的数据树:

0级:a(计算机始终以a开头)

等级1:除了a之外的所有字母,因为它已被播放

等级2:对于等级0中的每个字母,除了前面的字母和

之外的所有字母

对于树的所有级别等等,直到它们不再可能移动为止。

我试图寻找在VBA中实现此结构的方法,但微软网站没有任何帮助,论坛只提到二进制或排序树。有人会指出我正确的方向或给我一些指示,我应该尝试什么?如果这个解决方案不可行,有什么更好的方法来解决这个问题?

谢谢,

卡里姆

1 个答案:

答案 0 :(得分:1)

只有"只有" 362,880方式填补了一个井字桌的九个位置。通过放置:

,可以在 A 列中生成完整集

ABCDEFGHI

在单元格 B1 并运行 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

当然,大多数比赛将在所有九个名额都填满之前结束。如果计算机丢失,该项目被删除等

修改#1:

Wayne G. Dunn 建议可以减少变化的数量。计算机(玩家#1)有九个可能放置 X的地方。玩家#2然后有八个可能放置 O 等的地方。

这产生9 * 8 * 7 * 6 * 5 * 4 * 3 * 2或9阶乘。

然而,游戏可以在所有九个位置都填满之前结束。因此,许多362880变种可以被丢弃............我只是不知道有多少。