うーん。 Habréに対するモデレーターの行動を規制するポイントの1つは、次のように定式化されています。IT関連のトピックに弱く関連している記事やまったく関連していない記事をスキップしないでください。彼の面白くてエキサイティングなペットプロジェクトのプログラミングのいくつかの段階について説明している彼の投稿、クロスをプレイするためのFANNルビーラッパーに基づいてニューラルネットワークを構築する単純なAIが直接関連しているかどうかをすぐに著者に考えさせたのは「ITトピック」ゼロに?私の話のプログラムコードのロジックの説明が最も重要であるとはほど遠いので、質問には隠された浮気は含まれていません。 「はい、これは邪悪な皮肉です!」 - あなたは言う。 - 私は知らない。
OK。この事実上の発展は、著者、多くの知人、さらには友人の多くの奇妙な観察の実例です-近年の友人は...彼が非常に、非常にだったときの彼のかつての文学の教訓を思い出させました中等ソビエト学校。何かによってのみ「通過」することは常に可能であるという彼の永続的な信念にもかかわらず、ロシアの古典の特定の文字は、時間の経過とともにますます頻繁に記憶されます。それともそうあるべきですか?
したがって、すぐに...最初の起動後、プログラムは自己学習プロセスを開始し、数万(1分から最大2)の数千のゲーム(もちろん、その数は編集に使用できます)で遊んでいます。構成内;以下で説明するあまり一般的ではないアルゴリズムを考えると、このAIのロジックの基礎になります-この種の実験は、推論のための興味深い資料を提供することもできます)。これは、他の多くの人工知能に固有の学習プロセスをシミュレートしますが、両方の「プレーヤー」が等しくプレイ方法を知らず、完全にランダムな動きをするという唯一の違いがあります。ただし、ゲームのルールが適用されます。ランダムな動きが一致しない場合、プログラムを続行する必要があり、それに応じて、勝者側が勝者側に移動します。すべてが公平です:消去やハッキング、隠された好み、偽のドーピングテストはありません。これは、実際のスポーツゲームの結果を覆すことがよくあります。
次に、ゲームはユーザーから始まります:csvファイルにログインしたゲームプロトコルが配列に変換され、2番目の数字(ゼロ)で遊ぶAIは、哲学的で奇妙なことに非常にロシアの問題を解決し、ランダムの不条理と混沌は、あなたが勝つか、少なくとも生きている非常に論理的な思考の相手とのゲームを引き分けに減らすことを可能にするものを動かします。
, ? , : , . , , (, - "") : "" , ... , , .
- , ( ), - . - ... , - , , .
. : , . , , , , , , , : (/). -, Tic Tac Toe - , - ? - , . , , , , - , , ?... , "" ; , " " , - " ", , " !".
, Artificial Intelligence. , 3x3, -, ? , , , , , , , - , ? AI, " " ; - , .
, " ". () , , - . ? , :
if row[6].to_i - row[3].to_i == 1
x_data.push([row[0].to_i])
y_data.push([1]) # , .. , .
end
? - . , .. . ?
, Tic Tac Toe AI with Neural Network ( ). , – : , – – . , , , .
, , - , , . , , , ... ?
. “"... , ? – , , : “ , , ”. , “ ” ; , “ ”. , , ; , . , , , , , , , , : , “ , ”.
. , , , . , , - , ... , - , , , .
- ( - life style). , :
WINNING_TRIADS = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[6, 4, 2],
[0, 4, 8]
].freeze
, csv- , :
def fork?
WINNING_TRIADS.select do |x|
@board[x[0]] == @board[x[1]] && @board[x[2]].class != @board[x[0]].class &&
place_x?(x[0]) ||
@board[x[1]] == @board[x[2]] && @board[x[0]].class != @board[x[2]].class &&
place_x?(x[1]) ||
@board[x[0]] == @board[x[2]] && @board[x[1]].class != @board[x[2]].class &&
place_x?(x[0])
end
end
, ...
if @game.fork?.size > 1
... .
, . : , , , . , .
:
DANGEROUS_SITUATIONS_1 = [
[6, 4, 2],
[0, 4, 8]
].freeze
DANGEROUS_SITUATIONS_2 = [
[0, 4, 7],
[0, 4, 5],
[2, 4, 3],
[2, 4, 7],
[3, 4, 8],
[1, 4, 8],
[1, 4, 6],
[5, 4, 6]
].freeze
def fork_danger_1?
DANGEROUS_SITUATIONS_1.detect do |x|
@board[x[0]] == @board[x[2]] &&
@board[x[0]] != @board[x[1]]
end
end
def fork_danger_2?
DANGEROUS_SITUATIONS_2.detect do |x|
@board[x[0]] == @board[x[2]] &&
@board[x[0]] != @board[x[1]]
end
end
def fork_danger_3?
DANGEROUS_SITUATIONS_1.detect do |x|
@board[x[0]] != @board[x[2]] &&
@board[x[1]] == @board[x[2]]
end
end
, , , , , AI : 1. , 2. 3. (.. , , , ). , , . , Neural Network.
array_of_games.each do |row|
row.each do |e|
next unless e == current_position
if row[6].to_i - row[3].to_i == 2 && row[4] == 'O' && row[2].to_f != 0.2
unacceptable_moves_array << row[0]
# Find moves that inevitably lead to a fork:
elsif fork_danger_1 && row[3].to_i == 3 && row[0].to_i.odd?
unacceptable_moves_array << row[0]
elsif (fork_danger_2 || fork_danger_3) && row[3].to_i == 3 && row[0].to_i.even?
unacceptable_moves_array << row[0]
end
next if row[5].nil?
# Find moves that may lead to a fork:
array_of_moves_to_fork << row[0] if row[3].to_i == row[5].to_i
# Find attacking moves:
attack_moves_array << row[0] if row[3].to_i == row[5].to_i && row[6].to_i < 7
end
end
, , , AI , . ... , , , , ... , "" . , , - , , ... ? - ", , ", .
array_of_games.each do |row|
row.each do |e|
next unless e == current_position
next if arrays[0].include?(row[0])
unless arrays[1].include?(row[0]) && !arrays[2].include?(row[0])
if row[6].to_i - row[3].to_i == 1
x_data.push([row[0].to_i])
y_data.push([1])
elsif row[6].to_i - row[3].to_i == 3
if arrays[2].include?(row[0])
x_data.push([row[0].to_i])
y_data.push([0.9])
elsif arrays[1].include?(row[0])
x_data.push([row[0].to_i])
y_data.push([0.3])
end
else
x_data.push([row[0].to_i])
y_data.push([row[2].to_f])
end
end
end
:
data = nn_data(board, fork_danger_1, fork_danger_2, fork_danger_3, array_of_games)
fann_results_array = []
train = RubyFann::TrainData.new(inputs: data[0], desired_outputs: data[1])
model = RubyFann::Standard.new(
num_inputs: 1,
hidden_neurons: [4],
num_outputs: 1
)
model.train_on_data(train, 5000, 500, 0.01)
data[0].flatten.each do |i|
fann_results_array << model.run([i])
end
result = data[0][fann_results_array.index(fann_results_array.max)]
: ( csv-) Neural Network .
- , - , . csv- ( , ), . , - - , , .
PS説明されているコードは、私のgithubで常に完全に(記事の形式が示すように断片的にではなく)利用できます。もちろん、誰でもgitクローンを作成してコードを試すことも、単にプレイすることもできます。私はWindowsでruby-applicationを実行することを支持していません。これはあまり良い考えではありませんが、この場合は機能するので、試してみました。おそらく、Linuxコンソールよりも印象的ではないかもしれませんが、ロジックは機能します。