VBAのツリーデータ構造を使用する
質問
私はVBAに慣れていて、TiC TAC TOEのための機械学習プログラムを行おうとしています。私は勝つ可能性をハードコードしたくない。
機械学習プログラムのために私が思い付いた最善は、行うことができるすべての可能な動きを持つ木構造を持つことです、そしてそれがその分岐で失うたびに木の枝をカットさせることです。
人々が演奏したのかを示すための次のような方法で、そして手紙がゲームが進行した命令として書かれた順序で書かれています
a|b|c
-----
d|e|f
-----
g|h|i
.
ABDGFCE - コンピュータが勝利し、Aを最初に再生し、B秒、D 3番目の......
データツリーをお願いします。
レベル0:A(コンピュータは常にa)
レベル1:すでに再生されているように、Aを除くすべての文字
レベル2:レベル0の各文字の場合は、その直前の1つを除くすべての文字とa
など、そのツリーのすべてのレベルの移動が可能になるまで。
私はVBAでこの構造を実装する方法を探していましたが、マイクロソフトのWebサイトはヘルプなしであり、フォーラムはバイナリやソートツリーについてのみ話します。誰かが正しい方向に私を指しているか、私が試してみるべきことについて私にいくつかのポインタを与えますか?この問題を解決するためのより良い方法は何ですか?この解決策が実行不可能な場合は?
ありがとう、
カリム
解決
TIC-TAC-TOEテーブルの9桁を埋めるための「唯一の」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
.
もちろん、大多数のゲームはすべて9つの場所が埋められた前に終了します。コンピュータが失われた場合、その項目は削除されます。
編集#1:
ウェインG.Dunn は、変動回数を減らすことができることを示唆している。コンピュータ(プレーヤー#1)には、 xを配置する9つの可能な場所があります。プレーヤー#2には、 oなどを配置するための8つの可能な場所があります。
これは9 * 8 * 7 * 6 * 5 * 4 * 3 * 2または9の階乗を得ます。
しかし、すべての9つの場所が埋められる前にゲームが終了することができます。したがって、362880のバリエーションの多くは廃棄することができます............私はただ何度もわからない。