ノリでコンピュータ将棋を開発し始めた。 その2

いやー、雷と北上を買うか悩む。最近のフィギュアは地味に高いんで財布の紐がキツキツです。


艦隊これくしょん -艦これ- 雷 (1/7スケール PVC製塗装済完成品)

ただそんなことより仕事のデッドラインが近くて、コンピュータ将棋に全然手が付けられていないというオチでヤバイ。
ただ、実はこの間ブログを通勤電車で書けるようにしようと思って、そのためにSurface Pro 3を購入するという無駄を決行。

今朝会社に行くまでの通勤電車で座れたのでちょっと仕事をやったあとに思い出したかのように将棋のコードを書いたのでポスト。

とは言え、とりあえず擬似コード(ふんわりJS風)で探索部のMinMax(NegaMax法にしたけど)を書いただけ。多分10分ちょいぐらいで書いた。
どうせ評価関数のデバッグ用に必要だから書いておいたのである。

function negamax(board, turn, depth, target_depth) {
	if (depth == target_depth) return eval_board(board);
	
	moves = make_legal_moves(board, turn);
	
	temporaty_value = INFINITY * turn;
	temporaty_move = null;
	
	foreach (moves as move) {
		v = negamax(add_move(board, move), -turn, depth + 1, target_depth);
		if (turn == TurnSente && otemporaty_value < v) {
			temporaty_value = v;
			temporaty_move = move;
		} else if (turn == TurnGote && otemporaty_value > v) {
			temporaty_value = v;
			temporaty_move = move;
		}
	}
}

ちなみになぜこんな孥シンプルな探索ルーチンが必要かというと、上にも書いたが評価関数のデバッグ・調整用である。
作りこんでいくと評価部と探索部のプログラムはどっちも込み入ってくることが予想されるので、どちらかをいじった時に本当に問題がないのか・変な干渉してないかをチェックする必要がある。
そのためには、探索部と評価分にそれぞれ「バグがないことを確信できるぐらい」シンプルに書かれた、チェック用のコードがあると望ましいのである。

それでは次回はUIの方にまた戻りたいと思う。でもひょっとしたら別のことやるかも:P

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする