2006年12月30日

△1二香

とりあえず遊んでみたわけですが、
現状は弱いとか以前の問題な気がしなくも。

端から順に駒を進めているのは、
駒の損得計算では差がつかないためです。
角道をあげても香を1つ上げても損得なしで同じと。

確かに損得はないのですが、
初手△1二香とかありえない気がします。
乱数を入れれば端から指すことはなくなりますが、
代わりに初手から玉を上げるとかになるわけで、
解決にはならないですね。
posted by あやまり+ at 08:17| Comment(2) | TrackBack(0) | 将棋

2006年12月27日

できるところから

できるところから改良ということで、
角や飛車を成れるときには必ず成るようにしてみました。
詰め将棋には飛車不成がたまに登場するようですが、
ふつうの将棋ではまず考えなくて良いでしょう。

これも前向き枝刈りの一種なのかなあ。
そんなにえらそうなことをしているようには見えませんが。
posted by あやまり+ at 06:31| Comment(0) | TrackBack(0) | 将棋

2006年12月25日

序盤

弱さにもいろいろな種類がありますが、
とりあえず序盤がお話になりません。
弱さは文章で書いても伝わらない気がするので、
実際に動作させ、棋譜の出だしを貼ってみます。
後手がコンピュータです。

▲2六歩
△1二香
▲2五歩
△3二銀

なんというか・・
posted by あやまり+ at 23:46| Comment(0) | TrackBack(0) | 将棋

2006年12月24日

ありえない手

だらだらと現状を書いてきました。
一見それっぽいアルゴリズムに見えますが、弱いです。
例えば、ありえない手に対して何の対策もしていません。

先読みの候補手は序盤は30手くらいですが、
持ち駒が多くなる終盤では100手以上になります。

例えプロ棋士でも局面ごとに100手も読むとはおもえないので、
大半はありえない手な気がします。
どうでも良いところに持ち駒を打つとかね。
posted by あやまり+ at 08:34| Comment(0) | TrackBack(0) | 将棋

2006年12月22日

先読み

評価関数と組み合わせて手を読むことを先読みということにします。
各候補手を点数付けしていき、点数(評価値)が一番高いものを探します。

先読みはアルファベータカットを使っています。
絶対に最善ではないとわかった手だけを枝刈りする方法で、
アルゴリズム的にはいわゆる全探索になります。

単純に実装すると遅くなるため、反復深化を使い、
前段での最善手を後段の探索で優先します。
反復深化により、枝刈りの回数が増えます。

ここもまだとりあえず作りましたみたいな感じがします。
posted by あやまり+ at 06:47| Comment(0) | TrackBack(0) | 将棋

2006年12月20日

評価関数

今回は評価関数について書きます。
将棋思考ルーチンのメイン部分ですが、
今のところいまいち気合が入っていません。

評価関数は、成りも含めた14種類の駒の価値を
適当に決め、駒の損得を数えています。
千日手は0で、詰みは大きな値にしています。
おかしな手を指すことも多く改良が必要ですが、
終盤はこの程度の評価関数でもそこそこの手は指します。

コンピュータに千日手を指させたくなければ、
千日手の評価を下げると幸せになれるかも。
posted by あやまり+ at 06:16| Comment(0) | TrackBack(0) | 将棋

2006年12月17日

ハッシュ値

現状を書くだけでもかなり長くなるものですね。
予想以上にだらだら書きな気がします。

ハッシュ値は各マス・各駒の数値をXORして生成します。
将棋盤上の駒データは5ビットで表しています。
千日手の判定で使う64ビットハッシュ値は、
1マスごとに5ビット分(32個)の64ビット乱数値を用意し、
各マスの値と持ち駒に対応する64ビット値をXORしています。
posted by あやまり+ at 20:27| Comment(0) | TrackBack(0) | 将棋

2006年12月16日

千日手

千日手とは、同一の局面が4回繰り返されると
引き分けになるという将棋のルールです。
一方が王手をかけ続けて千日手になった場合は、
特例として攻め側が負けになるようです。

将棋盤の同一判定は64bitハッシュ値による簡易判定が
よく使われるらしいので、これで済ませます。
盤面の正確な一致チェックはしませんが、
実用上は問題ないみたいです。
ハッシュ値については後で書きます。
posted by あやまり+ at 22:34| Comment(0) | TrackBack(0) | 将棋

2006年12月15日

王手の判定

将棋には王手を無視してはいけないというルールがあります。
王手を無視したら負けというわけで、
プログラムでは王手を判定する必要があります。

候補手の列挙では王手がかかっているかチェックしていて、
王手の場合は玉が逃げる手と攻撃駒を取る手だけを列挙します。
王手の判定では、将棋盤と玉の位置を一緒に覚えておいて、
玉の位置の利きをチェックしています。
候補手がない場合は詰みです。
posted by あやまり+ at 21:55| Comment(0) | TrackBack(0) | 将棋

2006年12月14日

候補手列挙

前回書いたように、まずはインプリ済みの部分を記録していきます。
といっても、地道に作るだけというものが多いです。

今回は候補手列挙についてです。
インプリにはかなり時間がかかりますが、やること自体は単純です。

将棋盤を1マスずつチェックしていき、
駒を見つけたらその駒が動ける場所を列挙します。
成れる場合は成/不成の両方を列挙します。
駒のない場所に持ち駒を打つ手は、
打ち歩詰めにならない限り列挙します。
posted by あやまり+ at 21:30| Comment(0) | TrackBack(0) | 将棋

2006年12月13日

記事カテゴリ

記事ごとにカテゴリが設定できるようなので、
カテゴリを将棋にしてみた。
posted by あやまり+ at 22:21| Comment(0) | TrackBack(0) | 日記

2006年12月12日

まずは現状を

記憶を頼りに、まずは今までの記録を残していきます。
特に新しいことはしていないです。

将棋盤は byte の配列で表現しています。
将棋の駒は8種類あり、金と玉以外は成ることができます。
先手・後手の区別を考えると、何も駒のないマスを考えても
1マスあたり5ビットあれば足ります。

他に、持ち駒や将棋盤内の利き情報も持っています。
局面データは手を指すたびに差分更新します。
posted by あやまり+ at 20:21| Comment(0) | TrackBack(0) | 将棋

2006年12月11日

記録開始

数ヶ月前から将棋ソフトを作りはじめました。
モチベーション維持のため、ここにその記録を残していくことにします。
posted by あやまり+ at 15:47| Comment(0) | TrackBack(0) | 将棋