おまいら最強の将棋プログラムしてみろよ Part3
1 :
デフォルトの名無しさん :
03/10/01 13:54
「飛行機墜落編」 副長:機長!!エンジントラブル発生!!もうだめぽ! 機長:湖ハケーン!あそこに降臨しる! 乗客:何が起こってるんですか!?教えてくらはい。 機長:教えてチャソハケーン!晒すぞゴルァ! 副長:教えてチャソ逝って良しっ!! スチュワーデス:厨房はひっこんでろ! 客A:(((( ;゚Д゚)))ガクガクブルブル 機長:トラブルをトラブルであると見抜けないと(機長を務めるのは)難しい。 副長:いまさら何ほざいてるんですかゴルァ。ちょっと機長!高度sage過ぎ! 機長:sageてるんじゃなくてsagaってんだよ!むしろ強制sage!? 客B:age!! age---!!! 客C:くそう、こんなことならもっと糞スレたてておくべきだった・・・。 客D:ジサク(・∀・)The End 客E:地面キタ━━━━(´Д`;)━━━━!!!!! ゴゴゴゴゴゴゴゴ・・・・ ・・・死ゲットズサー
オセロならつくったのに・・・
6 :
デフォルトの名無しさん :03/10/06 18:22
<丶`∀´>ニダ
7 :
◆R/rLuLKeEI :03/10/07 09:00
8 :
デフォルトの名無しさん :03/10/07 09:16
最強の脱衣将棋?
9 :
◆R/rLuLKeEI :03/10/07 14:28
最強のブルゲ的脱衣将棋? 私のプログラムをプロファイルしたら評価関数関連が非常に時間を食っていた。 本業が落ち着いたら等価な高速版に変える予定。当分先の話。
10 :
デフォルトの名無しさん :03/10/10 20:05
11 :
◆R/rLuLKeEI :03/10/11 01:03
Cのプログラムを見ました。そのままだと大変見づらいのでちょっと改善。 printf("(%3d) \n", n); この配列全体が4手目までのゲーム木を完全に示しているようですね。私の実行環境では最初の部分が次のように出ました。 12 -5 7 -9( 5) 12 -5 7-16( -2) 12 -5 7 0( 14) 12 -5 9-13( 3) 12 -5 9-15( 1) 12 -5 9 -1( 15) 12 -5 15 -8( 14) 12 -5 15-15( 7) 12 -5 15 0( 22) レスが少し長くなりますが、ご勘弁ください。考え方としては最もシンプルな最大最小戦略を示します。今、 12 -5 7 と手を進めると後手番ですので-9,-16,0の内から最小値を選んで3手目の値とします。つまり、 12 -5-16 -9( 5) 12 -5-16-16( -2) 12 -5-16 0( 14) とします。
12 :
◆R/rLuLKeEI :03/10/11 01:10
(続き)同様に 12 -5 9 12 -5 15 の場合もそれぞれ最小値を選んで 12 -5-15-13( 3) 12 -5-15-15( 1) 12 -5-15 -1( 15) 12 -5-15 -8( 14) 12 -5-15-15( 7) 12 -5-15 0( 22) とします。次に 12 -5 と手を進めた場合、先手番ですので-16,-15,-15から最大値を選んで2手目の値とします。 12-15-16 -9( 5) 12-15-16-16( -2) 12-15-16 0( 14) 12-15-15-13( 3) 12-15-15-15( 1) 12-15-15 -1( 15) 12-15-15 -8( 14) 12-15-15-15( 7) 12-15-15 0( 22) 以下、1手目の値は最小値を、0手目(?)は最大値を選ぶことで結果最終的に最高点を出せたりします。でいいですよね?皆さん。
>>13 乱数の種を引数で与えていつでも再現できるようにした。
srand(atoi(argv[1]));
次のようになった。
[ 6][ 7]のところを見てほしい。
最小値9を取るので[ 6]を採用するはずだが、[ 7]がとられているっぽい。
何故に?
# ./main 10
[ 0] 15-18 15 -4( 8)
[ 1] 15-18 15 -1( 11)
[ 2] 15-18 11 0( 8)
[ 3] 15-18 11-18(-10)
[ 4] 15 -5 7-11( 6)
[ 5] 15 -5 7 -8( 9)
[ 6] 15 -5 7 -8( 9)
[ 7] 15 -5 7 -4( 13)
(続く)
(続き) [ 8] 8-18 3-15(-22) [ 9] 8-18 3 -1( -8) [10] 8-18 13 -2( 1) [11] 8-18 13 -8( -5) [12] 8-17 8-12(-13) [13] 8-17 8 -3( -4) [14] 8-17 13 -8( -4) [15] 8-17 13 -6( -2) [ 0][ 1][ 2][ 3][ 4][ 5][ ][ 7][ 8][ 9][10][11][12][13][14][15] [ 0][ ][ ][ 3][ 4][ ][ ][ ][ 8][ ][ ][11][12][ ][14][ ] [ 0][ ][ ][ ][ 4][ ][ ][ ][ ][ ][ ][11][ ][ ][14][ ] [ ][ ][ ][ ][ 4][ ][ ][ ][ ][ ][ ][11][ ][ ][ ][ ] 最善手は[ 4] #
1手目、2手目、3手目はすべて0点にして4手目だけの点で動かせば?
>>14-15 自分と表示内容が違うなー。
ただ、1回目の削りは、全ての数値が同じ時に削っています。
1回目では、[5][6]のどちらかのみを削っています。
16種類に対して、0~19だからちょくちょく全かぶりが出てきます。
2回目では左から3つの数値が同じ時に削り、3回目では2つの数値、
4回目では1つの数値が同じ時に削ります。残る個数は≒16→8→4→2となります。
BUNKI 3、FUKASA 6だと、729→243→81→27→9→3となります。
>>16 もっとくわしくおながいします。
>>17 [5][6]を比較しているなら納得。
違和感は残るがそれを上手く表現できない。
乱数の種が同じでも擬似乱数の生成規則が異なるのでしょう。
ANSI Cでも処理系定義ですし。
なお、当方の環境はLinux 2.4.2-2 i686です。
>>18 >違和感は残るがそれを上手く表現できない。
何でしょうね。自分も少しあります。
プログラムの内容が点数分岐の為だけのと言うのもあるかもしれません。
早くオセロの方に組み込んで試してみたいですが、
難しくて時間が掛かってしまいそうです。
>乱数の種が同じでも擬似乱数の生成規則が異なるのでしょう。
>ANSI Cでも処理系定義ですし。
なるほど、そうでしたか。なお当方のは98、VC6です。
#define FUKASA 2 //読む深さ #define KIND 4 //手の種類 BUNKIのFUKASA条 として、乱数ではなく外部からデータを与えるようにした。 //手の生成 for (k = 0; k < KIND; k++) { scanf("%d\t%d\n", &(te[k].point[0]), &(te[k].point[1])); } # cat data 10 -21 10 -20 10 -16 10 -20 # ./main 2 < data [ 0] 10-21(-11) [ 1] 10-20(-10) [ 2] 10-16( -6) [ 3] 10-20(-10) [ 0][ 1][ 2][ ] [ 0][ ][ ][ ] 最善手は[ 0] # 最善手は[ 3]だと思う。
>>20 結果通り[0]だと思います。先手は高値にしたく、後手は逆。
例だと先手の指しては1種類しかなく、後手は4種類ある。
先手が置いて10枚得た後、後手が何枚得るかを決める。
当然21枚得られる[0]が一番得だから、[0]が最善手だと思います。
>>16 なんとなく言っている意味が分かりました。
オセロだとスピードとか容量とか気にしないといけないから、
いろいろ考えていたのですが、その時にピンときました。
うまく説明できませんが。
>>21 正しくないことを示す効果的な方法は反例を見つけることですが、私は反例を見つけることが出来ませんでした。
解説ありがとう御座いました。多分正しいのでしょう。事実上の敗北宣言です。
>>23 敗北宣言って・・。こちらが教えてもらった側なのですから。
いろいろ例を挙げてもらう事で理解も深まりますし、感謝しています。
将棋の評価の類推で言ったまでで、特に考えての発言ではありません。 途中経過はどうであれ、4手目終わった状態での駒数が問題になると考えました。 それを3手目、2手目の評価としてあげていくわけですから。 全滅した場合は別ですが。
>16さんは最大最小戦略を愚直にやるのであれば ~
>末端の値だけで十分だと言いたいに違いない。
>>22 でなんとなく理解したという意味は、オセロだと手の種類が10の8条とかに
なるから、うpしたプログラムのやり方だと容量不足になる。だから小さく絞って
調べる必要があり、その時関係ない部分がいっぱいあるから、その部分は使わずに
0で良いという意味と受け取りました。
>10さんはpointの値は枝刈りと他のノードとの区別に使っているのですよね。
枝刈りとか良く分かりませんが、将棋で言う関係ない所に駒を打つ手は考えない
見たいな物ですよね。そういうのはたぶん無く、駒がたくさん取れる手、
殆ど取れない手を区別せずに全て調べます。
うpされたプログラムが今後どんな風に化けるか楽しみです。
>>28 期待されても困りますが・・。でも何とか形にしたいです。
>>30 知りませんでした。オセロを作り始めたのは質問する1日前でしたし。
PLAYER同士で遊べるようになったのでCONと対戦させるにはどうすれば良いかと
思い質問しました。見てみると凄く面白いです。ただ、少しオセロをなめて
いました。とにかく枚数を稼ぎつつ、端ならより良いと言う評価関数を考えて
いたのですが、終盤で枚数的な大逆転を起こせるので、その評価関数はまったく
意味を持たない事が分かりました。完成した暁には、作ろうと思っていた初心者
プログラム勉強サイトのネタの1つに加えようと思っていたのですが、数日で手に
終えない代物と分かったので、オセロはあきらめようと思います。ただ、せっかく
点数の計算方法が少し身についたので、それを生かした何かを作りたいと思います。
>>10 思いつきで恐縮だけど。
逆オセロを作ってみたら?
オセロと同じルールで駒を置いていき、獲得枚数が少ない方が勝ちってことで。
つまり、相手の手番で相手に自分の駒を全部取らせることに成功したら無条件勝利。
これなら逆転が少なくなるので割りと単純な点数評価でいけると思う。
#思うだけ。
しまった、URL出すの早すぎたな。 でも、プログラム技術の向上に手頃な題材なので気が向いたら再挑戦してみるのが吉です。 プログラム自体は基本的なデータ構造とアルゴリズムの組合せと言えなくも無いし。 どちらかというと、ちょっとした思いつきと根気と諦めないこととが肝要だと思う。 かく言う私は三度諦めて四度目の挑戦なんですけどね。 10さんの書き込みに触発されてしばらく触っていなかった将棋のプログラムの評価関数の高速化をしようと見ていたらバグを見つけた。 局面の評価をするつもりが兄弟局面のどれかの評価をしてその局面の評価値にしていた。 何ヶ月もこねくり回していて気が付かなかった。 道理で弱いわけだ。 王の価値がほとんど0らしいという結果も意味が無くなってしまった。 というようにバグ取りの楽しみもあるので色んな何かをたくさん作って再挑戦を期待。
>>33 面白い案ですね。割りと簡単な点数評価と言うのにまだ実感が無いですが、単純に
枚数で評価するやり方の予定だったので、もしそうなら良いのが出来そうです。
>>34 将棋は昔少し作った事があったのですが、定跡に頼るのが嫌で、自分の棋風見たく
力将棋を出来るのを目指していたのですが、挫折しました。
1手毎を4種にしぼって、16手ぐらい読むのを考えていました。
36 :
◆R/rLuLKeEI :03/10/14 04:53
>>35 私も定跡に頼るのはなんかなぁ、と思ってる。
ただ、力将棋というのもなんかなぁとも思ってる。
システムが自分の価値観=評価関数に従って、手筋や定跡のデータベースを更新し、
学習から新しい特徴を評価関数に組み入れて調整し…そんなのが出来たらいいな。
どうやったらいいのかさっぱりわからんが。
高速化検討中:評価関数を(着手可能数の差+駒の損得)→(駒の損得)とすると初手で1秒間に展開した局面の数が29倍になった。
>>36 着手可能数って評価に入れる意味あります?特に序盤で。
持ち駒を打てなくなったり、角道を止める手を指せなくなったりしません?
オセロ製作再開。今は単純に枚数を得やすい所に置くようにしている。
端、角は加点する。半分ぐらい埋まると手を見つけてくれなくなったり、
4手読みだと置けない所に置いたりとバグ満載です。
>>36 >システムが自分の価値観
自分のだけでなくて、プロ騎士の棋風も選べると面白いかも。
羽生なら終盤でマジックって、丸山は受け中心で指してきたり。
>どうやったらいいのかさっぱりわからんが。
ここまで来ると人工知能とかに入って来そう。
>高速化検討中:評価関数を(着手可能数の差+駒の損得)→(駒の損得)とすると
>初手で1秒間に展開した局面の数が29倍になった。
難しくてわかんないス。でも、29倍ってとんでもない数字なんじゃ・・。
>>37 >着手可能数って評価に入れる意味あります?特に序盤で。
さあ?よーわからん。
>持ち駒を打てなくなったり、角道を止める手を指せなくなったりしません?
確かに着手可能数だけでやると持ち駒は打ちにくくなりました。
但し、同じ種類の駒が2つ以上あるとむしろ指した方が着手可能数が多くなるので全く指さなったり、駒コレクターになったりはしませんでした。
同様に自分とこの角道を止める手は打ちませんね。
代りに、次に取れそうな駒は全て取ったことにするようにしています。
これだと両取りはより高く評価されるのでいい感じです。
それと着手可能数の係数が他の係数と比べても極端に小さくはなってないので多少成りとも意味があるのかもしれないです。
今日コンピューター将棋の進歩4を読み終えました。
それで、皆さんに質問なのですが、長井歩さんの書かれてた「df-pnアルゴリズム」に関する論文があるサイトをご存知の方はいないでしょうか?
がんばってみたけど、
http://www.ipsj.or.jp/members/Journal/Jpn/4306/article020.html しか見つかりませんでした。
ちなみに、論文のタイトルは
「A. Nagai and H. Imai: Proof for the Equivalence Between Some Best-First Algorithms and Depth-First Algorithms for AND/OR Trees. Proceedings of the Korea-Japan Joint Workshop on Algorithms and Computation, 1999, pp.163-170. 」
です。
ご存知の方がいらっしゃったら、よろしくお願いします。
41 :
うさぴょんの育ての親 :03/10/15 19:38
>>40 Webサイトは残念ながら知りませんが、df-pnアルゴリズムに関する論文で最も
詳しいものはコンピュータ将棋の進歩4に掲載されたものと同じものだったと
記憶しています。
…でも、元の論文をどこで見たのか記憶が曖昧(^^;
>>38 >自分のだけでなくて、プロ騎士の棋風も選べると面白いかも。
評価関数:=2*羽生+1*丸山
などと混合したり…。中途半端な棋風になりそう。
>ここまで来ると人工知能とかに入って来そう。
問題解決のための探索は既に人工知能の領域なんですけど。
>29倍ってとんでもない数字なんじゃ・・。
とんでもないです数字です。
如何に手を抜いてきたかが良く分かります。
ソフトの中の人も大変だな。
>>うさぴょんの育ての親さん 情報処理学会の会員だったら苦労しないんですよぅ。(;´д⊂
おらもdf-pnの詳しい解説がある論文探してるんだけど、
>>40 のやつか
長井歩さんのマスター論文読まないといけないみたい。
コンピュータ将棋の進歩4に掲載されているプログラムリストだけだと難しいでつ・・・
う、この論文だとちょっと背尾さんのアルゴリズムは分かりにくいと思う(--; 背尾さんのアルゴリズムに至るまでに理解しておくと良いことは全部書いてあるけど。 諦めて、コンピュータ将棋の進歩2を買うのがお勧め。 背尾さんの論文が収録されてます。
うさぴょんの育ての親さんと
>>51 さんのおかげで脊尾さんのアルゴリズムとdf-pnアルゴリズムが理解できました。
近いうちに、このアルゴリズムでプログラムを組んでみようと思います。
ありがとうございました。
53 :
◆R/rLuLKeEI :03/10/19 20:14
評価関数の高速化:駒毎に利きの表を作成して、表を更新させるようにしてみたところ1秒間に評価した局面の数が約16倍になった。 といっても高々5000局面/秒になっただけです。 しかし、評価方法が同じはずなのに結果がかなり違う。 どうやら、バグを作りこんでしまったらしい。難儀な…。
『コンピュータ将棋の進歩2』を買いました。 『コンピュータ将棋の進歩4』と合わせて検討中です。 詰め将棋では先手番は証明数最小、後手番は反証明数最小を選ぶのが最良のようですが、 指し将棋だとどちらの手番も証明数、反証明数ともに最小を選ぶのが良いような感じですが、 どうなんでしょうか?
証明数ってこの場合は「可能な手の数」のことでしょ? 先手から見れば 証明数=後手の可能な手の数 反証数=先手の可能な手の数 だよね。 終盤になって王手がかかるようになると可能な手の数が激減するから 結構有効に働きそうな気はするけど、序盤ではどうなのかな?
この場合の証明数が「可能な手の数」のことなら、後手からみても 証明数=後手の可能な手の数 反証数=先手の可能な手の数 だよね。 後手にとっては先手を詰ませたいわけだから反証数最小の手を選びたいはず。逆に 先手にとっては後手に詰まされたくないから反証数最大の手を選びたいはず。つま り、 :証明:反証 先手:最小:最大 後手:最大:最小 だよね(さっき書いてたことと違ってしまった)。終盤で無くともあわよくば詰ま せたいはずだ。この探索を中盤でやるということは探索中に現れる全ての局面で 詰み探索をやるようなものというのは言いすぎかな…それが有効ならもう既に誰 かがやって成功してるはずだ。そうでないということはまだ誰もやってないとい うのは考えにくいから既に誰かがやって結果が芳しくなかったに違いない。やは り通常の探索と詰み探索は統合できないのかな。
>>57 もともと証明数は共謀数のAND/OR版。
指し将棋の場合は、共謀数で考えた方が良いかも。
あと、指し将棋の内部ノードに詰め探索を入れるのもあるよ。
あまり深いところではやらないようだけど。
>>58 指し将棋でも勝ち(true)、負け(false)としてAND/OR木とみなすのは無理ですか?
>>59 詰め将棋は手を制限することで深く読めるから、
AND/OR木探索で(30手を超えるような)勝ちを発見できることがある。
でも、指し将棋はAND/OR木探索しても手が多くて深く読めず
勝ち負けは普通わからないので、αβ法を基本とした局面評価による探索をするんだと思う。
おいら最強の将棋プログラムしたいです。。。 で何を勉強したらいいのかさぱーり分からないので、これはやっとけゴルァ!見たいなのがありましたら教えてください。 とりあえず今C++勉強してますにゃ♪ 昨日「Hello world」が出せるようになりますた(感涙(意味はよく分かってないのですが・・・ まだ相当時間がかかりそうですが、気長にやっていこうと思います。 またちょくちょく質問に来ますのでよろしくです。 打倒羽生名人目指してがんばるぞぉ!えいやぁ!!
c++で良いはずですよ。 ただ動けばいいってだけならvbとかで楽してやるのが良いんだろうけど、 一応最強と言う夢をを目指すならc++が1番高い候補になるはず。
最強プログラム共同開発者募集。 ソース非公開、インターフェース公開、最初最弱可、言語不問。 1.序盤40手まで担当者:やります 2.中盤41手目から80手まで担当者 3.終盤一般担当者 4.指し手、盤面経過をファイルとして共有ディレクトリに書き出して渡す。
1.序盤のソース完成しました。 if ( 振飛車 )▲76歩 if ( 横歩取り ) ▲26歩
5.GUI完成しました。 後手:級位者 後手の持駒:なし 9 8 7 6 5 4 3 2 1 +---------------------------+ |v香v桂v銀v金v玉v金v銀v桂v香|一 | ・v飛 ・ ・ ・ ・ ・v角 ・|二 |v歩v歩v歩v歩v歩v歩v歩v歩v歩|三 | ・ ・ ・ ・ ・ ・ ・ ・ ・|四 | ・ ・ ・ ・ ・ ・ ・ ・ ・|五 | ・ ・ ・ ・ ・ ・ ・ ・ ・|六 | 歩 歩 歩 歩 歩 歩 歩 歩 歩|七 | ・ 角 ・ ・ ・ ・ ・ 飛 ・|八 | 香 桂 銀 金 玉 金 銀 桂 香|九 +---------------------------+ 先手:有段者 先手の持駒:なし 手数=0 まで
3.終盤できますた。 if ( (rand() & 7) == 7 ) { printf("詰みました\n"); 適当に王手(); // ノータイム } else { printf("せんてしょうせい\n"); 乱数で指す(); // 30秒考える }
× printf("詰みました\n"); ○ System.out.print("詰みますた\n");
なんか急激にレベルがさがってないか?
>>63 様どうもでつ。
↑スヌーピー
それで、そろそろ将棋盤を作っていこうと思っているのですが、どのように書いたらいいのですかね?
#include "windows.h" というのを使ったら、鬼のようにエラーが出てしまいますた。
って言うより使い方がよく分からないです(大涙
いろいろ調べているのですが、サパーリ分からないです。
分かりやすい書籍、あるいは他の方法があればご教授ください★彡。
74 :
デフォルトの名無しさん :03/10/25 09:03
将棋はグラフィック部分はあんまり頑張ってもしょうがない。 もともと将棋ゲームにグラフィックなんか求められてないし、 そこに拘ってもあまり意味が無い。そんなところ誰も評価しないだろう。 やはり、思考ルーチンの強さ、が1番求められてる部分だと思う。 ここが1番難しいし、1番効率良くしなければいけない部分だ。 だから、グラフィック部分は適当に、もっと言えば自分から見て 見やすい程度に作っておいて 後は思考ルーチン作成に走るのが良いと思う。
77 :
◆R/rLuLKeEI :03/10/25 22:16
ほとんどハブ夫さんと同じですが… 将棋を指すプログラムを目指しているという前提で、 作り始めにグラフィック部分をあまりに頑張ってしまうといつまでたっても完成しないどころか挫折してしまう(最初の試作版はそれで失敗した)。 しかし最低限なグラフィックは求められているとは思っている。 思ってはいるが、奇麗なGUIとかではなくCUIで十分用が足りる。 GUIに拘るのは後回しで良い。 評価してくれる人はいるだろうが肝心の思考ルーチンが弱くては何にもならない。 そういう私のプログラムは次の1手サーバーとして働くコンソールアプリです。 正確にはデバッグ用にモニタ表示をさせていて、GUI部分は出来合いのものを利用しています。 つまり、こんな構成: sikou.exe⇔CSA将棋+sikou.dll⇔sikou.exe 最近CSA TCP/IP通信プロトコルが公開されたので、ローカルホストで動く審判サーバーが欲しくなった。 sikou.exe⇔自前の中継クライアント⇔自前の審判サーバー⇔自前の中継クライアント⇔sikou.exe ほとんど自己満足の世界です。
皆様レスどうもです。 リンク先一通り回ってきますた。 英語のサイトは??でしたがw、とても参考になりました(感謝 >>76 グラフィック部分はとりあえず適当なのを作りたいのですが、どうもうまくいかないです。 いろいろ調べたのですが、画像を表示したり、窓を作ったりする関数が私のレベルでは、難解なようで。。 で、>>72のリンク先のTM将棋のサイトから将棋盤をダウンロードしてきたのですが、 将棋盤をそのまま流用して、思考ルーチンだけ作成するってのは可能ですかね? 当面の間はそうしていこうかなと思ってるのですが。。。 >>77 CUIというのはコマンドプロンプトのことでしょうか? サーバーとかよく分からないので、ローカルで動くようにしたいです。 えっと、そういうわけで昨日アルゴリズムの入門書買ってきますた。 評価関数とか作るのはまだ大分先になりそうですがこつこつやっていこうと思います。 これからも漏れを応援してくださいね。誰もしてないでつか(大涙 ↑スヌーピー
RS232Cの通信ができるようにすれば、 市販ソフト(柿木将棋とか)のGUIで遊べるよ。 市販ソフトのほうを人vs通信にするわけ。
>>80-81 RS232でなくLAN仕様なら1台でOKのよう。試しに柿木将棋を2枚立ち上げて
TCP/IPで先手7、後手7で対戦できました。相手が思考している間、片方は
TCP接続待ちになっています。スゴクおもしろい。 (127.0.0.1使用)
RSでも1台で出来る方法がどこかの掲示板でみたような。
TCP/IP入力待ち
84 :
◆R/rLuLKeEI :03/10/26 17:46
>>82 COMポートが2つあるなら、代理将棋通信プログラム「木偶の坊」(でくのぼう)Version 0.67ヘルプファイルの「初めて使用される方へ」の「1台のパソコンで対戦させるには?
」を読んでみては?
COMポートが1つしかないなら、仮想COMポートを導入するか、COMポート増設はどう?
ところで柿木将棋のTCP通信プロトコル仕様って公開されてるの?
CSA将棋(LAN対応仮バージョン)が出来たらしい。
早速ダウンロードしました。
おおっ、擬似サーバーもある!感激!
来年の選手権の通信はどちらですか。
>>85 [実施要領]が出てないんでわからん。
でも「きのあ掲示板」にこんなん投稿されてあった。
>コンピュータ将棋選手権の採用が来年、来来年が試用、3年後本格運用
>>79 レスサンクス!
早速CSA将棋落としてきました。
これはSIKOU.DLLの所で思考ルーチン作成するのですよね?
dllでいろいろ検索したのですが、訳分かりませんでしたw
今更ですが、将棋のプログラムをするのは少し早すぎるのに気づきました。
そういう訳で、今日からオセロのアルゴリズムで練習していこうと思います。
>>30で紹介されていた本が手に入りましたので(最後の一冊だった)これを使って
勉強していこうと思います。
かなり詳しく書かれてあるので漏れでも何とかなりそうな気が・・・
今までレス下さった方、本当にありがとうございました。
またこっちに帰って来たときには、よろしくお願いします。
自分も将棋プログラム作っていて(手を進める・戻す程度、評価・探索なんてもちろん無し) 簡単な詰め将棋部分に取り組んでいるんですが、 王手の生成は、ある局面で生成できる手を片っ端から 「手を進める→王手を確認→手を戻す」作業を繰り返して王手が掛かる手だけを 残していく方法が簡単だとは思いますが、実際のところどうなんでしょうか? 今は、手を進めないで王手を調べようと頑張って、 空き王手調べるところまでこぎつけましたが頭がパンクしそうです。 >うさぴょんの育ての親さん、 将棋プログラムの作り方、参考にさせて頂いています。
>>88 >これはSIKOU.DLLの所で思考ルーチン作成するのですよね?
はい、SIKOU.DLLの所で思考ルーチン作成するのです。
付属のSIKOU.DLLを変更無しでコンパイル出来る環境が整ったら後は試行錯誤です。
dllの仕組みがわからなくても摩訶不思議な機構でdllにある関数が適切に呼び出されることさえわかればただのC/C++プログラミングですよ。
main関数がどうやってOSから呼び出されるか知らなくったって"Hello World!"が書けるのと大差ないと思う。
今YSSの技術解説を読んでいたのですが、
http://plaza15.mbn.or.jp/~yss/book.html#SEC4 本文中の「ハッシュテーブル」によると、山下さんはハッシュコードとして64ビットの値をつかっているようです。
どうやってハッシュテーブルに64BITの数字を使っているのでしょうか?
(私は、64BITのハッシュコードを使用する方法として、2^64のメモリーを用意する方法しか知りません)
山下さんがどのような方法をもちいているのか知っている方がいたら教えていただけないでしょうか?
サイエンス社「コンピュータチェス」を読む?
>>89 >王手の生成は、ある局面で生成できる手を片っ端から
>「手を進める→王手を確認→手を戻す」作業を繰り返して王手が掛かる手だけを
>残していく方法が簡単だとは思いますが、実際のところどうなんでしょうか?
私もそれが簡単で確実だと思います。
手を進めないで王手を調べるとしたら…
・駒毎に個別に処理を書き分けるのはやめて
212 010 000
1馬1 1金1 0桂0
212 111 000
000 000 101
ていう3×4の初期化された配列を用意して統一的に書く。桂歩香はその中で特殊処理。
・駒毎に利きの9×9配列を用意して各要素のビットに意味を持たせる。利きかなければ0とする。
第0ビット…成りでない利き
第1ビット…成りの利き
第2ビット…角飛馬龍香による飛び利き
・手番毎の利きの9×9配列を用意してその手番の駒の利きのビットORを取っておく。
・駒毎に空き王手になっている駒を覚えておく。なければNULL。
・王手をかけている駒を覚えておく。なければNULL。
という前処理をしておいてからというのはどうでしょう?
攻め側、守り側どちらも使えそうですが、詰将棋はまだ考えていないんで役に立つデータかわかりません。
一応、私のプログラムが持っている情報です。
>>95 ありがとうございます。
>・駒毎に個別に処理を書き分けるのはやめて
見事に駒毎に処理して -いると思い- ます(^^;
一応、手を進めないで調べる手順は
王手がかかる位置(玉の周りなど)に利いている味方の駒をチェックして
その駒が、その位置に移動した時に王手がかけれるかどうかというものです。
データに関しては大雑把?に考えていて
駒毎に利き配列は用意してますが、利きがあるところにはその駒の座標を書き込んでいます。
(そこに利きがあるという事がわかればいいという程度です。工夫のしどころかもしれませんね。)
ビット処理は、盤上の空き、駒の先手/後手の判別ぐらいにしか使ってないです...
もう少し勉強します(^^;
>>96 実は、駒毎に分けないように書きなおし始めたところで、まだ大部分が前のまま
です。
手を進めないで調べる手順(案(例:銀))
銀利き、銀-王手、成銀-王手パターンを用意する
111 101 010
0銀0 0玉0 1玉1
101 111 111
今、玉と銀が
銀
玉
であったとする。銀&&銀-王手、銀&&成銀-王手を取る。すると
000 000
0銀0 0成0
0玉0 1玉1
000 000
となって、銀で王手にするには成って玉の横に付けなければならないことが判
る。
駒-王手パターンは駒の利きパターンの上下反転。
あと「そこには味方の駒がありますよパターン」も作ってあれば
銀&&銀-王手&&(!味方駒)
銀&&成銀-王手&&(!味方駒)
が真となるところが王手になりうるところです。
>>97 なるほど...そういうことですか。かなり参考になりました。ありがとうございます。
>>93-94 さん。ありがとうございます。
ゾブリストキーなんて知りませんでした。
けれど、私が
>>91 で教えていただきたかったのはそういう事ではなくて……
ハッシュ法って、一般的にはある要素Aを特定の値aで割り、その余りをハッシュテーブルに登録して、探索etcの所要時間をO(1)にするアルゴリズムですよね。
ですが、ハッシュコードに64bit数を使うと、それが出来なくなります(よね?)
だから、長いハッシュコードを使用する方法にはどんな物があるのか、知りたかったんです。
どんな方法があるのでしょうか?
>>99 出てきたものを全部しまうのは諦めて、例えば64ビットの下位16ビットを使う。
65536エントリーになる。
ハッシュテーブルは、以下のような構造体を例えば用意して、
struct {
unsigned int64 HashCode;
int Alpha;
int Beta;
int depth;
} HashEntry;
HashEntry HashTable[65536];
実際にハッシュへの登録は、
void Regist(HashEntry x)
{
HashTable[x.HashCode & 0xff]=x;
}
ハッシュから値を返す時は、
HashEntry* Retrieve(unsigned int64 c)
{
if (HashTable[c & 0xffff].HashCode==c) return &HashTable[c &0xffff];
return NULL;
}
こんな感じ。
欝だ。訂正。 void Regist(HashEntry x) { HashTable[x.HashCode & 0xffff]=x; }
なお、実際には、登録時にほんとに上書きするかどうかの判定を行ったりするかも しれないし、よく知られているように、ある適当な値を加算したりして別の エントリにしまうかもしれないし、リスト構造のようにして全部保持するかも 知れない。 将棋の場合、精度より速度が大切なので、あんまり複雑なことはしてないと思う。 うさぴょんのハッシュのソースにもテクニックがいくつも入っているので、 C++読めるんだったら読めばいいと思う。 TsumeHashとHash,Hash2それぞれ実装が目的毎に微妙に違っている。
>>うさぴょんの育ての親さん 丁寧な解説ありがとうございます。 私はどうやら考えすぎだったみたいですね(苦笑 とりあえず、16(変わるかも)ビットでハッシュした後、重複があれば二分木で分けていく、という方法を取る事にしました。 (しっかし調べれば調べるほど疑問点が出てくるなぁ……
スレ違いかもしれない。 どうしてほしいというわけでもないので無視して頂けたら幸いです。 acceptするだけのテストサーバーを作って、CSA TCP/IP通信プロトコルのペー ジにあったサンプルプログラムを使って、間髪入れずにメソッドopenConnection、 login、logout、closeConnectionを実行したところ # java CSAClient 127.0.0.1 test test CsaReaderWriter.start().1…openConnection、スレッドスタート CsaReaderWriter.write(LOGIN test test).1 CsaWriter.write(LOGIN test test).1 CsaReaderWriter.write(LOGOUT).1 CsaWriter.write(LOGOUT).1 CsaReaderWriter.stop().1…closeConnection、スレッド停止 CsaWriter.stopThread().1…スレッド停止(ループフラグfalseにセット) CsaWriter.run().1…スレッド実行開始(ループフラグfalseなのでLOGIN、LOGOUT送出されず) CsaWriter.run().2…スレッド実行終了 ^C # LOGIN、LOGOUTを送り出す前に切断されてしまいました。 原因はCsaWriter.stopが未送信のメッセージがあってもループフラグをfalseに セットしてしまうからです。 スレッドのスケジューリングに依存しますね。 環境はLinux i686 2.4.2-2、 java version "1.4.0_03" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_03-b04) Java HotSpot(TM) Client VM (build 1.4.0_03-b04, mixed mode) ま、サンプルだからしゃぁないかな。
>>106 解決しました。
サンプルコードの読み違いでした。
CsaCommnunicationクラスのlogin、logoutメソッドは審判サーバーからの応答を待ってくれないんですね。
サーバーからの応答はCsaRecieveインターフェスの唯一のメソッドで通知されるらしい。
まだ、サンプルコードを読んでいる最中なんで間違ったこと書いてるかも…。
すんません。
108 :
デフォルトの名無しさん :03/11/04 14:27
棋譜データベース使っちゃだめ?
問題なしと思われ。
110 :
デフォルトの名無しさん :03/11/13 00:26
うさぴょんの育ての親は東京大学卒らしい。
来年の受付日はいつですか?
>>110 デマです。
>>111 例年、11月の末ごろになると発表されていたような…。
もうしばらく待ちましょう。
>>112 「うさぴょんの育ての親さん達は東京大学卒業後に結成されたらしい」という噂もデマですか?
自分の将棋プログラムはここ3週間程、全然進んでない。
構造がごちゃごちゃし始めていて、収拾がつかなくなりそうで作り直そうかと思案中。
>>113 大学卒業して社会人になってからなのは確かですが、東大卒はいませんです。
来る者はあんまり拒まない(<かなりウソ)ので、この先東大卒のメンバーが
増える可能性はありますが。
> 構造がごちゃごちゃし始めていて、収拾がつかなくなりそうで作り直そうかと思案中。
作り直さないで、無理して最後まで作ってしまうのもまた一つの道。
最後まで一回作っちゃうと、二回目はどうすればいいのか、見通しの良い状態で
作りはじめられるし。
>>114 どこらへんまで作り込んだら最後って言えるのだろう…それは私が決めることですね。
4回目の中途半端なプログラムを完成させるにしても、5回目に取り組むにしても、一番これを改善したいというものは決まっている。
結構、大きな修正になるのと他にもたくさんの欲があって、いっそのこと…となってしまう。
でも、一番の問題は十分に考察する時間的ゆとりが作れないことだ。
今週末は休めますように、倒れませんように。
>>115 東大6にガチで勝ったら最後と認めてあげますが
117 :
◆R/rLuLKeEI :03/12/07 01:55
>>116 それを読んで挫折しました。
今のプログラムは5度目の挑戦までもう少し寝かせておきます。
皆さん、ありがとう。
そして、さようなら。
118 :
デフォルトの名無しさん :03/12/07 21:30
俺なんか、もう、10回ほど最初から作り直してるよ。 マジで。
119 :
デフォルトの名無しさん :03/12/07 21:31
自分でも鬱になるよ、、。
120 :
◆R/rLuLKeEI :03/12/07 22:54
>>118 に勇気づけられて復活。
Eclipse導入記念で5回目に挑戦します。
風呂に入って寝るんで、続きは明日以降気が向いたら。
121 :
デフォルトの名無しさん :03/12/07 23:12
コンピュータ的な強さを求めるよりも、 2~3級レベルでいいから柔軟な人間らしい 指し方をするものをつくるとか、 接待将棋っぽく指せるようにするほうが 需要あるかもね。(ものすごく難しそうだけど) 東大や激指みたいにアマ4段レベル以上のソフトつくっても、 ごく一部の将棋オタしか対等に勝負できないでしょ。
122 :
デフォルトの名無しさん :03/12/07 23:29
>>120 良く解らんが、やる気が出てもらって嬉しいです。
自分は、118-119ですが、
自分も頑張ります。
お互い頑張りましょう。
>>123 構想としては、
たとえば序盤ならば、ガチガチに定跡通りに指すのではなくて、24の24万局集の
データを統計的に処理して候補手を数個に絞って、それらの手を優先的に深く読む。
(もし絞った候補手を読んだ結果、評価関数がすべてマイナスとかだったら
改めて他の手を読み直す。)
また、Shotestという将棋ソフトが使っているスーパーソマという
手法は特に中盤の駒がぶつかり合う局面で有効かもしれない。
(日本の将棋ソフトはこの手法を取り入れてないらしい)
あとは、将棋の格言や手筋をプログラムに取り入れるという姿勢も強化する。
(たとえば持ち駒に歩が3つあったら、端攻めできないかまず読むとか。
プログラムにどう組み込むかめちゃ難しいが。)
終盤は、コンピュータが即詰の場面でも、ノータイムで指さない。長手数の場合、
詰まし方を間違えることもあるようにする。即詰みを狙うより必至をかけて勝つ筋の
評価を高くする。
もちろんランダム的要素や学習機能を取り入れて、同じ手順で負けないようにするなど。
構想は他にもありますが、肝心の将棋ソフトは最近作ろうと始めたばかりです。
社会人にもなると趣味でプログラムする余裕がなかなかないです…。
しかも仕事やる業務用プログラムより、将棋プログラムを組むほうが数段難しいっす。
2,3級で人間らしさを目指すならあまり深く読む必要とかはなさそう。 24の棋譜を大量に取り込んでパターンマッチングで似た局面があるほど 高得点、みたない評価関数で3手先まで読むのとかでどうよ?
126 :
デフォルトの名無しさん :03/12/09 10:35
開発者の構想を聞いてるわけじゃなくて、ソフトが構想を持つように してくれってことじゃない?
127 :
デフォルトの名無しさん :03/12/09 18:26
128 :
デフォルトの名無しさん :03/12/09 20:48
今詰将棋ソフトをプログラムにとりかかってみたんですが,とりあえず 最初なんでまずは短手数5手詰めくらい解ければいいやくらいのレベルで 作成してるんですけど, とりあえずAND/OR木の深さ優先探索で やってみとうとおもってるんですが木のノードにはどんな情報をもたせたらいいんですか? その場の局面の情報も持たせないといけないですよね?ノードごとの局面を 構造体のメンバの中に配列でも作って毎回記憶させてるんですか? 初心者なのでなにとぞお願いしますm(__)m
>>128 その前に日本語をどうにかした方が・・・・・・
130 :
デフォルトの名無しさん :03/12/10 12:48
>>128 局面は記憶しなくてもいいです。
文献当たればそのあたりの必要な情報はなんでも手に入るはずですよ。
132 :
デフォルトの名無しさん :03/12/20 10:40
参加しまーすって申し込んでおいて、 実際には、不都合があったのでやっぱり止めます、、、 とか言うことは可能なのですか? 申し込み金額の1万円を自分が損するだけですかね?
>>132 でしょうね。
なんせPC環境を担いでいくんだから、都合が悪くなるなんて事よくあるでしょうし。
>>132 前日までに不参加の連絡をCSAにすれば、1万円損するだけです。
連絡しないで不参加だと、以後、参加を断られることがあります。
135 :
デフォルトの名無しさん :03/12/20 12:27
将棋プログラムを作ってる人たちよりも プログラムの方が強くなったりしてるんですかね? この間アマチュアの大会で柿木、AI、東大(?)の連合チームが優勝したじゃないですか。 どうなんでしょう?
136 :
デフォルトの名無しさん :03/12/20 12:41
137 :
デフォルトの名無しさん :03/12/20 16:38
>>135 そうらしいですよ。
すでに大抵のプログラマーよりは強くなってしまっているらしいですね。
138 :
デフォルトの名無しさん :03/12/20 19:06
えっとルールがわからないのですが・・・ 将棋倒しのゲームでもかまいませんか?
139 :
デフォルトの名無しさん :03/12/21 10:20
140 :
◆R/rLuLKeEI :03/12/23 22:54
>>128 木のノードに局面(と利きの表など)を記憶するとすぐに記憶領域が溢れかえりま
す。
しばらく寝かしている4度目のプログラムはまさにそれで、同一マシン上で戦わせ
てみたところ中盤で物理メモリ384MBと仮想メモリ???MBを食い尽くしてダウンし
てしまいました。
当面の課題は木のノードから局面の情報を取り除くことです(面倒臭いなぁ)。
Googleで探すとXMLで棋譜や定跡の表現をしているのがあるようですね。
入れ子構造が自然にゲーム木の表現になってるのでしょうかね。
これは来年末にでも考えます。多分。
141 :
デフォルトの名無しさん :03/12/24 22:03
>> 140 将棋や囲碁のような盤面の大きなゲームでは普通は局面のハッシュ値(96bit)と深さと結果だけを保存します 詰将棋なら王手と逃げる手も保存できます 局面は一つだけ管理して,手を指す時に更新してその手の探索が終わったら元に戻します
142 :
◆R/rLuLKeEI :03/12/25 12:37
>>141 将棋や囲碁のような盤面の大きなゲームで普通でないことをしたらどうなるか?
調べたり人に聞くよりやってみよう!とうわけで実験してみました。
ハッシュは、一度に色々な修正をやると訳が分からなくなりそうなので後回し。
局面のハッシュ値が96bitでいいという理由も後で考えます。
ノードに入れるのは、棋譜情報(深さと手、手番)と結果(評価値と確定値/推定値
のフラグ)くらいですかね。
管理する局面は二つ、根と探索中の局面だけにするつもり。
根の局面は探索中の局面から手を逆に辿れば復元できるので不要ですが、ちょっ
と実験したいことがあるので。
143 :
デフォルトの名無しさん :03/12/29 07:59
最強のプログラムを作るのに絶対必要な要素は学習させる事だと思う 基本のプログラムを準備して、そのプログラム同士を戦わせる。一瞬で終わるだろう そしてその勝負で負けたほうの理由を、同じくプログラムで調べて克服する・・・① そして新しく書き換えたプログラム同士で再び戦わせる・・・・ これの繰り返し コンピューターは処理が早いから、全部を自動で行えば1日で何百局と打てる 少しずつ強くなっていくとしても、短時間で恐ろしく成長する 問題は・・誰でも気づく①の製作 敗着を調べるまでは至っても、その後のプログラムを作るプログラムをどうするか・・・ その一手を打った経緯を調べても、どう書き換えるか
144 :
デフォルトの名無しさん :03/12/29 08:07
人間の手でやるならまだ出来るかもしれん 全ての1手に対して、その一手をどういう理由でプログラムが選んだかを保存させておく 後から敗着の部分を選んで、どういう経緯でそれを選んだかを見て克服する みんながやってる事だよな・・・・
145 :
デフォルトの名無しさん :03/12/29 08:13
むしろ・・・・ 強くもなるけど弱くもなってしまう全自動プログラム書き換えプログラムのほうがいいか・・・① それで書き換えたのと元のを何度か戦わせて、優れている方を採用すると 元より弱くなったら破棄 また元を書き換える もし強くなったらそれを元のプログラムとして同じ作業をする 何億、何兆回をこなせば絶対かなり強くなるはず 問題は・・・誰でも気づく①の製作法か・・・・
146 :
デフォルトの名無しさん :03/12/29 10:00
最強の定跡があれば学習は それほど多くは必要ないんじゃないかな。 (学習した手が本当に正しいのかはかなり吟味が必要だと思う。) あとは中盤と定跡選択と終盤の正確性。
147 :
デフォルトの名無しさん :03/12/29 10:44
将棋プログラムができてこそ最強を語れるプログラマー はいないだろう。と、思う漏れ; SLGでもなんでも基本は将棋、 将棋プログラム=AI(人工知能)プログラム 遥かなる未知な思考。 生涯だれもそのプログラムを完成させること は無いと思うが、人間である以上「人間」の 思考に近い最強AIプログラムを完成できると思う それができた奴こそ最強プログラマーではないか?
148 :
デフォルトの名無しさん :03/12/29 15:59
>>146 プログラムをちょっとずつ改良するプログラムはどう?
それを無限にやって、強くなった時だけ採用して、それをベースに進めるようにすれば、いつかはかなり強くなると思うけど
149 :
デフォルトの名無しさん :03/12/29 22:10
対戦からの学習というとチェスでは TDleaf がありますね 問題は何百局ではたりないことかな でも夢のある話です
151 :
デフォルトの名無しさん :03/12/30 08:31
>>149 コンピューターなら1年で何億、何兆局も出来ないかな?
ネットワークが最強か
人間が作る以上、そのプログラムの強さには限界がある
でも人間の意志を超えた偶然の産物なら可能性は無限だろう
例え1億回に一度しか、今を上回るプログラムが作り出せなくなったプログラムでも、先には進める
しかもこれはコンピューターが最も得意な要素だろうし
人間は理や発想
コンピューターはとにかく数
問題はランダムにプログラムを改造するプログラムだけどね
しかもパターンは無限におよぶという
ほんとは相性の問題もあるんだろうけどね
152 :
デフォルトの名無しさん :03/12/30 08:55
抽象的な言い方で申し訳ないが、俺の描くイメージとしては サイコロを10億個振るようなプログラム いつかは奇跡的に5、995、534、244とかも出るだろう(今のPCじゃ何億年かかるかもしれないけど) とにかく全ての性能の99%以上の結果を出したような偶然と奇跡の結果というか それまで全自動で動かし続ける その間に、サイコロを1億個で済むようなプログラムをひたすら考える こうやって、いかに最高得点に近いパーセンテージのスコアを出せるかを追求していくしかない 100%は諦めるにしても、99,9999%までいけば十分に神のレベルだろうと思うし まあ、その改造プログラムの性能によってAさんの90%よりBさんの80%が強いような結果になるかもしれないけど
153 :
いなむらきよし :03/12/30 11:53
キケー!
154 :
デフォルトの名無しさん :03/12/30 12:53
今の思考ルーチンは、 例えば、駒をちょっと改造して、歩を2マス進めるようにするとか、 盤面のマスを一回り大きくして、10×10マスにするとか、すると、 とたんに弱くなってしまうのでしょうか?
155 :
デフォルトの名無しさん :03/12/30 20:34
序盤はかなり弱くなるね。 人間のような大局観ないし、定跡のデータが使えないから。 終盤の強さは今と変わらない。
156 :
デフォルトの名無しさん :03/12/30 21:03
>>146 序盤感覚の裏付けのない定跡は張り子の虎。
今のソフトはデータベースとしてもまだまだで、
序盤の感覚も全くない。はっきり言って序中盤は糞。
おまいらなんとかしろ。
157 :
デフォルトの名無しさん :03/12/30 21:12
>>155 なるほど。
それで、その終盤と言うのは要するに詰めルーチンのことなのですか?
詰めのちょっと前の、終盤とかはどうなんですかね?
良く解らないですが、例えば、1手スキとかそう言う言葉があったりするじゃないですか。
これは、中盤に含まれる概念なのでしょうか?
158 :
デフォルトの名無しさん :03/12/30 21:33
>>157 手すきは終盤の話。
終盤は必死まで実装済み。
手すきの計算も時間の問題。
ただ、戦略や大局観や構想はだめだめ。
萌芽も見られない。
159 :
デフォルトの名無しさん :03/12/30 22:14
>>158 必死ってのは、要するに詰め将棋状態なんですよね。
こっちがミスらなければ絶対に相手が詰む状態まで持っていけると言う状態で
つまり、人間が詰め将棋をやっているような状態に相当するわけですよね。
手すきってのはつまり、その1つ前の段階ですよね。
相手がミスって、こっちがミスらなければ(又は良い手を指せば)、
必死状態に持っていけるような段階ですよね。
なるほど。
160 :
デフォルトの名無しさん :03/12/30 23:28
>>159 なんか微妙にズレているかも…。
必至とゆーのは、自玉が即詰みでなければ次の手番で
相手玉を即詰みもっていける状態のことで
○手スキというのは、たとえば2手スキならば、
攻めを2手放置すると詰んでしまう状態のことだと思います。
161 :
デフォルトの名無しさん :03/12/31 00:38
ああ、なるほど。解りました。 ありがとうございます。
162 :
デフォルトの名無しさん :03/12/31 00:50
つまり、 片方だけでなくて、お互いの状況が関係してるわけですね。 解りました。
上の方にハッシュテーブルへの登録の仕方が書いてあるのですが、 ハッシュ値の求め方は、 long table[32][81];/* [先手後手の駒の総数][全ての枡] */ void init_table() { for(全ての駒) for(全ての枡) table[駒][枡] = hash_rand(); } /* 32ビットの乱数を返す */ long hash_rand() { return (rand()) ^ (rand() << 15) ^ ((rand() % 2 << 30); } で、table[32][81]にそれぞれ32ビットの乱数を入れておいて
現局面のハッシュ値を求める時は long get_hash() { long hash = 0; for(全ての枡) if(駒があれば) hash ^= table[駒][枡]; return hash; } で、駒に当たる度にあらかじめ作っておいた乱数でXOR演算をしていく、ってので良いですか?
>>164 それでいいと思われ。
後は64bitにしてやれば完璧かと。
166 :
◆R/rLuLKeEI :03/12/31 18:20
持ち駒は?
>>165 ありがとうございます
でも、
>>166 さんご指摘の通り、持ち駒は?と気になったんですが・・・
これはどうするんでしょう、、
取りあえず、持ち駒用のハッシュ表を作るか、
同じように持ち駒もXOR演算する、のどちらかになるんでしょうが。
この辺は他のプログラムを参考にしてみます。
持ち駒はハッシュしないで何が何枚か分かるように持っておくと、 盤面が同じで持ち駒だけ違う局面があればすぐにわかるので便利たぬ
169 :
デフォルトの名無しさん :04/01/01 13:43
>>168 >盤面が同じで持ち駒だけ違う局面
実戦でそんな局面あるのか?
持ち駒が同じで盤面が違う局面はあると思うが。
>>169 思いっきりあるだろ。水平線効果を知らんのか?
>> 169 歩を無駄に成り捨てては打ちなおすプログラムみたことない?
実際にはパスできないのになんで、パスもよんでいるんだろう。
第14回世界コンピュータ将棋選手権 申し込み期限 2004年1月15日
176 :
デフォルトの名無しさん :04/01/08 11:36
>>173 指し手を絞り込んだときなどで他にいい手がなかったから。
駒をとる手、成る手、逃げる手などを中心に生成してるとパス手を入れないと読みがおかしくなる。
>>173 他にもパス手を読んでおくといろいろおいしことがある。
詳しくは「コンピュータ将棋の進歩」とかを読むべし。
180 :
◆R/rLuLKeEI :04/01/12 00:00
「コンピュータ将棋の進歩」はなくてもそんなに困んないよ。 2,3,4を持ってれば十分。
>>180 よっしゃ、それは、過去の積み重ねに頼らずに
自己流でやりなさいと言う、神のお告げでありますよ。
183 :
◆R/rLuLKeEI :04/01/12 02:08
2、3、4は入手困難になる前に買いました。 コードはすべて自己流ですが、基本的な戦略は典型的なものの組み合わせになってしまう予定です。 今、思考部分は後にしてUIをいじくってます。 まあ、OOPの自由研究を兼ねてがんばってみます。
>>182 >>183 『過去の積み重ね』をある程度丁寧に実装すれば、「うさぴょん」程度の強さの
ものは作れます(笑)。
しかし、それだけでは「うさぴょん」を超えるのは…(^^;
うさぴょんよりも強いかも知れないプログラムの一つとして、きのあ将棋の
「きのあ」さんなんかがきのあさんの自己申告に拠るとかなーり自己流で
プログラムを作っています。
が、話を実際に聞いてみると、基本的なツボは押さえてます。
それから、明らかにうさぴょんよりも格上の成績を例年残している、
磯部将棋もなかなか独特な手法を使っているようです。
でも、やっぱり基本的な骨格は『過去の積み重ね』の上にあります。
何だかまとまりのない話になってしまいましたが、
せっかく使える『過去の積み重ね』があるんだから、使えばいいんじゃないかなーと。
それから、一度は大会に出てきて、強豪の工夫の自慢話?を聞いてみるのも、
強いプログラムを作る上での近道かなーと思います。
185 :
◆R/rLuLKeEI :04/01/12 08:34
>>184 自分の過去の積み重ねはもちろん他人のもせいぜい使います。
インターネットでただで辿り着ける所は一通り回ってアイデアを集めて練っているところです。
GWはお客さんの工場が止まる絶好のシステム切り替えの時期なんで難しいな。
将棋と言うのは例えば、香車を一番上まで進めた場合、 移動できる場所がなくなるから、絶対にならなければいけないと言うルールが 存在するのでしょうか? もちろんこの場合はなった方が有利に決まってますが、 ルールとして強制的に成らないと駄目っていうのがあるのでしょうか?
なんなきゃだめってルールある④
おお、早速ありがとうございます。
この週末は「コンピュータ将棋の進歩」探しと最強の将棋プログラムを練り直しのために泊り掛けで久美浜・小天橋に行って来た。 しかしながら、宿にまともな分厚い碁盤・将棋盤もあったにもかかわらず、全く進展無し。 地方の本屋に残ってないかと思ってたのに本屋が見つからなかった。 まあいいや。
久美浜、小天橋って将棋の聖地か何かですか?
先の書き込みのmail欄を見て頂けたら分かります。 そっちが真の目的です。 ごめんなさい。
いえいえ、 良かったですね。
195 :
◆R/rLuLKeEI :04/01/19 00:15
5度目の挑戦。 ようやくGUI版簡易表示機能が一段落したんで明日から局面の着手可能な手を列挙する部分に取り掛かる予定。 今日はもう寝る。
196 :
◆R/rLuLKeEI :04/01/21 21:38
αβ探索で使う局面表って忘却機能付き記憶場所のようなものですか? ハッシュとリストで全局面を覚えていたらSSS法のようにメモリ不足になりません?
>>196 なります(w
なので、ハッシュだけ使って、ハッシュ上でぶつかったら新しい局面で上書き
してしまうのが普通のやり方です。凝ったことを考えるなら、より重要な局面が
ハッシュに残るようにするとなお良いでしょう。
ちなみに、『局面表』はHash tableの日本語訳です。
198 :
◆R/rLuLKeEI :04/01/21 22:15
局面表とTransposition Tableは似て非なるもの? エントリの衝突時にどちらを選ぶかは将来その局面を再訪する可能性の高い方とか? コンピュータ将棋の進歩2~4に何かヒントが書いてあったような気がする
>>197 ,198
あぅ、自分ですごい間違い書いているのに気が付いて訂正しにきたけど既に突っ込まれてる(--;
そうです、Transposition Tableの日本語訳が局面表で、Transposition Tableの
実装は、通常、単なるHash Tableです。
上書きの話だけど、
再訪する可能性の高い方という考え方もあるけど、結果を得るのに時間がかかる方
(つまり、より探索ツリーの根に近い方、末端から遠い方)という考え方もある。
それから、十分にテーブルが大きければ、衝突回数なんてたかが知れているので
無視するというのもありでしょう。
200 :
◆R/rLuLKeEI :04/01/22 01:33
弘法にも筆の誤り ほとんど衝突がないなら局面表の初期値を定跡で埋めておくのはありかな。 ある局面Aが定跡内なら最善手は局面表内にあるはず。 なければ定跡ファイルを検索。 定跡ファイルになければ通常の探索へ移行。 ある局面Aが定跡外なら通常の探索。 途中で局面表に残った定跡に戻れるかもしれない。
>>200 面白いアイデアです。
でも、実際に考えてみると、相手が定跡を外した(指し手の前後を間違えた)
時に、読みで咎めることが出来るはずなのに定跡に戻す手順を選びそうで
ちょっとイヤかも。
うさぴょんはどれくらいのつよさなんですかね? 自分の棋力ではこの前、 序盤を定石どおりに戦って、後半ひたすら守りに徹したら千日手になって終わったのが 一番いい成績ですね。 つまり、それ以外では全部自分が負けてますね。 まあ、自分は激弱なんですが、 他のソフトと比べてどれくらいなんですかね? やっぱり、最強クラスの東大とかとは全然次元が違ったりするのですか? もう、話にならないくらいの差があるものですかね? 例えば、東大が100としたらうさぴょんは80とかそれくらいは行きますかね? 確か、以前の成績とかではたまには うさぴょんの方が勝てるような話もあった気がしたんですが、、。
あ、そうだ。 最近ダウンロードして、 楽しませてもらってます。 ありがとうございます。
>>202 東大を100としたら、っていう質問には答えるのが難しいですね(^^;
じゃぁ0は何?とかいう感じで(^^;
24のRで言うと、東大は最高2200くらいらしいので、うさぴょんの最高が
1550なので、東大を100とするとうさぴょんが70くらいでしょうか。
ちなみに、Rで400の差があったら絶対に勝てないくらいの差です(w
次元が違うと言ってもいいかも知れません。
世間向けの無難な答えとしては、大会版の東大を4.5段としたら、
大会版のうさぴょんが2段くらいですが、これは普通にやったらまず勝てない
というくらいの差です。
でも、この間の大会ではうさぴょんがまぐれとはいえYSSに勝ったわけで、
絶対に勝てない差ではなく、多分50000回に1回くらいは勝てるのでしょう(w
スレッド違い、御免。
>>204 レーティングと勝率の関係がよくわからん。
http://www2.saganet.ne.jp/a-sim/mhp0726.html より
レーティング200点差=1段差=勝率半減 (*)
とすると、うさぴょんの東大に対する勝率は
0.5^((2200-1550)/200+1)≒0.05256。
うさぴょんは20回に1回は東大に勝つ?!何故に?
まあ、24のレーティングの解説には勝率については何も触れられていないが…。
前提(*)が間違えてんのかな。
>>201 十分な時間を掛けて平手から通常の探索をした結果を定跡集と称して対局開始前に
ロードしておくのはずるいかな?どうなんでしょ。
>>205 完全探索に近い探索をして定跡外しの補完をする、という意図ですよね。
その場で読むくらいだったら前もって読んどいてやる、みたいな。
別にズルくないと思いますよ。
どれくらい「役に立つ」かは判りませんけど……。
>>206 うさ親さんからの開発者としてのコメントの方が信用できるとは思いますが、
将棋を指しているものからすると、うさぴょんが20回に1回勝つ、というのは
難しい気がします。
人間でもそうですけど、格下が格上に勝つには、格下の出来がよくて格上の出来が
悪くないと無理ですよね。この「出来」にはポカやミスも当然含まれます。戦形の
得手不得手もあるでしょう。
人間は、戦形の得手不得手でミスる(相手の得意な形に敢えて合わせる)ことは
しないでしょうから、ポカやミスなどしか期待できません。
しかしするんですね人間は(笑)。
一方、コンピュータ同士は、ポカやミスはほとんどしません。とすると戦形による
力の出具合によっては一発、という期待しかありませんが、それもやっぱりよっぽど
「運」がよくないと期待できないと思います。
100回に1回くらい、が妥当かなあ……と個人的には思ってます。
>>204 ああ、なるほど。
詳しい説明ありがとうございます。
良く分かりました。
強さをどう、数値化するかという問題ですね。
例えば、腕相撲をした場合、
100キロの力を出すマシンと、90キロの力を出すマシンでは
必ず100キロの方が毎回勝つに決まってます。
この場合、勝率は100:0ですが、
実際に出す力を数値化して強さを計った場合は、
100:90に成るわけでね。
>>206 R400の差が絶対勝てない手合いでないことは24の対戦を見ていれば分かると思います。
実際に対戦させてみないと分かりませんが、400点差なら32回対戦させれば1回は勝つでしょう。
> しかしするんですね人間は(笑)。
> 一方、コンピュータ同士は、ポカやミスはほとんどしません。とすると戦形による
しかしするんですね、コンピュータも(笑)。
というのが正しいと思います。
苦し紛れに無意味に歩を損してくるのは少ないとはいえ相変わらずありますし。
210 :
◆R/rLuLKeEI :04/01/25 16:26
>しかしするんですね、コンピュータも(笑)。 しかもポカやミスだと思ってないんですね、コンピュータは(笑)。 地平線効果で歩を損した方がお得と思っているらしい。
最近囲碁の方が面白い。
>>209 R400の差の人間同士を実際に対戦させれば、少ない方が勝つことがあるでしょうね。
…コンピュータ同士だと、まずなさそうですが(^^;
人間同士でも、Rのシステムを考えた時、R400差があるのに32回に1回以上勝てる
ようだと、Rが400以上上の人間に挑戦し続ければ、Rが実力よりもかなり上まで
上がることになるわけで、R400差って、本来32回に1回も勝てないような、
絶対的な差でないといけないんですよね。
もっとも、
>>205 での議論のように、実際にはR200の差で勝率半減、400差
ならさらに半減程度の差しかないのかも知れません。その場合、24のRのシステム
自体、上位者に挑戦しまくる人がRが高くなるという、やっぱりちょっと問題ありっ
てことにもなりますが。(いや、実際に問題起きているような気もしますけど…。)
>>207 うさぴょんが東大に20回に1回勝つのは難しいでしょうね…。
配布しているうさぴょんは、定跡を乱数で選択しているので、自分の不得意な
形も指しますし、東大の不得意な形を指すこともあるんでしょうけど、
そういった『穴』はどう考えてもうさぴょんの方が多いので、500回に1回
勝てればいいとこじゃないでしょうか。
それでも、市販版の東大になら、時間をかけて序盤作戦で工夫を重ねていけば、
20回に一回勝てる定跡くらいなら作れるかも知れません。
#多分、坂田流向かい飛車とかそう言った変な戦形でしょう(^^;
東大将棋の1とか2の頃には、駒組みを上手く進めると一方的に好きな作戦を
選べて、先手なら勝率100%、後手でも勝率75%とかいう定跡もあったの
ですが(笑)。
でも、この間のYSS戦みたいに、コンピュータじゃなくて人間が油断して
くれれば、勝てる可能性は増えます。
実際、あの将棋はYSSにうさぴょんが勝ったのではなくて、山下さんが戦略=
定跡の選択を間違えて、うさぴょんの得意な形にぴたりとはまり、その結果
ああなった、という将棋でした。山下さんが勝手に転んだんだと認識してます(笑)。
>>211 囲碁、作ってるけど基本的なところが難しすぎ(笑)
勝敗を判定することすらまだ出来ないよ。
215 :
◆R/rLuLKeEI :04/01/26 02:06
五度目の挑戦。 この一週間で進んだのは先手後手を別スレッドで開始させるところまで。 着手可能手の列挙はいつになることやら。 時間が足りない。
216 :
◆R/rLuLKeEI :04/01/27 01:19
開始した両スレッドの内、現在の手番以外は停止、現在の手番が 探索開始局面に全ての着手可能手を問い合わすメソッド(中身は 空。nullを返す)を書いた。 先に終局/投了時の処理を書く予定。 前向き枝刈りを入れるなら局面に着手可能手を問い合わすメソッ ド内に入れるべきか、得られたリストから不要な手を消してやる べきか考え中。 最初は単純に前向き枝刈りはしないほうが見通しが良さそうな気 もする。
全ての着手可能手の列挙は早目に作るのがいいよ 動いて楽しいから 多分そこが山場 その内 詰将棋では王手だけ列挙とか工夫をしたくなるけど工夫の段階に 入ればやる気が続くから
218 :
◆R/rLuLKeEI :04/01/28 03:14
>>217 さん、ありがとう。
まずは遅くてもいいから正しく漏れなく生成するやつを目標にやってみます。
前回の挑戦末期はここの高速化をいじり始めて発散してもうたから今度は慎重に。
Pascal/Cなら考えながらでもコードが出てきたのにJava/C++だとうまくいかんね。
AIとはあまり関係ない部分の話ばかりで申し訳ない。
(おそるおそる) プログラミング=C言語をDOS窓のだけ少し 将棋の棋力=24で7級 という漏れでも、将棋ソフトつくれますか?
220 :
◆R/rLuLKeEI :04/01/30 02:04
(おそるおそる) 高品質・短納期を求めなければ作れます。
221 :
◆R/rLuLKeEI :04/01/30 02:22
ちなみに、私の棋力=知人とは未だ勝ちなし(笑)。 24に入ろうとしてガイドに従ったら最低ランクだったのでまだ一度もやっていない小心者です。 なのに作ろうとしている。 人工知能と言語学習の格好の題材だと言い訳しつつ滑稽だなと自分でも思う。
>>221 うさぴょんを作り始めてから将棋のルール覚えたから全然問題ない。
>>219 C言語の腕はもう少し磨いた方が…。
>>222 [うさぴょんの育ての親]さんチームの人やベースになった鈴木将棋のへっぽこ鈴木さんも作り始めてから将棋のルール覚えたのですか?
本来の将棋プログラムを離れて、JavaとOOPとデザインパターンを勉強中。
将棋プログラムに適用できそうなパターンが幾つかあるのに気が付いたところです。
あ、ハブ夫さんに続いてうさぴょんダウンロードしました。
フリー最強ではなくなって1日のダウンロード数が減っているそうですね。
>>223 へっぽこ鈴木さんは一応4段です。将棋を覚えたのは小学生の頃らしい。
ところで、実は『うさぴょん』は、フリー『最強』になったことがないんですよねぇ。
『最強クラス』なのは確かだと思いますけど。
最近、ダウンロード数が伸びないのは、また別の原因で、要するに宣伝不足かと。
K-ShogiがVectorに登録されているし、棋力もまともになった(
あまりうさぴょんと変わらないと思う)ので、相対的にうさぴょんが目立たなく
なったんでしょう。うさぴょんもVectorにでも登録すれば、相当ダウン
ロードされるのかなーと思います。
誠実な回答ありがとうございます。 とりあえずは、コンソールでデータ構造がシンプルで、プログラムの見通しのよい物を作ってみます。 (最強を目指せっていう突っ込みはなしね^^;;) 3目並べは以前作ったことがあので、将棋の前にオセロあたりをまず作ってみます。 11月くらいに将棋が動けばいいかな・・・と。のんびりやります。
ついにvc6.0++を落としたぜ^^;;) しかし使い方がさっぱり分からんw
227 :
デフォルトの名無しさん :04/01/31 00:12
通報させていただきました。
のんびりオセロを作成中・・・ 「局面」の初期化と表示はできるようになりました。 さて・・・ 「指し手」のデータ構造/生成を考えてみます。 後戻りできるようにしないと・・むむむ。 ってことは・・ ・指し手生成 ・指し手実行 ・指し手取り消し(undo) ・入力 かな・・・ (オセロならいっぱいソース転がってるでしょうけれど、とりあえず自力で) 将棋まで遠いけれど、カンベンです。
229 :
◆R/rLuLKeEI :04/02/01 05:50
初期局面の着手可能手の列挙が一応出来た。 まだこの局面では打つ、行き場のない、成る、敵の駒を取る、自玉を晒す、千日手などは起こらないので手抜きしている。 前回C言語で思考部分の同じ処理を書いた時はもっと苦労した。 今回はUIも含めてやっているが、これがOOPの威力なのか!と、ちょっと感動。 オセロの人も頑張れー
>>229 お疲れ様ー&ありがとー
こちらの進捗状況は、
・指し手生成 →未テストだけど動作するようです。
・指し手実行 →同上
・指し手取り消し(undo) →まだ
・入力 →手抜きで作成済み
んで、undoを実装するまえに、
「局面をファイルからの読み込む」機能があると便利かなぁと思って、それを作成中です。
テストとかも自動化できそうかも、とか考えてます。
・・・将棋だとCSA形式っていうフォーマットがあるけれど、アレの局面データの読み込み大変そう・・・
231 :
◆R/rLuLKeEI :04/02/01 12:27
夜更かしの反動でまだ布団の中。 >>オセロの人さん 局面の読み込みはCSA形式のサブセットもどきを実装済。 持ち駒と成りのない局面なら読み込める。 今後の予定は先手:人工無能、後手:手入力(他の将棋ソフト)で対戦。 人工無能、局面表示の更新、後手番で局面のSAVE、UNDO/REDO、入力を実装する。 三手目までいけたら後は細々としたルールを実装しながらSAVE、終局まで対戦。 終局したら定跡学習の実験と人工無能の改善。 必要な機能は必要になったときに実装する方針。 つい長くなってしまった。 申し訳ない。
Delphiで作り始めてみたものの... クラスメソッドは一つのファイルに記述しないといけないみたいなのでDelphiで作るのは諦めました。 勉強を兼ねてC++で作り直すことにします... _| ̄|○
>>R/rLuLKeEIさん
昔いきなり将棋を組もうとしてCSAファイルで挫折したので、すごいなぁと思います。
作り方や方針を聞くと、刺激になります。
こちらはボトムアップで作ってます。
そちらはトップダウンで作ってるのかなと思っています。
こちらは、のんびり作成中です。
指し手生成/実行/取り消し(undo)、局面表示/読み込みは実装済み。
今後は、上の実装はチェック不足なので、チェックできるようにインタプリタみたいなの組もうと思います。
文字列"p"が入力されたら盤面表示、"g5"とか入力されたらオセロの指し手とみなして手を進めるとか。
インタプリタが出来たら、終局チェックとか、パスなのかって判定を作って。
ああ・・・思考部への道は遠いです。ごちゃごちゃ、書いてますが・・・書くと方針が決まるので(^^;;
>>232 ふぁいと!
インタプリタというかコマンド解釈部を作ってテストしてました。 エラーは全部コマンド解釈部にありました。 オセロの基本動作部にはエラー見つからず・・・なんだかなぁ。 ということで、今日はお終い。 今度は終局判定とパス判定を作ります。 そしたら人対人のゲームができる・・・かな。
235 :
◆R/rLuLKeEI :04/02/02 01:45
>>232 implementation以下に全部入れないといけないみたいですね。
こっちは将棋プログラムには向いていないJavaですが、Javaも似たようなも
んです。
C++やObject-Pascalと違ってヘッダみたいなのがソースにはないんで、メソ
ッドがコードに埋もれていく。javadocあるからいいけど。
>>オセロの人さん
他の将棋ソフトが出したCSAファイルはまだ読めません。
良く似た別物です。
具体的にはCSAサーバープロトコルのBEGIN POSITION~END POSITIONの一部分
だけしか読めません。
設計はトップダウンで実装はボトムアップというか混合でというか適当。
C言語でそんなにあっさり作れるんですね。
昔、窓じゃないDOSでTourbo Pascalを使ってJIS-PASCAL水準0の範囲内でオ
セロを作ったことがありますが、とっても恰好悪いインターフェイスで待っ
たはないし、読み込みもない、弱い遅いメモリ食いと良いとこ無しで、修論
をいじくっている内にソースごと何処かへ行ってしまった(笑)。
UUCPでメールをたらい回しにしていたような頃です。
実装の続きは多分次の土日。
それまではデザインパターンの記事(Cマガ1999/4~11)を精読。
236 :
デフォルトの名無しさん :04/02/02 02:04
このスレ地道に続いてますね。 個人それぞれの作った将棋の思考ルーチン同士をネットワーク上で 戦わせるためのプロトコルと、そのライブラリって簡単にできたりしないかね? 比較的簡単だと思うんだが。 既に話がでていたらごめん。
>>236 >個人それぞれの作った将棋の思考ルーチン同士をネットワーク上で
>戦わせるためのプロトコルと、そのライブラリって簡単にできたりしないかね?
ええと、既にある。
一番使われているのはCSA将棋じゃないかな。
238 :
◆R/rLuLKeEI :04/02/02 08:51
補足 コンピュータ将棋協会が公開しているシリアル及びTCP/IPプロトコルとサンプルルーチンがありますよ。 都万さんによる思考部のない実装(上で挙がった"CSA将棋")があります。 CSA将棋を使わないのは素では自宅の開発環境で動かないから。 通信プロトコルは自前のPlayer抽象クラスが安定したら CsaPlayerサブクラスを作るつもり。 予定は未定であり決定では…
240 :
◆R/rLuLKeEI :04/02/03 00:09
>>239 オセロの人さん
ありがとう、既に訪問済みです。
でも電子媒体より紙の方が扱いやすいのでこの記事でいいです。
関係ないが風邪ひいてもた。
>>236 前スレッドで分岐した「おまいら最強の麻雀プログラムしてみろよ」も地道にAI開発が進んでいますね。
興味津々。
関係が薄いのでsageます。
このスレでゲームうpした人いる? ソース無し、思考激弱又はユーザー対戦のみでよいから見てみたい。
皆さんがんばってますね。 関係ないけど、なんか、同士ががんばってる気がして、 嬉しいですね。 同じ目標を持ってる仲間見たいのが居ると、なんだか励みになりますね。 お互いがんばりましょう。 いずれ、最弱決定戦くらいは開きたいですね。 それには、24を利用しても良いですしね、、、。
簡単にレス
>>242 失礼、書籍名書かなかったので勘違いさせちゃいました。
お風邪は大丈夫ですか?
>>243 私はUPしてないです・・・今やってるオセロは公開しないつもりです。
>>244 ですよね。
私もこちらの書き込みを読んだり、
こちらに書き込んだりすることが励みみなってます。
オセロの近況:
現在、思考ルーチン同士の対局が出来るようになってます。
・最初に発見した手を指す
・1手指してみて、自分の数が最大になる手を指す
・全幅探索
ってのがあります。
で・・・全幅探索が納得いってないので、
・思考中の評価値をプリントする(正しいかチェックできない)
・プログラムがすっきりしてないので、綺麗にする(自分で書いたものが分からない)
・性的評価関数と探索の深さを外部から指定できるようにする(いちいちコンパイルしなおすのはちょっと)
やっぱし、勢いで書いちゃだめですね。
246 :
◆R/rLuLKeEI :04/02/04 02:34
>>243 私を含めてこのスレッドでは誰もupしていない。
いつか自分のページを作って公開する予定。
>>244 ハブ夫さん
頓挫しないのは皆さんのお陰。
最弱決定戦いいですね。
何れやりましょう。
>>245 オセロの人さん
風邪はひどくなりました。
薬用酒飲んで寝ます。
貴方も熱中して体壊さんように。
Javaの言語仕様を読み始めた。
なんか将棋から離れていってる…。
なお悪いことに次の土日は少なくとも一日は仕事が決定したし、
翌週の土日に至っては二日とも出張。
ほとんど注釈入れてないから解読が不安だなあ。
俺はついに悟った、、、。 将棋とは攻めないほうが強い、、、ひたすら守って、相手が無謀に攻めてきたときだけ、 その無謀な敵の駒をゲットする動きだけを繰り返せば良いということを、、、。 大体、俺がうさぴょんとやって負けるときは大抵攻めてるからだ、、、。 そこで、銀金王金銀の駒だけをそれぞれ1枡だけ上げて、その状態をひたすら維持した、、、。 すると、、、 千日手になって終わった、、、。
ふう、俺の中ではかなりの好成績だ。 何しろ、いつも負けてるからな、、、。 やはり、将棋とは守った方が強い、 将棋=待ちゲー理論、ガイル理論成るものを提唱したいと思う。 大体、攻めるってことは自分の駒を前に進めると言うことだ。 すると、どうなるだろうか? そう、自分の駒の中から1駒だけ全体の中から突出してしまうわけだ。 すると、その駒は、当然餌食になりやすい。 逆ならどうだろうか? 敵が無謀に攻めてきた場合、自分の強力な駒組みの中に一つ、又は少数の駒が進入してくるわけだから その駒をとって駒得を果たせばよいのだ。 これを繰り返せば、駒得を繰り返した結果、少しずつ、有利になってくるわけだ。
ただ、問題は千日手になるだけの結果しか起きないと言うことだ、、、。 これが最大の問題である、、、、。
アホか!?
>>247 >銀金王金銀の駒だけをそれぞれ1枡だけ上げて、
端攻めや棒銀で一点突破を狙われると即死しそうな。
大概のソフトは守りが堅いわりに攻めが下手だと思うけど、
その辺り、人間の読みと何が違うのかな。
>>245 >>246 今、目標が無いから、2,3人うpしてくれれば、前作ったのを修正して
参加しようと思った。1番目は何か嫌だし。うpお待ちしてます。
>>247 将棋の駒は前に動きやすいように作られているから攻めの方が強く
上級になるとそれでは通用しにくくなる。駒を盛り上げてって攻めの体勢
自体を作らせないように指すやり方はあるけど。
その囲は玉頭がかなり薄い。中住まいに似ていると思うけど、
金銀が逆なだけで大きく違う。5筋の歩、桂だけで簡単にやられそう。
>>251 指手が多い序盤は定跡で、少ない終盤はコンピュータの読む速さを
利用してだけど、中盤はまだ難しいとされているね。
相掛りの時に、歩の突き捨が必要なことが多いけど、一時的な駒損に
なるから苦手だったり。
>>252 なるほど。私がただ、へたくそだと言うだけですね。
>>243 ・思考激弱(というよりただ単にαβがプログラムに書いてあるというだけで、実際は何とか駒が動いているレベル)。
・手数や指し手の記録および表示なし。
・粗末なGUI。
・見辛いソース。
という、お笑いレベルのものでよければうpしますが(^^;
今日はコーディングしてません。(^^;; 昨日書いた目標で ・思考中の評価値をプリントする →どうしよ ・プログラムがすっきりしてないので、綺麗にする →どうしよ ・性的評価関数と探索の深さを外部から指定できるようにする →これは簡単。引数に評価関数と読む深さを追加すればいい どうしよ・・・のところは書いてみないことにはわからん・・・ って停まってます。 とりあえず、ちょっと後退して、 読む深さは無視して1段目の評価値だけプリントするようなプログラムを書きますか・・・ 考えをまとめるための捨てルーチンですね。速度&汎用性は考慮しない、分かりやすいもの。 ここに書くと、考えがまとまります。ではでは。
>>254 おお、すごいー。私はCUIの人なので、尊敬!
>>254 師匠と呼ばせてください。
いろいろ研究したが、GUIの作り方がさっぱり分からん。
っていうかCUIの方も途中で挫折したわけだがw
そういう訳で、是非うpしましょう。
できれば、コメントたっぷりでお願いします。
あとそれとは別に、詳細を綴ったテキストファイルを同封するとみんなが喜びます。
>>253 逆に急戦の方を覚えたほうが効果があると思う。
>>254 ぜひ!おながいします。
>>255 自分のオセロは6手読みで角端をねらうだけ。
指せる手の種類が多いとき時間が掛かるので、中盤は1手30秒掛かる事もある。
えっと、とりあえず今のところ将棋プログラムするのが難しいので うさぴょんの、定石強化しようと企んでいるのですが、うまくいかないです(TT;; 一本道の定石ならうまくいくのですが、分岐が入るとどうも、うまくいきません。 将来的にはKIF形式に対応したいのですが、どうすればいいのやら、さっぱりですな。
ソースに関しては、うさぴょんを参考にしている部分があるので うさぴょん育ての親さん(作者)に連絡をとってみます。
261 :
◆R/rLuLKeEI :04/02/05 08:04
232さん、すばらしい御決断です。 などと病床から応援します(咳が止まらない)。
>>260 ソース確認しましたよん。
既にメールでお返事しましたが、どうぞ公開してください。
>>257 自分はCUIで最初はA∀とかで表示してたのだけど、
GUIにしていろいろめんどくさくなって製作を中止していた。
うp楽しみにしています。
>>262 ありがとうございます。
>>263 うpありがとうございます。遊ばせてもらいました。
シンプルですが、作っていく上で土台となる部分はしっかり出来ている。
まず、基本的なルール部分が出来ていて、ドラッグ操作というのでもすごい。
思考は、いきなり角交換、95角という手でびっくり。
でも自分でもこう指すという手を結構指してきてやるなと思った。
これからも製作を頑張ってください。
>>263 お師匠様うpサンクスです。
おいらの実力では、ソース見てもさっぱりですたw
もう少しプログラムの修行をせねばならんな。。。
>>262 さん
>>うさぴょんの育ての親さん
公開ありがとうございます。
こちらのオセロの近況:
全幅探索(mini-max法)は納得いったので、次はalpha-beta法に挑戦予定。
その後、評価関数を作成して比較・・・って構想です。
パスした後の探索してませんが、オセロを強くするのが目的ではないので、捨て置くつもり。
今月中には将棋に移行したいと考えてます。
プログラムの構成方法や、調整のしかたをオセロで演習するつもりでしたが、
構成方法はオセロで理解できても、
調整のしかたは私にオセロの知識がないので、
調整のしようがないなぁと・・・。
あ、知識を使わないで調整する方法を探します。
いつもどおり、ここに書いて、頭を整理するオセロの人でした。
267 :
◆R/rLuLKeEI :04/02/07 02:46
近況: 毎日終電or徹夜and休出で全く進まん。 以前のように時間外の会社のリソース使って最強(予定)の将棋プログラムしてみたくなってきた。 夜食の代わりに日曜プログラミング。 まだupされたソースをじっくりみていないが駒のドラッグ&ドロ ップはラベルのようなコントロールではなくピットマップを都度 描き直してるようだ。 Javaでもそうするのが自然なのかな。本質的でない所で躓いてる。 オセロの人さんの将棋の方が先に完成する予感。
>263の思考ルーチンって、自分が有利な状況でも割とあっさり投了する気がするのは気のせいだろうか。
>>268 正直、思考してません(^^;
添付のreadme.txtにも書いてあるように適当な評価関数で動いているだけです。
投了の件も含め、色々バグがあるかもしれません。大目に見てやってください(^^;
うさぴょんの育ての親さんのHPに「将棋プログラムの作り方」が載ってますが、(
>>72 )
その中に、
「ここまでは基礎技術で、将棋プログラムを書き始めれば
誰でも調べものをしながら到達できる地点です。
ここからが各将棋プログラムの工夫になります。」
とコメントされている場所があります。
>>263 のプログラムは、「ここまでは」に当てはまるレベルです。
「ここまでは」でこれほどむずい。もう少し低レベルで共同開発、研究できないか。
271 :
◆R/rLuLKeEI :04/02/07 13:47
大会に出ないのであれば上の方で紹介されてたライブラリを使うか大会に出るのであればUIはCSA将棋に任して思考部分に集中する くらいが現状では最も楽な選択肢かと。 CSA将棋が内部で持っているであろう局面の複製や合法手判定、局面の遷移などのサービスルーチ ンが利用できたらもっと楽なのに。 今、JavaでUIから作り直しているやつはUI側からPlayer側へ現在の局面を複製したインスタンスが 渡ってくるようにして解決しようと思っている。 思考部分を除いたものをソースなしで公開して他の人がこれを利用したらやはり大会規約に抵触するのか?
>>271 どこまでを「思考部分」と判断するのか...ですね。
「探索速度に影響を与える部分」まで含めて思考と考えるならば、
手の生成どころかデータ構造までも含まれてしまいますし。
極端な話、MiniMax探索やαβ探索を取り入れることですら抵触してしまうことになります。
自分としては、
ソースの流用(一字一句間違ってないようなという意味で)が問題にされるのであって、
アルゴリズムの流用については問題ないのでは思ってますけど...
(つまり、全く同じ結果を得るものだとしても、その結果を得るアプローチが異っていればいい)
UIの話は、大会に出ることを前提としているならばCSAに問い合わせるのが無難かと。
273 :
デフォルトの名無しさん :04/02/07 18:54
>>259 あらゆる棋譜をぶち込む。
対局者の強さや結果の勝敗の程度で重み付けした頻度で管理する。
定跡としてどの値以上を選択させるかを後から指定できる。
そういうデータベースを新たに考えてみてはいかがでしょう。
一億局あたりでほぼ定跡はずれなしになると思いますが。
274 :
◆R/rLuLKeEI :04/02/07 23:59
データ構造は思考部分に当然含まれるでしょう。 となるとサービスルーチンを用意しても結局は利用されなくなるということですね。
275 :
デフォルトの名無しさん :04/02/08 04:27
>>273 世の中に棋譜が1億局もないんですよ。残念ながら。
ましてや信頼出来るものとなるともっとずっと少ないです。
>>275 >>273 で言っている1億というのは局面の数だと思われ。
つまり76歩で1局、34歩で1局と逝った要領。
この調子で仮に1手につき3局面分岐させたとしたら、17手目で1億を超えます。
無論というか言うまでもなく、上記の中には手順前後などによる同一局面が半分以上(8割ぐらいか?
含まれると思います。
これらを、うまく木構造にまとめることができれば、確かに無敵に成れると思うのですが、如何ともしがたい
ものがあるのですよね。そういうわけで、2ちゃんネイチブなデータベースつーのを作ってみるわ。
少しまちなー。
なんか、結構活動が本格的に成ってきましたね。
>>276 同一、重複局面ってそんなにあるのですか?
かなりあるんですね。
まあ、当たり前か、1四歩と2四歩はどっちが先だろうが後だろうが、同じだけど、
どっちから探索しても絶対に出てくる局面ですしね、、、。
278 :
◆R/rLuLKeEI :04/02/08 10:11
>>276-277 1局終了毎に勝者が遭遇した局面と勝者が選択した手の組をDBに保存。
同一局面なら遭遇数をカウント。
同一局面で異なる手があれば上書き。
DBがいっぱいになったら遭遇数最小の局面を全て削除。
ダメだな。1億局面覚えても大半の局面が遭遇数1だろうな。
より強い相手の思考結果を記憶するのは良い案だと思ったんだが。
全手順持つのはオセロならできそうだな
280 :
◆R/rLuLKeEI :04/02/08 11:14
>>289 DBから削除するのを平手から遠い局面からにしたら将棋でも序盤は最強に!ならんかなあ。
最強のオセロはそんなDBで序盤は最強になったとどっかのサイトで読んだ。
281 :
デフォルトの名無しさん :04/02/08 16:30
>>278 遭遇数をそのまま記録したらどうだろ。
まさに頻度管理でいくと。
282 :
◆R/rLuLKeEI :04/02/08 17:02
>>281 >同一局面で異なる手があれば…
のところですね。手を上書きしないで追加して…遭遇数は局面に、頻度は手に持
たせることになるのか?
オセロにはLogistelloが対戦から自動収集したLogistello bookなる良質の定石
集があるようだが、とりあえず
>>276 さんの2ちゃんネイチブなデータベースつー
のを期待しよう。
とりあえず激指3の棋譜集解析でどのくらい棋譜を集めたらいいかの見当はつくんじゃないのか。 頻度もそのまま出てきてるみたいだし。
284 :
◆R/rLuLKeEI :04/02/08 23:50
>>283 まずは激指3でも買うか…Linux版はないよな。仮想機械から導入っと…後回しにして寝よ。
ところでゲーム製作技術板とここは敵対してはるんですか?
285 :
デフォルトの名無しさん :04/02/09 00:52
>>276 局面数でも人間が指した局面が1億局面も集めることは出来ないでしょう。
プロなど信頼できる人間が指した手に限ると100万手くらいのものである
ことは、市販ソフトがいずれもそれくらいの数の定跡を搭載していることから
予想されます。
仮に1億局集めてデータベースを作ったとしても、序盤で20手も指せばすぐに
未知の局面が出てきて大して役立たないでしょうね。
286 :
デフォルトの名無しさん :04/02/09 01:08
>>285 ちゃんとイメージできてますか?
一億局の人間の試行錯誤の集大成ですよ?
一億局の効率的なデータベースで有効そうな定跡はずしが残るとは思えませんが。
>>286 よく言われてることだけど、仮に各局面で平均3通りの定跡手があるとすると、
一億 < 3^17 (3の17乗) = 129140163
なので17手目の局面から既に定跡外しが存在することになる。
あ、あと、定跡は下手に外された時にそれを咎められなくちゃいけないけど、 既存の棋譜には「全ての失敗」が載っているわけじゃないから、 咎める手を自力で捻り出すしかなくて、結局咎め切れないってことはあるね。 というわけでたとえ一億局でも効果は限定的なものになるだろう、に漏れも一票。 もちろん一億局のデータがあればあったで何か使い道があるだろう、にも一票。
289 :
デフォルトの名無しさん :04/02/09 01:42
>>287 その通りで、一億なんて全然大した数じゃないですよ。
しかも、それだけの数のデータを得ることさえ無理だと言ってるわけです。
近況: オセロで煮詰まってたので、気分転換。 将棋の基本データ構造をどないしょ。とか考えています。 考えてるだけで、作業のほうでいえば、成果ゼロの日。 メモはたくさん書きました(^^;;
291 :
◆R/rLuLKeEI :04/02/09 03:43
お早うございます。 オセロの人さんの真似をして覚え書き; ・定跡DBの構造を探索に使う局面表と同様にする。 ・つまり局面と最善手の組をたくさん用意する(多分実戦経験からの蓄積で)。 ・どのエントリから始めても1本道の定跡手順が得られるようにしたい。 ・定跡外しの手で得られる局面がDBにあればその局面の手は咎めの手に他ならず、外しの手を記録する必要はない。 ・次善の手についても同じ。 ・もちろん未知の局面については通常の探索を行う。 ・探索の途中でも参照する。 これはもはや定跡じゃなくて部分解木カタログだ。
おはようございます。 珈琲飲みつつ。 頭の回転が速い時間(朝飯前)に ・オセロのコードのいらないところをバッサリカット ・コマンド駆動部再構築。 ・時間があれば、手の生成部分を改定。 さて、どこまでできるかな。
手順: ・ソースばっさりりカット ・コマンド駆動部(インタフェース入力部)書き換え 結果: 玉砕。 失敗したところ1: コードの要らないところをカットしたが、 その作業結果を確認できない形でカットした。 そのため、確認をせずに次の工程にすすんでしまい、 次の工程でぐちゃぐちゃになった。 →作業結果を確認できる形で目標を立て、 次の工程に入る前に確認をきちんとましょう(;_;) 失敗したところ2: 何も考えないで、入力部をプログラム組みだし、ぐちゃぐちゃになり、まったく進まず。 →きちんと設計しましょう。 設計があいまいにしか出来ないのなら、捨てプログラムなどを書いて、具体的にしていきましょう。 いきなり本番で試すのはダメです(;_;) リカバーをどうするか: ・ソースをバッサリカットする前に戻す ・確認できる形でソースのカットをするよう考え直す ・入力部の設計をする ぐすん。朝の作業は、これまで。
>>293 >玉砕
ワロタ
でも細かく分かり易く書かれているな。参考にさせていただく。
295 :
◆R/rLuLKeEI :04/02/09 07:52
>>293 転ばぬ先の杖。
昨日の自分は赤の他人。
バージョン管理ツールを使ってないことを激しく後悔する瞬間ですね。
296 :
◆R/rLuLKeEI :04/02/09 08:17
CVSやRCSやVSSやソース丸ごとアーカイブとかやっていて簡単に戻せるなら私の早とちりです。 すんません。 VC++ならVSSがIDEに統合されてて便利ですね。
297 :
デフォルトの名無しさん :04/02/09 10:01
>>287-289 あんたら将棋知らんだろ?
一億局の初心者からプロの棋譜を管理してるんだぞ?
定跡はずしできるもんならしてみろ。
定跡は手順前後を処理さえできれば
予定軌道に戻ってこれる可能性が高いんだ。
298 :
デフォルトの名無しさん :04/02/09 10:18
確かに人間が打つならそうなんだろうけど一億局の局面使って評価しても うまく評価できるとは限らないと思うのですがいかがでしょうか。 定跡はずしできるもんならしてみろといいますが 実際には定跡はずしできないようにきちんと評価をするのが難しいのではないでしょうか?
299 :
デフォルトの名無しさん :04/02/09 11:13
>>297 十分良く将棋もコンピュータ将棋も知ってる者ですが。
比較的似たような手順が多く指されるプロの将棋でも、例えば昨日の
NHK杯の森内-谷川戦は6手目で既に過去のプロの棋譜で現れてないようですね。
この局面はまだかつて人類が指したことがあるでしょうが、さらに10手
くらい進んだ局面は、おそらく誰にも指されたことがないでしょう。
将棋の探索空間というのはあなたが考えるよりもずっと大きいですよ。
何しろ指数関数的に局面数が増えますから。
まあいくら理で説いても分かってもらえないようなので、ご自分で
動くシステムを作って、一億局とやらをどこかから集めれるものなら
集めて、試してみるといいでしょう。
最強のオセロを作るのは簡単だと思ふ… まぁ、実用的な速度は全く期待できないけど…
昔ならともかく、今のスペックならあまり速度も問題に ならないんじゃないかな 将棋で最強にするにはどのくらいのメモリとクロックがいるかねえ
>>300 LOGISTELLOに勝たないと最強とは呼べないぞ。
Logistelloとは簡単に対戦できないから中盤はLogistelloと同等で 終盤は10倍以上速いフリーで手に入るZebraがいい対戦相手になりそう。 オセロも強い人間に勝てるプログラムを書こうと思ったら 作者もその人間と同じくらいの強さを持っているか 最初からオセロの評価関数についての文献を読まないと難しいかもね。
>>302 全検索をすれば良いだけ
ただ、300で書いた通り、速度に問題があるけど…
>>304 それを言ったらどのゲームも同じなんじゃ…
>>305 ループするもの(このスレの将棋等)では、全検索はムリ
>>304 メモリは何GB積んでいるの?
というのはさておき、Part1の最初期に出てきそうな発言をかまさないでください。
速度を問題にしないならそれまでの一本道を戻って同一局面かチェックするだけだから ループ自体は問題にはならないでしょ?
>>307 メモリは殆ど必要ないよ
>>308 将棋の場合、どんな局面でも、ほぼループ出来るし、
終局の形が多すぎるので、単純に、全検索をするのは、難しいと思うけど…?
>>309 ループがあっても原理的には解けないわけじゃないのではと言いたいだけで
現実的には全く無理だと思ってますよ。
>>310 >ループがあっても原理的には解けないわけじゃないのではと
…すまそ。確かに、そやね。
312 :
デフォルトの名無しさん :04/02/09 19:39
>>299 相振りにはようやくトッププロが本気になって取り組みだした。
相振りの定跡はこれから充実してくる。
おまえら、とりあえずやれることやってから御託述べろや。
なにが指数関数的だ。
有効そうな局面はあらかた開発済みで、
その近辺も過去にアマの実戦で指されてるんだよ。
24の棋譜みたことあんのか?
314 :
◆R/rLuLKeEI :04/02/09 20:37
>>312 はい、やってみます。
ただ週一位しかプログラムに触れないので実装・テスト完了に半年以上かかると思います。
五度目の挫折が訪れないことを祈りつつ前進したい。
イメージする代わりに妄想されてもね…
24の棋譜って100万局以上以下?
>>312 >相振りの定跡はこれから充実してくる。
そんな都合いいこと言われても…
24の棋譜に 9八香、3四歩、5八玉、8四歩の棋譜あるか。
319 :
◆R/rLuLKeEI :04/02/09 22:00
将棋人口の上位2万人に毎日1局ずつベストの状態で指してもらって年間365万局。1億局まで27年! へぼ将棋も含めれば1年で達成するかもしれんが意味あるのでしょうか? 実装を見送りたくなってきた。
320 :
デフォルトの名無しさん :04/02/09 22:18
>>317 棋界のおおまかな流れぐらい知っておいてくれよ。
昔は相振りはアマチュア主流のマイナー戦法で
ちょっと前まではB級プロ棋士しか研究に取り組んでこなかった。
プロ棋戦での実践例も少なく、少なくとも群としての定跡と呼べるものはなかった。
ところが最近、振り飛車対策で居飛車感覚を使う相振りがよく見られるようになった。
そして、ここ数年の羽生の興味はタイトルや勝率ではなく、
トッププロを相手に実戦で新しい将棋を切り開くこと。
そしていま、相振りの新しい世界が開けようとしている。
>>318 それで反例をあげて「定理」を否定した気になってるの?
だれも定理なんか書いてないよ。
かなりの程度有効な定跡データベースをつくろう。
そのためにはまず形式を詰める必要がある。
そういってるだけだが、なぜムキに反論する?
確率的に起きうるすべてをカバーする必要はない。
棋理的にありそうな有効そうな比較的狭い世界を
できるだけカバーできる定跡データベースをつくることを
考えようと言ってるだけ。
>>319 まず、あたらしい棋譜データベース形式を考える。
次に、久米氏を説得して24の全棋譜を取り込む。
これだけでかなりのデータベースができると思うんだが。
24との提携だな。どちらにもメリットはあるはずだ。
こんばんは、玉砕の人です。 朝の課題は次のようにして片付けるつもりです。 ・ソースをバッサリカットする前に戻す →バックアップから回復。 ・確認できる形でソースのカットをするよう考え直す →ソースのカットはプログラムの変更があるわけだから・・・ 要らないことろを使わないようにプログラムを変更→残した部分が今まで通り動くかチェック。 その後、ソースの使わない部分をカットし、同じチェックが通ることを確認する。 ・入力部の設計をする →変数や制御構造や式はない行指向のインタプリタ。 ・引数の渡し方はmain()と同じようにするか、char *arg(int n)というようにアクセス関数を用意するか? ・別プログラムとして作る。 ・各命令を実行するC関数にジャンプするところまで組んでみる ・各命令を実行するC関数は命令名と、引数を表示するだけのもの 設計ではなくって、作業の進め方の話になってますね(^^;;
>>320 んじゃ言っとくけど、24の棋譜集の中身は多分多くの人が抜いたことあると思うよ。
漏れでも1時間もかからずプログラム書けた記憶がある。
誰も「やらずに」反論してるわけじゃないよん。
まぁそもそも反論してるわけじゃないし。やってみればいいんじゃないの?
勘違い君はほっとけ
>>320 コンピュータが指すために使う定跡データベースという考え方は、止めたほうがいいんじゃないかな?
最終手までの定跡は存在しないわけだから、
当然途中でコンピュータは自分の思考に入る。
が、定跡が終了した時点での正しい評価がコンピュータに出来かどうかが問題。
そのギャップが、今の問題点だと認識しているんだけど...
定跡というのは手順にそって指せば有利な局面に導いてくれるものと自分も理解しているが、
それは研究過程での分岐手順や局面の評価が存在しているからこそ、思っている。
だから、コンピュータが、そういった手順や局面を正しく評価し、
有効活用できるデータとして保存できなければ、
意味の無いものになってしまうと考えている。
簡単にいえば「有利にならない手」をコンピュータが正しく判断できないと意味が無い、
ということ。
>>320 「確率的に起きうる全てをカバーする必要はない。」とあるけど、この考え方が問題かもね。
人が手を考える時は、確率的に起きうる全てを「個々の知識(記憶)に頼って」カバーしてる、よね。
個々の知識(記憶)から判断して手の取捨選択するから。
326 :
名無しさん@お腹いっぱい。 :04/02/10 00:04
I'm just doing my job, nothing personal, sorry
327 :
◆R/rLuLKeEI :04/02/10 01:34
>>320 新しい棋譜データベースの設計にあたって既存の各棋譜データベースの構造とその欠点を挙げたい
のだが、残念ながら将棋に関しても既存の棋譜データベースに関しても無知なので何から手をつけ
たらよいのやら。
既に問題点の洗い出しがすんでおられるのならお聞きしたいのですが如何でしょう。
24から全棋譜を取り込むこちら側のメリットはまあわかるのですが24側に一体どんなメリットがあ
るのでしょうか?
データベース型将棋ソフトというと都万さんのところにある"お城将棋"が思い浮かびます。
その内、評価してみるかもしれません
百万局ならDBいらない。1手2バイト、1局100バイト、100万で200MB。(席は止まりましたか)
>>284 >ところでゲーム製作技術板とここは敵対してはるんですか?
何でですか?
何かあったのですか?
330 :
◆R/rLuLKeEI :04/02/10 07:28
>>328 ありがとう、咳はほぼ止まりました。
DBといってもオラクルやADBASとかは考えていません。
仰る通りファイルベースです。
>>329 正確にはスレッド:【オセロ,将棋】ボードゲーム【囲…がこちらを意識しているようなので舌足らずなこ
とを書いてしまった。
331 :
デフォルトの名無しさん :04/02/10 09:06
>>324 >「有利にならない手」をコンピュータが正しく判断
そんなことができればソフトに定跡は必要ない。
有利かどうかは、実戦譜の頻度に表れる。
だから重み付けをした頻度管理定跡データベースを提案してるの。
圧倒的な量の一本化されたデータベースであって、
後の加工が楽(分離できる、値を変えられる、誰が指したものかわかる)なもの
であれば、ソフトにかかわらず人間にも有益。
>>325 将棋という空間は純粋に確率的な事象ではないんだよ。
有意義的に絞られる全組合せに比べれば比較的狭い空間なんだ。
>>327 プロ棋士や24の利用者に対してのメリットは、
十分に整理された定跡体系をつくるための土台を提供できること。
チェスにはあったが将棋にはなかったものをつくる機会を与えられる。
SETIとか白血病のプロジェクトみたいにや、 一手打ったびに棋譜をたらい回しにしたらええんや。 枝の末端だけ仕事しとりゃええんや、累乗やいうても知れとろうわな。 せやけどそれはやっぱりプログラムとちがうんか、ちがいまっか、 そうか、わかったもう帰る。
>>331 とりあえず誰か棋譜たくさん持ってる人で激指で棋譜集解析かけた人
定跡ファイルあぷキボンヌ。
頻度分布がどうなってるか見てみたい。
>>331 「有利かどうかは、実践譜の頻度に表れる。」
だから、表れない手の場合、どのように対応するのかを聞いているんだけど。
理想的な定跡木を求めすぎ。
将棋初心者に、いきなりプロの定跡を教えるのといっしょ。
手順どおり指したところで、なぜその手順なのかを理解できないし、
もちろん手順以外の手を指されても、その手を理解できない。
初手に▲7六歩や▲2六歩を指すのは、みんなが指しているから、自分も指すの?そうじゃないでしょう。
大駒を働かせようという考えのもとに指される手であって、
結果、初手に▲7六歩や▲2六歩を指すのが他の手を指すより有利という個々の知識として蓄えられ、
さらに、大多数の人が同様の判断や知識によって指すから、
ほとんどの棋譜が初手▲7六歩もしくは▲2六歩になってるの。
極端な話、先手が初手から1六歩、1七香、1八飛と端を狙った場合、
定跡データベースとして、どう対応させたいと考えているの?
>>331 一般的に「~戦法」と書かれた定跡本には色々な局面での分岐手順、それらの評価が
こと細かくかかれているけど、その分岐全てが実戦譜で表れるかといえば、疑問だよね。
ただ単に実戦譜の指し手統計を取るという定跡データベースを目指すのであれば
自分の見当違いということで、今まで言ったこと謝ります。すいません。
>>332 局面から分岐する手の先を他のPCに投げて、そのPCでも同じことを繰り返せばいずれ最初の発信者
のモニタに先手必勝!などと出たりして。
数時間で世界中のPCがダウンするワームになる予感。
累乗<階乗だからまだましか
263氏のUPで、「おお! 盛り上がってきそう!」とか思ってたのだが、
なんか違う盛り上がりになってるな(笑)
>>263 今まで見たフリーの中では盤駒が最も見やすく、感動しました。
338 :
デフォルトの名無しさん :04/02/10 22:43
>>334 ソフトが初手の意味なんかわかってなくても、頻度はそれを代替してくれる。
>1六歩、1七香、1八飛
こんなありきたりのはずし方は、膨大な蓄積の中に包含されている。
もっと根本的なことをイメージしてもらえるかな?
漏れは完璧を求めていない。
確率的に有効な手段を提起している。
339 :
デフォルトの名無しさん :04/02/10 22:47
>>334 >初手に▲7六歩や▲2六歩を指すのは、みんなが指しているから、自分も指すの?そうじゃないでしょう。
大駒を働かせようという考えのもとに指される手であって、
結果、初手に▲7六歩や▲2六歩を指すのが他の手を指すより有利という個々の知識として蓄えられ、
さらに、大多数の人が同様の判断や知識によって指すから、
ほとんどの棋譜が初手▲7六歩もしくは▲2六歩になってるの。
底まで考えてるなら、構想を持たせるアイデアを練ろうとしてるんだろうな?
現実的に有効そうな手法を提案しているのに対して、
やりもしないことで反論されても困る。
ソフトに構想を持たせろ、と前から言ってるのに誰もまともに考えて無いじゃないか。
ゲーム研究の根幹に関わることを、即効性がないからと
後回しにしてるくせに。
近況:
プログラムの要らない部分をカットするため、
関数呼び出しグラフを作成中。地味にやってます。
>>330 咳が止まられてなによりです(^^)
>>339 後半部分だけ。
「ソフトに構想を」ってのはもうずいぶん言い古されてるね。
世界じゅうの研究者が考えてるよ。
ちょっとした研究会に出て、誰でもいいからつかまえてその意見ぶつけてみたら?
「うん、そうだね」って言われると思うよ。
研究者はいつだって一発当てたいと思ってるから、その辺は世界中で形に残らない感じで色々試されてるから。死屍累々だけど。
人工知能屋のコミュニティに入って呑んでみたら?
まぁ非難されてもこちらとしては苦笑するしかないね。
「ソフトに構想を」っていうのもよくよく考えてみればなんか変だね。 ソフトはソフトなりにプログラムによって作られた構想を持ってるはずだよ。 「ソフトに「人間的な構想」」って言うんなら話はわかるけど... まぁ、そういう研究テーマを掲げておけば、すごいことやってますよみたいには見えるけどね。 丸電さんの文章を思い出すなぁ~
343 :
◆R/rLuLKeEI :04/02/11 02:15
>>340 ありがとう。
まだ故障箇所を抱えてますがなんとかなりそう。
昔、静的コールグラフを作るツールをαサーバーで見たけどフリーになかったかな。
仕様書工房は大袈裟で有料だしなぁ。
とうとう会社にソースを持ってきた。
そしたら、文字コードが異なるせいでコンパイル出来なかった。
簡易表示用の駒などの漢字をソースに直書きしているのが原因だった。
とりあえず会社で開発するのは視線が気になるので止める(かも)。
開発環境に左右されないように駒をビットマップファイルにしなくては。
今日もやはり停滞中。
端歩を継ぐ者
>>343 情報ありがとうございます。調子が早く完全になりますように。
近況:
静的コールグラフの作成を地味にやっています。
欲張って、関数のグループ分けもコールグラフに書き込み中です。
・・・ツール自作しようかしら・・・。
現在、ソースが700行超えていて、全体を把握できなくなっています。
このままでも無理やり進めば1000行はいけるでしょうけれど、2000行は難しそう。
オセロでこの状態です。将棋は1万行は行くでしょうから、
大きいプログラムの作り方を習得するいいチャンスだと感じています。
柿木将棋でLAN対RS232C通信を戦わせるこができますか?
>>345 なんつーか、プログラミングに微妙に慣れてないのかな。
・ソースのリビジョン管理はすること
・コールツリーを作るよりもクラスの設計をきちんと行なうこと
ちなみに私がこの前作ったプログラムは約60ファイルで10000行弱だ。
全体を把握するにはメインとなるソースを眺めるだけだし、
大きなクラスもすべて独立しているから何の問題もない。
ユニットテスト
>>345 オブジェクト指向じゃないなら。
名前空間を細かく分割して(ファイルを分割するかC++ならnamespace)
局所的な関数が必要な所以外にもれないようにすると、コールグラフは要らない。
コールグラフは・・・結局完成させました。視覚的に捉えることが出来ました。
関数のグループ分けが上手くいっていなかった部分を確認できて役にたちました。
>>347-348 ご意見ありがとうございます。
慣れてないです(^^;;
慣れるためのプログラミングをしているところです。
実力は
>>219 に書いたとおりです。
普段は100行以内、大きくてせいぜい200行以内のプログラムを作っていました。
ユニットテスト・・・作ったものが期待どおり動くか確認しています。
リビジョン管理・・・一段階達成したと感じたら、ソースのバックアップを取るようにしています。
クラスの設計をきちんと行うこと・・・これ、一番できてないです。
クラスの設計をきちんと行うことは、私が使う言語がCですので、
多分、変数やデータ構造、関数の分け方、名前の付け方をきちんとすること
にあたると思います。これ、なかなか出来ていません。
それぞれ言葉はわかるのですが、自己流で場数もなく、
具体的にどうしたらいいというノウハウは持っていません。
どうやったら、筋のよい方法が身につくのかなぁ。
オセロをプログラムしながら、身につくといいのですが・・・。
ツッコミどころ満載なオセロの人でした(^^;;
>>349 さん
コールグラフは要らない、といのは理解できます。
初めから、上手に分割できるできていれば・・・ですが。
私は出来てなかったので、コールグラフが必要でした(^^;;
>>347 さんにも指摘いただいてますけれど、
「設計をきちんと行うこと」が大事なんですね。
上手い設計ができるようになりたいです。
352 :
◆R/rLuLKeEI :04/02/11 15:32
>>346 >柿木将棋でLAN対RS232C通信を戦わせるこができますか?
開発終了してRS232C通信しか出来ない古い将棋ソフトとLAN通信しか出来ない将
棋ソフトを柿木将棋経由で対戦させたいのかな。
柿木将棋持ってないしPC1台しかないので誰か実験していただけませんか。
>>346 さんがやってレポートしていただけると一番嬉しいのですが。
出来ないから書きこんでいるのですよね。
失礼しました。
>>346 >>352 出来ると思って試したら、そもそもその条件では対局開始出来ませんでした。
「先手、後手共に通信にすることはできません」と言われます。
余談ですが、柿木を2つ起動してCOM vs LAN対戦をすると(PC一台でOK)、
定跡・思考時間等を違えて対局させられて面白い。
また、柿木とLAN対戦可能なソフトを作れば、柿木(LAN vs 人)を媒介にして
操作性最強のフリーソフトになりますね。
プロトコル決めて、盤と駒とルール提供して ソフトをそれぞれが作ってオンラインやオフラインで対戦できるようになるといいね
>>352 ,353
ありがとうございます。 8に期待しています。
>>354 「盤と駒とルール」は、
製作者のオリジナリティが関与する可能性がある部分のため、
供用は難しいかもしれませんね(フォーマットに従うための手間は極力省きたいでしょうし)。
UI提供はCSA将棋で実現してるので、あとはサーバーでしょうかね。
(思考部分とCSA将棋でどういうやりとりをしているかは理解してませんが...)
357 :
◆R/rLuLKeEI :04/02/12 01:46
>>350 >ユニットテスト・・・作ったものが期待どおり動くか確認しています。
『プログラムを調べるのに、それが意図されたように動くかどうかをみただけでは、なかば成功したにすぎない。
残りの半分は、意図されなかった動きをするかどうかを調べることである。』
誰の格言だったかなぁ?
>>354 >>356 CSA通信プロトコル
http://www.computer-shogi.org/protocol/ テスト用公開審判サーバは接続したこと無いけど生きてるのかな。
あと、上のURLにあるサンプルプログラムのCSA将棋はtest56.exeというローカルで動く擬似サーバーが入っている。
将棋ゲームの思考部分のテストって難しいような。 状況による、テスト結果は予め想定しなければならないから、膨大な棋譜と次の一手の集合か?w
思考の部分はテクニックがいるけど ゲームのルールの部分ならできるよね > テスト XP的には「期待どおり動くか」だけでよいと思う どうせ完璧なテストは難しいので 意図しない動きを見つけたらテストを追加する方針で気楽に始めましょう テストは自動化して手間を省くのがポイント
>>359 でもさ、思考ルーチンがゲームの売りじゃない。
それをどのように検証するんだろうね。市販のソフトって。
(ルール部分でミスは流石に今のソフトじゃ論外でしょ。w)
そもそも、企画・設計段階でどうやって思考ルーチンをきめるんだろう?
場面における評価式を仕様にしたり、定石DBのテーブルを決めたりするのかな。
想像だけどそんなにシステマティックにはやってないんじゃないの。 なんか将棋ソフト開発ってもろ零細って感じじゃない? DeepBlueはちゃんとやってそうな気がするのはただの偏見かw
>>361 まあ、そうだろうね。
多分、いろんなソフトを集めて、テスターの人が条件を変えて適当に打っていると。
で、とりあえず勝てるように微調整を繰り返していくのかな。
363 :
デフォルトの名無しさん :04/02/12 20:36
今は山下さんの作られた木偶の坊があってメジャー市販ソフトとの連続対戦が 自動的に出来ます。
おはようございます。変な時間に目が覚めました。 近況: 一休み中。
365 :
愚痴りたいが板違いなのでしない ◆R/rLuLKeEI :04/02/14 04:32
おはようございます。こんな時間に会社で徹夜です。
当然、最強(予定)の将棋プログラムは触れることは出来ません。
>>355 期待するだけじゃなくて要望を出しましょう。
366 :
デフォルトの名無しさん :04/02/14 20:49
368 :
◆R/rLuLKeEI :04/02/15 07:11
>>367 オセロの人さん
お大事に~。
cpu2の枠内がよくわからない。
minimaxみたいだけどminimaxは別のところにあるし、先手用、後手用に分けて考
えたminimaxアルゴリズムの検証用なんかな?
dynamic callになってんのは色々な思考アルゴリズムをとっかえひっかえ出来る
ようにするための細工?
実はdynamic callって良く知らないんだけど関数ポインタによる呼び出しという
ことでいいんかな?
金曜からのエンドレス残業で頭が回らない。
では、お休みなさい。
>368 R/rLuLKeEIさん おつかれさまです。しっかりやすまれてください。 図をみてくださってありがとうございます。 cpu2は、minimax法による指し手生成です。 それとは別にminimaxとalpha_betaがありますけれど、探索中の各局面での評価値を印字するものです。 このへんの統合が今後の課題だったりします。 dynamic callは正しい言葉か知らずに使ってます(ごめん) おっしゃるとおり、図での意味は関数ポインタによる関数呼び出しです。 思考ルーチン内の静的評価関数やゲーム内の思考ルーチン(プレイヤー)を入れ替えるために、 利用しています。 課題: ・関数名の付け方がちぐはぐ →対応する名前に変更 →コマンドインタプリタの再構築(へんな名前になるのはここのせいもある) →小さいプログラム/モジュールだと侮らず、接頭辞をつけて、モジュール分けしたほうがいいか?の検討 (設計をきちんとせよ・・・とのご意見くださった方、その通りです) ・評価用印字ルーチンと思考ルーチンの統合 →速度を気にせず、評価用印字ルーチンに印字フラグを持たせ、思考ルーチンに。 では、横になって風邪さん退治します。 しばらく、こちらの書き込みもお休みします、あしからず。
>>366 私はモグリなんで「プログラミング言語C ANSI規格準拠」しか持ってない。
うさぴょんの育ての親さんやデフォルトの名無しさん達は全て目を通しておられるんでしょうなぁ。
「思考ゲームプログラミング」ならあるんですが、古過ぎですね。
>>370 思考ゲームプログラミング持ってるんですか!うらやますぃ……
372 :
◆R/rLuLKeEI :04/02/16 08:48
森田オセロのソースが載ってるその本は私の所有物ではなくて会社の蔵書の一部になってる。 誰が持ち込んだのかは不明。 いつでも閲覧できるがあまり役に立ってない。
結論ではなく予測なのでは? まあ、先に盤を引っ繰り返したほうが勝ちともいうが。 あ、PCの場合はアプリ終了か。
木更津でのインターネット定額、常時接続事情はどうなんでしょうか。
>>374 ちゃぶ台返し?
引っ繰り返した方が負けという気もするが。
将棋プログラム少ししてみた。
・局面を表すクラスを分割した。
1.表示用のパネル
大盤解説の如きもの。
2から更新通知が来るのを待っている。
2.対局者が共有して見ている盤面
実際にはそのコピーが対局者に渡されるのでちゃぶ台返しは出来ない。
局面の読み込みや対局の進行はここに実装。
3.各対局者の頭の中にある盤面
2は3のサブクラス。
将棋のルールの内、盤面に関する部分はここに実装。
あと、盤面に紐付けた着手可能手の持ち方をベクタから赤黒木+リスト構造にした。
これは探索する節点の順序が探索効率に影響するような探索手法の為の準備。
とはいえ、手の評価は+∞のままなので赤黒木の一つのノードに全着手可能手のリストがあるだけ。
とりあえず、ここまで。
>>376 R/rLuLKeEIさん
おお。進んでますね。
OOPって、おもしろそうだなぁと思います。
近況:
風邪なおりました。普段より早めに治りました。うれしいので、飲酒中です。
作業予定:
入力部の再構築
1)同じ動作をするプログラムを汎用性のある関数に置き換える。(終わったら、動作確認)
2)関数名/入力コマンド名を分かりやすいものに変更。(終わったら、動作確認)
↑これをやっとかないと、あとで思考部の評価の度にコンパイルする必要が出てくるため
各ノードの評価値表示ルーチン/指し手生成ルーチンの統合
>>369 に書いた通り。
↑これをやっとかないと、思考ルーチンと思考ルーチンの評価が乖離してしまうため
実のところ、玉砕(
>>293 )あたりから、本編のプログラムがあまり進んでいないです(^^;;
今週末は、上に書いたことを終わらせたいです。
378 :
◆R/rLuLKeEI :04/02/21 04:04
>>377 元気になって何よりです。
>OOPって、おもしろそうだなぁと思います。
面白そうと思ってもC++がどうも好きになれなくて7~8年経ちました。
まだ分からない概念もあるけど今、JavaでOOPが面白いです。
不意に「メッセージパッシングはわかりやすい」というMINIX256倍本の一節を思い出した。
今日やったこと:
・局面の更新
1.着手可能手から最大の評価の手を抜き取って局面を更新。
2.成り、打ち、取る手は平手直後には無いので手抜き。
・局面表の実装。
ハッシュコードを算出する空の関数を作成。
昔、プログラミング言語習得で
C→挫折→Pascal→成功→C→成功
だった。今、
C++→挫折→Java→成功?
成功したらC++に再挑戦したい。
>>378 着々とすすんでらっしゃいますね。
なるほど、C++はいきなりは、難しそうですね。ふむ。
近況:
のんびりとプログラム再構築中。
出来たこと
・入力部の再構築:同じ動作をするプログラムを汎用性のある関数に置き換えた。
・各ノードの評価値表示ルーチン/指し手生成ルーチンを統合した(指し手生成が出来てるかは未確認)
途中なこと
・入力部の関数名/入力コマンド名を分かりやすいものに変更する
これからやること
・対局部に統合した指し手ルーチンを適用
・そろそろ将棋
380 :
◆R/rLuLKeEI :04/02/21 23:54
>>379 いよいよ将棋ですね。
今日は開発はお休み。
OOPの影響かコードを書く時間より考える時間(設計)の方が長くなった。
JavaにはHashtableクラスがあって局面表の実装にと昨日採用したが、都合が悪いのに気が付いた。
このクラスは第2hash関数が1で表が埋まると拡張、再hashするらしい。
記憶領域不足を回避したいのでこれはまずい。
と言うわけでHash値を同一性判定に使った~Setクラスを検討中。
局面表って探索空間の一部分が見えていてHIT率が重要なキャッシュのようだ。
上下or左右反転した局面⇒同じHash値にしたい。
>>380 うう。Hashは随分遠く感じます。
近況:
オセロを途中で放り出し(っていっても、思考ルーチン同士の対局はできてますけれど)
将棋へ。
日曜だけで、400行くらい書いてました。
将棋の局面の内部表現を考え、外部表現にKifu for Windowsの.bodを採用。
ここのところは局面の読み書きを書いているところです。
いろいろ書いて400行です。局面の入出力は200行ぐらい。
できたら、次は指し手の内部表現と外部表現を決めて、入出力部の予定。
#名前欄、次から変更します。
382 :
◆R/rLuLKeEI :04/02/25 07:14
結局、Hash値の衝突が起こったときに色々できそうなHarhMapクラスにした。 やっと一手読みで7六歩が最善手になった。 まだ次善手は9六歩。 評価関数自体一手読みしているくらいの評価をしているのでやや重い処理になった。 明日も仕事なのにこんな時間までやってもうた。
383 :
◆R/rLuLKeEI :04/02/25 22:12
私のプログラムは総行数少なくとも899行。 内、平手の.csaファイル入力部65行。 人による手の入力、局面のファイル出力部は全くない。 全ての部分が中途半端だからか意外と少ない。
384 :
◆R/rLuLKeEI :04/02/29 07:11
誰もいないのかな。 近況: 平手から深さ2までnegamax形式で書いたminimax探索ができるようになった。 しかし平手から深さ3になると駒を取る手と成る手がありえるので今の手抜き着手生成ルーチンでは無理。 また、展開する局面の数を外部で与えているのを止めて1手当たりの制約時間内で出来るだけ読むようにする予定。
385 :
◆R/rLuLKeEI :04/02/29 22:36
前向き枝刈りでコンピュータリバーシではカットオフペアというのがよく出るが将棋では全く聞かない。 分岐数が多過ぎだからですかね?
>>385 チェスとかは残りの深さと関係なく大体2手か3手減らすみたいだから
とくにペアというのはないのでは?
こんばんは。元オセロの人です。 #オセロの正しいつづりはOthelloらしいです(^^;; 近況: ドキュメントを書こう。 モジュール分けをしよう。 ツールを覚えよう。 エディタ操作を覚えよう。 ということを目標に勉強中。実際に触れてみましたから、今度は体験したことのまとめを書かないと、 このままずるずる、へたっぴなままになりそう。 今作っているプログラムは局面における全指し手生成/静的評価、minimax/alphabetaを実装して、止めるつもり。 というのは、いまやっているプログラムは将棋の基本データ構造と基本操作を見つけるのが目的だから。 ひょっとしたら、詰め将棋くらいまで持っていくかもしれませんが。 そうですね。詰め将棋までつくります。 その後、効率的なデータ構造を考えます。 まだ、頭が整理されていないので、コーディングは先延ばし(^^;;
あれから全然進んでいません。というか、一から作り直していたりします...
(いろんなソースを参考にしながら)
>>387 お互い、効率的なデータ構造を考えましょう(^^)
389 :
◆R/rLuLKeEI :04/03/01 02:11
>>386 リバーシだと4手読んで評価の低い手を刈り12手まで読む4-12というペアがあった。
チェスとかだと1-8とか0-8のような相当乱暴な前向き枝刈りをやっているように思う。
評価関数の精度が十分高いわけでもないのに…
最近シグモイド関数なるものを知った。
これを2倍して1引いた関数をfとすればf([-∞,+∞])=[-1,+1]になる。
つまり評価値を[-1,+1]に押し込めて∞より大きい値(?)の大小を扱えるようになる。
そこで非終端節点の静的評価値(-∞,+∞)をf((-∞,+∞))+2=(+1,+3)と変換する。
これでどの節点の静的評価値も真の値[-1,+1]よ 略
>>389 チェスの動的前向き枝刈りの null-move pruning は
2手浅くした探索の結果でβカットするらしいことを読んだけど
391 :
◆R/rLuLKeEI :04/03/01 02:56
>>388 どのくらい進みましたか。
近況:
C言語の人以外にとっては面白くなさそうなので手短に。
・平手から3手目に出てくる取る手を実装した。
・今週は成る手を実装する。
392 :
◆R/rLuLKeEI :04/03/01 03:16
>>388 あ、済みません。
進んでないんでしたね。
>>390 βカット自体はminimax探索と同じ結果を得る後向き枝刈りでしたよね?
ま、Null moveと動的前向き枝刈りを勉強しておきまっさ。
もっと分岐が多い将棋や囲碁ではどうなんでしょう?
393 :
◆R/rLuLKeEI :04/03/01 03:49
度々済みません。 2手浅い読みでダメだった手は次からは読まないという前向き枝刈りは既に森田将棋IIでやってました。 1-3-5-7-…とやるらしい。 昨日明け方まで将棋プログラムしてたせいで全然寝付けない。 頭痛がする。
おはよう。 どこにでもいるVBプログラマーです。 Cは昔に諦めたのですが、(理解できなかった) VBってほんとマイナーだなと感じました。 でも、プログラマーとして みなさん応援しています。
おはようございます。
さて、今週はルール上指せる手かを調べる部分を作ります。
3目並べやオセロは楽でしたけれど、
将棋の場合は煩雑になりそうです。
>>388 はい。頑張りましょう(^^)
>>393 私も睡眠の時間帯が変になると頭痛になります・・・。
>>394 応援ありがとうございます。
396 :
◆R/rLuLKeEI :04/03/01 08:35
>>395 煩雑になります。
てきとーに作った前のプログラムは巨大なswichi文による場合分けに手を焼きました。
よくよく考えて設計しないとすぐに見通しがとても悪くなります。
今回はcase~breakに散在していた共通部分を一つして異なる部分を共通部分から呼び出す形にした。
例えば金に対して成れるかという問い合わせ関数は常に偽を返すなど。
というのをtemplate methodパターンで。
397 :
◆R/rLuLKeEI :04/03/01 08:36
綴り間違えました
合法手の生成はswitch使わないでテーブル使えば短く済んでいいんじゃないの?
399 :
◆R/rLuLKeEI :04/03/01 12:49
>>398 その案頂きます。
とりあえず今回の方法がボトルネックになった時か6度目の作り直しの時に検討します。
多分、本質的に等価な表現へ機械的に変換出来そうです。
400 :
C言語の人 ◆OtHeRo2E6Y :04/03/02 00:14
近況: ぼちぼち。 課題: (やりやすいもの順) ・二歩チェック ・王手放置チェック ・打ち歩詰チェック ・千日手チェック ・千日手連続王手チェック 千日手関連は手をつけないかも・・・
401 :
◆R/rLuLKeEI :04/03/03 02:30
>>400 ううっ、まだどれも実装してないや。
前回の挑戦では打歩詰めは一度も出なかったので最後にしよう。
千日手は自己対戦させるとよく出くわすから最後から二番目。
他は五手目以降からありえるので早めに入れたい。
詰め将棋だと千日手はないからちょっと楽かな。
>>402 FM将棋にやってほしいんだが、でかすぎるか。
404 :
◆R/rLuLKeEI :04/03/06 03:00
>>403 比較的規則の少ない将棋だけで手いっぱい。
近況:
・1000msで読めるだけ読むようにした。
・表示している盤面を手によって更新、再描画出来るようになった。
・成り、打は依然未実装。
会社の深夜のリソースを使えれば捗るのだがなぁ。
405 :
デフォルトの名無しさん :04/03/06 08:24
動く大局将棋がみてみたい。 コンピュータが指さなくてもいいから。
406 :
◆R/rLuLKeEI :04/03/06 11:02
407 :
◆R/rLuLKeEI :04/03/06 12:18
408 :
デフォルトの名無しさん :04/03/06 16:14
409 :
デフォルトの名無しさん :04/03/06 16:16
最下段の出番はいつだ…
>>406 なんだか凄いというか、冗談としか思えない駒の数だな。
人間なんかよりCOM向けな気がするよ…。
近況: こんなことやろうとしてます。 ・静的評価関数作成 →今ある性的評価関数はダミーなので駒の損得くらいは入れる ・CSA将棋に組み込み →遊べるようになる ・指し手(合法手)リストアップの高速化 →今の方式は単純だが、無駄が多い。無駄を減らす案はある。 →検証のため既存のリストアップ部分は残しておく。 今からやろう! と思いましたが、今はNHK教育で米長解説を楽しみます。
412 :
◆R/rLuLKeEI :04/03/07 14:28
>>410 人がやるにもCOMがやるにも辛そう。
きっと分岐の数が尋常じゃない。
>>411 チューニングに入ってきましたね。
プロファイラを使って定量的な評価してますか?
近況:
・思考とは関係ない人の入力部分を書いている。
マウスで駒をグリグリ動かして放すところまで。
着手リストに問い合わせてfrom-toの組数が0⇒無効、1⇒有効、2⇒成り/不成りの選択にする。
・未だ成り、打は未実装。
・評価値はN人ゲームのようにpnとdfの二つ用意する。
何を企んでいるかはお察しの通り。
もちろん親局面への値の渡し方は最小と和 略
指し手生成についてだけど、 yssの解説にある各マスに利いている「駒番号のスタック」という考えは 一般的なのかな? 移動先を指定する手の生成は、 そのマスにスタックされている駒だけ調べればいいみたいだし。 近況: 座標の内部表現 : X軸とY軸をひっくり返した(式x*16+y → y*16+x)。 方向の内部表現 : 十字方向と斜め方向をそれぞれ一纏めになるように。 王手(指定マスに利きをつける)生成 大駒に関しては交点を見つけた後の処理をいろいろと模索中。
414 :
◆R/rLuLKeEI :04/03/08 02:35
>>413 スタックでなければならない理由かよく分からないのでまだその考えは入れていない。
しかし王手関係の手を分類するのに何らかの工夫をしないと手の生成がかなり遅くなるはず。
近況:
・2手目、人の入力部分が一段落した。
・3手目、COM側の探索で配列の範囲越えの例外でダウンする。
これが治ったら成り/打なしの限定ルールで対局が可能になる。
・証明数/反証数による詰め探索は後回し。
・プロファイル結果:評価関数が最も時間を食っている。 ・Java(のSwing)が遅い。
VBの人も気が向いたらどぞ。
近況:
対戦してみました。
'CSAファイルです。
'Kifu for Windows V513で棋譜を並べられると思います。
N+
>>263 (Computer)
N-OtHeRo2E6Y(Computer)
PI,+
+7776FU,-3334FU,+8822UM,-3122GI,+0015KA,-0024KA,+1524KA,-2324FU
+0046KA,-2133KE,+4624KA,-5152OU,+5756FU,-1314FU,+1716FU,-0013KA
+2413UM,-1113KY,+0046KA,-3435FU,+4635KA,-0044KA,+3544KA,-4344FU
+0034KA,-5251OU,+2858HI,-1415FU,+1615FU,-2211GI,+3423UM,-1122GI
+2334UM,-1315KY,+1915KY,-0014FU,+1514KY,-0084KA,+1412NY,-2231GI
+3433UM,-5162OU,+3344UM,-6272OU,+9796FU,-3142GI,+3928GI,-7374FU
+0014FU,-4131KI,+1413TO,-3141KI,+0043KY,-4243GI,+4443UM,-0057KY
+0064KE,-6364FU,+4353UM,-5758KY,+4958KI,-4152KI,+5364UM,-5263KI
+6482UM,-7182GI,+0065KY,-0032HI,+6563NY,-7263OU,+0085KI,-8462KA
+1222NY,-3235HI,+7675FU,-7475FU,+2221NY,-3515HI,+0033HI,-0043FU
+3343RY,-6364OU,+4334RY,-6453OU,+0054GI,-5352OU,+5443NG,-5251OU
%TORYO
投了したのは
>>263 さんのプログラムです。
>>263 さんのプログラムのほうが、思考時間が短いです。
こちらのアルゴリズムは静的評価に駒の得点、探索法にαβ法。4手読みです。
完敗です~。
10手目の▽3三桂にはたまげました。
駒の損得は教えてあるので、2四歩を守るかと思っていたのです。
が、よくよく調べてみると、
水平線効果で、必ず歩を取られるとコンピュータは思い込んでます。
>>412 プロファイラですか・・・勉強します(^^;;
ベースとなるプログラムのプロファイル
改定Aのプログラムのプロファイル
・・・プログラムのバージョンとプロファイルの結果をまとめて残しておかないと・・・
ごちゃごちゃになってしまいそうですね。
とりあえず、ごちゃごちゃになる前に、
1.現バージョンの保存。
2.プログラムの整理
3a.高速化(?)
3b.水平線対策(?)
ということで。続きは明日(^^)
>>416 cvsなどのリビジョン管理ツールを使うことを激しくお勧めしておく。
418 :
◆R/rLuLKeEI :04/03/09 02:46
気かつけば 私が一番 遅れてる
近況:
開発日記は余所でやったほうがいいですか?
・5手目:COM側の打つ手を実装中。
歩香桂の特殊処理は明日以降。
牛歩の如き歩みの遅さよ。
明後日は成る手か人側の打つ手に辿り着けるのだろうか。
>>416 VC++ならIDEからVSSが使えるはず。
WATCOMでもその手のツールが幾つか使える。
EclipseはCVSやVSSのプラグインがある。
他は…知らん。
まさかbccによるコマンドライン開発ですか?
リビジョン管理は、ファイル単位でRCSを使おうとしていますが、 なかなか徹底できてません。 VC++6.0でコマンドライン開発です。 統合環境は使っていません(^^;; 近況: プログラムの整理中です。 新しくいものは作っていないので、自分の作業が止まっているように感じます。
420 :
◆R/rLuLKeEI :04/03/14 13:14
近況: ・成り、打、王手関係の処理を実装した。 成りでたまにダウンする。 ・デーモン将棋と対戦 負けました。 ・探索はminimaxと評価関数は着手数の差。 ・詰み探索はなし。
421 :
◆R/rLuLKeEI :04/03/15 01:29
近況: ・成りでダウンすることはなくなった。 成らなければならない位置で成らないバグがある。 ・minimax手続きと評価値を証明数/反証数にしてみた。 序中盤では手が広くなるばかりであまり役に立たないようだ。 ・プロファイルの結果 自玉への王手の判定が遅い。 利きの表を作らなくては。 ・局面表が大きすぎるのか探索中にOutOfMemoryErrorがでる。 ハッシュ値は32bit、メモリ上限値の実行時オプションがないか調べてみる。 ・評価関数が局面クラス、指し手クラスに組み込みになっている。 探索クラスに移動させたい。 略
422 :
◆R/rLuLKeEI :04/03/15 03:21
考察: 各局面の証明/反証数を(証,反)などと書く。 先手番では子局面の証明/反証数に対して(最小,和)。 後手番では子局面の証明/反証数に対して(和,最小)。 未展開の局面の証明/反証数は(1,1)。 反復深さ:局面=(証,反) 0:平手=(1,1) 1:平手=(1,30),深さ1=(1,1) 2:平手=(30,30),深さ1=(30,1),深さ2=(1,1) ここまで未展開の900局面は全て対等。 3:平手=(30,9??),深さ1=(30,3?),深さ2=(1,3?),深さ3=(1,1) ここまで未展開局面27???局面。深さ1の30局面は全て対等。 証明/反証数の最良優先探索でも序盤では幅優先探索になってしまい、非効率
>成らなければならない位置で成らないバグがある。 将棋製作は大体の人は始めに人が指せるようにする所から作ると思うから、 その段階でチェックしてしまう所だと思うけど。 ただ、再起的な処理は、データの位置が違っていたり、書き換えてしまって いたり思わぬ所で間違えていたりしますからね。 >成りでたまにダウンする。 そういえば成りでバグといったら、名前は忘れたけどPSの将棋ソフトで 成り不成りを選ぶ所で止まるのがあった。苦情の電話をして聞いてみると 初期生産のPSだと止まってしまうとかなんとか言われてごまかされた。
424 :
◆R/rLuLKeEI :04/03/15 08:08
成らなければならない位置で成らないバグは人が指せるようにする段階でかなり前から分かっていた。 しかし、そこで成りを選択してしまえば人の手間がちょっと増えるだけだからと先のばしにしていた。 問題は先生役のCOMとの対戦で局面に食い違いが起こるだろうからその時にやろうと思っていた。 ところがこっち側のCOMが弱くて歩桂香が敵陣まで行けない。 とりあえず駒の損得を入れてみようと思う。
どうですね、将棋ソフトはルールの実装 を がもっとも面倒れですね
426 :
デフォルトの名無しさん :04/03/15 12:41
なんでそういう面倒なところを共有しないの?マゾ?
427 :
◆R/rLuLKeEI :04/03/15 13:02
>マゾ? 多分そう。 Linux版CSA将棋がどっかに転がっていればそれを使いたい。 エミュレータ上で動かすのはなんだかなあと思っている。
428 :
デフォルトの名無しさん :04/03/15 13:09
そういう面倒なところの実装で速度の差が付いて、強さの差になって現れるから。
ルール逸脱してないかのチェックは棋譜を別のソフトに食わせてみりゃいいだけ。
430 :
デフォルトの名無しさん :04/03/15 14:05
きたねー勝負だな。 そういう閉鎖性は進展を阻害する悪因。
評価関数だの探索手法だのが必要とする事項によって そういう面倒なことをどのように実装したらよいかが決まってくるから。 誰もが使える実装ってのはもちろん考えられるけど、 今のところまだそういう富豪的な手法が使えるほどにはコンピュータが早くない。
432 :
デフォルトの名無しさん :04/03/15 16:33
アイデアより蓄積勝負で新規参入を阻害ですか? 全体の進展は遅滞しますぞ。
433 :
◆R/rLuLKeEI :04/03/15 18:51
>>429 私のプログラムは棋譜出力部をまだ書いてないので別ソフトに食わすことすら出来ない。
状況はコンピュータ囲碁の方がよっぽどひどいと思うが。 未だに勝ち負けの判定を正しく出来る=生死の判定を正しく出来る=ルールを正しく実装している プログラムすらないし。 誰か作ってオープンソースにでもしてみれ。 チェスだってルールの実装はビットボードとか色々論議されていて、 みんなばらばらに実装していたりするわけだし。 蓄積勝負で新規参入を阻害っていったいなんですか? 蓄積しちゃいけないわけ?
>>432 そうじゃなくて、「評価関数だの探索手法だの」のアイデアを生かすためには
面倒なことを避けては通れない、ってことだよ。
しかし、面倒とは言ってもそれをやってる新規参入者はぼこぼこ現れてるわけだが。
どうしても面倒ならOpenShogiLibとかどうよ。
もっとも、あれの中身をすらすら読みこなして使いこなせるなら、
自分で作っても大して面倒じゃないと思うけどな。
436 :
デフォルトの名無しさん :04/03/15 19:07
ルールの記述くらい大して面倒ではないと思う。 ルール通り指すだけなら必要ない利きだとかいった情報を持ち出すと 複雑になるが、そのあたりはデータ構造の設計力の範囲になってきて スピードだけではなく色々と実力差が出てくる。
437 :
デフォルトの名無しさん :04/03/15 21:15
実力差ねえ。 はかる場所を間違えてない? 競争は的確な土台で行われない限りオナニーに過ぎないよ。 競争は誰かが勝つことではなく全体として成果を得ることに存在意義があるんだから。
グダグダ言ってないで書いてみりゃいいじゃん。
439 :
デフォルトの名無しさん :04/03/15 21:46
>>438 考えてから組めよ。
だから日本のプログラマは馬鹿にされるんだって。
>>439 俺はまだ書いてないけどプログラム書けない人が負け惜しみ言ってるみたいだったから。
442 :
デフォルトの名無しさん :04/03/15 23:16
>>437 あんた前にもどっかで同じこと書いてたんじゃない?
よっぽど外国人にコンプレックス持ってるみたいだけどw
将棋のルールは一つしかないが、
データ構造に何を持つか?ということに絶対的な解はない。
その設計は評価関数で何を評価するかとか、どういう探索をするかとか、
全体の哲学に大きく関わっていて、なんでもかんでも誰かに提供しろと
言ってるのは考えることを拒否してるだけなんだよ。
それに、うさぴょんとかOpenShogiLibとかもあるんだし、それを使う手も
あるんだし、何が文句あるんだか。
自分がプログラム組めないからって負け惜しみはうっとうしいよ。
近況: プログラムの整理→終了 ドキュメント書き→あるていど出来た。これ以上今のプログラムへドキュメントは書かない。 合法な手の生成を高速化→手付かず 詰め将棋→凍結 静的評価関数→構想中 ほぼ、止まってます。 アイディアを書き出して、 ・すぐとりかかれる ・もう少し整理すればとりかかれる ・漠然としていて、どうにもとりかかりようがない という分類をして、できることからやらなければ・・・ですね。 少し大きめのポストイットを買って来ます。
【警告】将棋のプログラミングにまったく興味のない釣り師が常駐しています。
445 :
デフォルトの名無しさん :04/03/16 07:57
釣りじゃねーよ。 日本のプログラマに戦略と思想がないのは明らかだろうが。
446 :
◆R/rLuLKeEI :04/03/16 08:07
将棋のルールの実装は面倒などではなく逆に楽しい。 それこそ寝食を忘れて熱中し気が付けばもう朝かと言うのがよくある。 ルールごときに何か楽しいかというとよりよいデータ構造、よりよいアルゴリズム、よりよいクラ ス、これらを選定する作業がとても楽しい。 出来上がったプログラムよりそこへ至る過程に興味があるので静的なドキュメントより動的な開発 日誌や他人の研究結果、特にやってみたけど有意な結果は出なかった方が役に立ちそう。 成り駒は継承を使うととても簡単になりますね。 例えばと金は金のサブクラスにすると簡潔 略
>>445 ちゃんちゃらおかしいけど、今度からは
「『俺の知る限り』日本のプログラマに~」
という文章にして欲しいな。
448 :
◆R/rLuLKeEI :04/03/16 12:20
日本のプログラマの行く末を案じまたこれを憂いては警鐘を発すは有り難きことなり。 杞憂なればよし。
次はニューラルネットが来ます
450 :
デフォルトの名無しさん :04/03/16 13:05
>>447 『おまえらを見る限り』日本のプログラマに~
451 :
デフォルトの名無しさん :04/03/16 13:20
まあ一人あわれな外国人コンプレックスのお馬鹿さんがいるようですけど、 話にならないので無視した方がいいでしょう。 理を説いても口汚くわめきちらしてくるだけのようですから。
452 :
デフォルトの名無しさん :04/03/16 14:20
この程度で口汚いねえ。 おまえらには協力体制とかないのか? 競争と時間がすべてを解決するとかいう 漠然とした思想でやってんのか? しかも自分はそういう思想に基づいた 行動をとってるという自覚もないなあ。 自覚して思想を持て。
454 :
白砂青松 ◆HakusaRWQc :04/03/16 18:29
真面目な話、考え方として、CSA将棋みたいな「通信とUIだけ」じゃなくて、
「通信とUIと(ちゃんと動く)盤駒」の元ファイルみたいなのがあって、思考部分を
DLLかなんかでやってくれりゃいろいろ楽なのになぁ……と思うことはある。
特に怒涛のように商品化される東大将棋シリーズを見てるとね(笑)。
ただ、
>>442 にもある通り、パクろうと思えば元となるソースもあるし、まず第一に、
「それぞれが自分の考えたデータ形式が最善(とまで言うと言いすぎだけど)だと思っている」
からこそ、それぞれがデータ形式を含めて自分で書いているんだと思う。それを、
自覚だの思想だのという言葉で押し込めてしまうのはどうかと思うが。
繰り返すけど。
なんか1個、共通のフォーマットみたいなものができたら嬉しいよね。
思考部だけでもちょっと考えてることあんのよ、みたいな人が参入できるかもしれないし、
できればUIその他の部分は柿木将棋をそのまま提出してくれるともの凄く嬉しいんだけど(笑)。
ただ、それをしない人を責めるのは間違い。ボランティアを強制するのはそれこそ間違ってる。
455 :
デフォルトの名無しさん :04/03/16 21:57
>>452 例えばチェスや囲碁は外人が多いが将棋よりもはるかに秘密主義。
そういうことも知らんで適当なことを言うな、馬鹿が。
456 :
デフォルトの名無しさん :04/03/16 22:25
>>455 秘密主義を真似ちてるんでちゅかぁ。
だから思想がないって馬鹿にされるんだよ。
あほが。死ねや。
>>456 誰も真似してないです。
将棋のアルゴリズムってオープンに語られてますが。
誰が何を勘違いしているのか。
おまいら喧嘩はやめろ。 そんなことより、ややスレ違いだと思うが質問させろ。 マウスのポインタの上をエンターキー(左クリックでも可)を連打するプログラムって簡単に 作れますかね? 最近24にログインするのがつらいのでw まぁ他にいろいろ方法はあるんだろうけど、こういうプログラム作っておけば以外に役立ちそうな気がしたので。
えーと、左クリック連打プログラムは作れそうかな? …でもどうやって起動してどうやって止めるんだろう(笑) 起動後、カーソル移動中に大変なことが起きそうな予感。 エンターキーの連打ってエンターキー押しっぱなしじゃ24のログインはダメだったっけ?
460 :
デフォルトの名無しさん :04/03/16 23:18
>>456 もういい加減あきらめろよ。見苦しいよ。
>>454 >>462 C++分かる人には、CSA将棋+うさぴょんのソースで十分だと思うんだけど。
うさぴょんのソースの局面の基底クラスは特に癖のない実装だし。
詰め将棋は最新のアルゴリズムと比べてちょっと効率悪そう。
一応証明数使っているけど、脊尾詰を退化させた感じか(笑)?
読みの末端の処理の部分とかαβのところとかは癖が強いね。
しかし、この辺は最も自分で書いてみたいところのはずだから、いいでしょう。
>>460 共有を進めるための詳細な内容を公表してくださいな。
その内容に賛同できるかどうかが基準になってくるんだから...
人に言う前に自分がやってくださいな。
465 :
◆R/rLuLKeEI :04/03/17 00:57
将棋プログラムを三層に分けられたらいいな。 1.UI・通信部 2.UIを含まない思考の共通部分 3.思考の核心部 で2の中間層をしっかり定義する。 今のCSA将棋のsikou.dllが二つのDLLに分かれるイメージ。 あるいはCSA将棋用sikou.dllの生のハンドラを覆い隠すクラス群とか。 DLLとかクラスとかよく分かってないのでとんでもない嘘を書いてるかも。
具体的に何がどの程度共有されることを望んでるのか示してから それは本当に存在しないのか調べたり他の人の情報提供を待つのが 早道ではないでしょうか。 共有を望むならまず自分から発信するのが一番。 別にアルゴリズムやソースコードに限らず。 それでは奪われる一方になるリスクを背負うと思うなら、 他の人もそう思ってるから共有が実現されないんでしょう。
468 :
◆R/rLuLKeEI :04/03/17 01:16
>>463 それもそうですね。
基底クラスを流用しても大会規定に抵触しないんかな。
CSA将棋に今のままの好きなように実装できるDLLと効率は落ちるかもしれないが比較的簡単に
思考部を作れるDLLを選択できるようになっていれば取り掛かりやすいのにな。
後者は教育用にわざとシンプルに理解しやすいようにするとか。
>>468 大会の規定には抵触するかもしれないですね。
しかし、どこかでうさぴょんの育ての親さんが基底クラスくらいなら勝手に
使ってもらって構わないけど、この辺のクラスから先はダメだろうとかって
発言されてたという記憶があるんですが…
どこだったかなぁ。
結局、465の分類の1以外は難しいでしょうね。 自分としては自分で色々と工夫してやりたいので、全部公開されて標準化されると かえってやる気なくなりますね。
471 :
◆R/rLuLKeEI :04/03/17 02:39
>>470 私が思ってるのは標準化というより叩き台(考えが揺れているのはご勘弁)。
今のルールでもCSA将棋の使用は必須ではないように、規定に反しない範囲で新規参入者の敷居を
低くするのが狙い。
標準化とは逆の多様化への足掛かりなればいいなと。
それはすぐに手を入れて大改造したくなるものでなければならない。
明日普通に出勤なのに何やってんだか…
>>454 >>471 浮かんだ言葉:
コンピュータ将棋エントリーキット。
時間が時間なんで寝ます。
473 :
◆R/rLuLKeEI :04/03/17 08:39
>>472 C言語の人さん
おはようございます。
そうそうそんな感じ。
知識の共有化は『コンピュータ将棋の進歩~4』やここも含む各種掲示板や開発日誌で色んなアイ
デアを惜し気もなく公開してしているようだしね。
後は本人のやる気と根気だけだと思う。
474 :
白砂青松 ◆HakusaRWQc :04/03/17 08:44
>>469 ここですね
ttp://homepage1.nifty.com/Ike/usapyon/faq.html ユーザーの立場としては、
1.UI・通信部 …… 完全標準化
2.UIを含まない思考の共通部分 …… 叩き台の提供
3.思考の核心部 …… DLLによる配布
として欲しいな。
そうすれば、東大将棋は1ソフト1000円で買えそう(笑)
もひとつユーザーの立場からの意見を言うなら、UI以前に定跡を標準化しろよゴルァ、
ってことかな。
でも、これは2がしっかり固定していないと難しいそう(コンバータなどの回避策はあるけど)
なので、そういう点から2の部分を統一して欲しい、という思いはあります。
もちろん、敷居は低くなるし、どんなフリーソフトでも見栄えはよくなるので、12両方とも
「叩き台プログラム」が出るのは賛成。
最初は470さんの言うように、自分でも作りたい部分だからということでバラバラになるかも
しれないけど、柿木将棋タイプが標準になったとしたら、棋譜読み込みの凄さとか定跡が全部使えます、
ってことになるので、それはかなりの恩恵だと思う。なんで、いいものができれば、段々と
標準化されていくことになるのかな……って気がします。
まぁ、ここで吠えてる人は、なにがどう欲しいのか、それを自分で作ってみて、
実はその部分は将棋プログラムの根幹なんで、それぞれオリジナリティを出したいところだから、
だからこそ標準化ソフトは出にくいんだということにまず気づこう。
>>474 > まぁ、ここで吠えてる人は、なにがどう欲しいのか、それを自分で作ってみて、
実はその部分は将棋プログラムの根幹なんで、それぞれオリジナリティを出したいところだから、
だからこそ標準化ソフトは出にくいんだということにまず気づこう。
そういう時期は過ぎつつあると思う。
476 :
◆R/rLuLKeEI :04/03/17 10:18
ゲームとしての終焉を迎えつつあるリバーシは標準化されているかというと…? 全てのプログラム言語と全ての機械語のための唯一つの中間言語がないように無茶なんだろうな。
>>476 そこまで大仰な話ではないような
よってたかってちょこっと整理するだけだし
定跡データベースに関しては標準化は簡単でしょう。 棋譜が標準化されてるように。 しかし教育用に「コンピュータ将棋エントリーキット」というのはいいアイディアかも しれないですね。 単純な全幅探索と駒得だけの単純な評価関数くらいまで最初から実装されていて。 OpenShogiLibとかうさぴょんとかは既に大きなプログラムなので読む気もいじる気も 起きない人が多いかもしれないし。
俺二人ゼロ和有限確定完全情報ゲーム用アプリケーションフレームワーク持ってるよ。 思考ルーチン付で。 tic-tac-toeとか小物ゲームのルール発見してちょっと遊んでみたいとき便利だったり。
>>478 しかし、あの大きさでも、うさぴょんは二次予選シード中の最小プログラムだった
と聞いたことがあるんですが。
それはとにかく、エントリーキットならうさぴょんのソースを削ればすぐ作れそう。
うさぴょんの育ての親さん、「コンピュータ将棋の作り方」のページの続きとして
展開してくれないかなぁ。
あのページ自体、入り口に『まだまだ製作中』とか書いてあった気がするし。
481 :
◆R/rLuLKeEI :04/03/17 16:33
定跡データベースはプラグイン化出来ないかな。 プラグインには最大公約数的なインターフェスだけしかなくて、プラグインのプラグインとして柿 木将棋定跡データベースプラグインを繋げる。 2の部分からは初期化の時だけ、どのデータベースを選択するか決めるだけであとは全くおなじ操 作になる…なったらいいな。
共有したい部分に「何を求めるのか」、
共有された部分で「何をしたいのか」が、
全然見えてこないんだけど...
ほんとの意味の叩き台(^^;とかだったら、
勉強も兼ねて作って(参加して)みたいし、
要望とか出してくれないかな?
(プログラミングのレベルは、極低ですんでその点はご了承くださいな
>>263 参照)
483 :
◆R/rLuLKeEI :04/03/18 19:25
>>479 それってどこで手に入るのですか?
自作ですか?
CodeDOM使ったらできないかな
485 :
デフォルトの名無しさん :04/03/18 20:55
棋譜情報はxmlにしてWeb上のDBから持って来れるとかいいなぁ。 当然DLして組み込むことも可能だが、最新の棋譜を読み込んだ方が より強い思考ルーチンができる・・・みたいな
>>483 自作のクラスライブラリ。
いくつかクラスを継承してゲーム固有の
タイトル、画面表示・入力、ある局面の合法な差し手の列挙、静的局面評価
を記述するだけで対戦可能なゲームアプリが出来る。
と言ってもこれだけじゃ激弱なんでもっとカスタマイズしないといけないどね。
ところでマルチスレッドな探索ルーチン書いてる人いる?
なんか単一CPUのパフォーマンスはもうすぐ(と言うかPen4は既に)頭打ちになるから
CPUメーカーはHT、マルチコアに逃げるっぽいね。
487 :
白砂青松 ◆HakusaRWQc :04/03/18 23:23
>>482 これは白砂の考えですんで、他の人がどう考えてるかは判りません。
あくまでも、1ユーザーであり1ソフト開発を挫折したヘタレ(泣)の考えと思ってください。
ユーザー側として考える、「洗練された共通システムを導入するメリット」は、ひとえに、
そ の ソ フ ト が 使 い や す く な る
ってことですかね。
棋譜のペーストであるとか、そのソフトに独自の定跡を載せるだとか、そういう機能って、
ほとんどのソフトは貧弱ですよね。柿木将棋以外は正直使い物になりません。もちろん、
フリーソフトは言うに及ばず。
でも、気持ちは判るんですよ。
「ソフトを強くすること」とは、ほとんど関係ない部分ですからそれって。
なんで、ソフトを使う側は、
「もうUIは全部柿木に統一してさ、DLL配れよ。その方がこっちは嬉しいよ」
って考えちゃうんです。
488 :
白砂青松 ◆HakusaRWQc :04/03/18 23:24
で、これを一歩進めると、その方が作者さんもラクなんだろうなぁ……と思うわけですよ。 例えば、フリーソフト御三家の一つ「うさぴょん」には、途中の局面を読む機能がありません。 まぁうさ親さんはきちんとそういうツールを持っていてうまいことやったり、メニューに「盤面」 みたいなものもあるので(選択できない)iniをいじるとできるようになるのかもしれませんが、 見る限りないです。 共通のシステムを導入することによって、これに対応できます。 とすると、洗練された共通システムを導入するメリットは、作者の側にもあるのかな……と。
489 :
白砂青松 ◆HakusaRWQc :04/03/18 23:25
上記の話とは 別 に 、ソフトを作りたいけど、まず駒をちゃんと動かせるところで挫折した 人って、白砂以外にも(泣)いると思うんですよ。 そういう人向けに、「将棋を強くすることだけを考える環境」を提供して欲しい、というのが、 「共通システム+ちゃんと動く盤駒が欲しい」理由です。 またまた引き合いに出しちゃいますが、うさぴょんの親さんはHPで、 >最初は、ルール通りにきちんと指させることが一番苦労しました(--; そこまで出来てしまえば、 >後は苦労というよりも楽しみではないかと思います。 と述べています。 「共通システム+ちゃんと動く盤駒」は、この「一番苦労する部分」を省いて、楽しみを与えてくれる というものです。 盤駒も作れないようじゃいずれ挫折するよ、とか、そういう部分が楽しみなんじゃん、という 考えがあることは判りますし、別にそれを否定しません。 でも、あってもいいじゃないですか。 そういう「基礎の部分」があれば、「俺にもできるかな?」って参入してくる人も増えるだろうし、 そうすればいろんなアイディアだって出る可能性は上がるし、ひいてはコンピュータ将棋全体の 利益にもなるわけですよ。大袈裟に言うと(笑)。
490 :
白砂青松 ◆HakusaRWQc :04/03/18 23:28
>>482 で263さんが「話が見えなくなった」のは、私が上の全く違うレベルの話をごっちゃにしちゃった
からですね。混乱させてしまったら申し訳ありません。
まとめますと、
>>487 の立場からは、柿木レベルの洗練されたUI(通信等を含む)を共有。シェア・フリー問わず、いずれは
全てのソフトがそのシステムに乗っかって欲しい。そうすれば、東大やら激指に独自の定跡も簡単に
載せられるし、フリーソフトの見栄えもよくなる。作者も、その方がラクなんじゃないのかなぁ(という想像)。
>>489 の立場からは、UI(動けばいい)と、ちゃんと動く盤駒を、自分にだけくれ(笑)。自分がプログラムを
組む時の叩き台として使えればいい。ただ、あとあとのことを考えると、↑のようなかっこいいシステムの
方がいいだろうから、できればそっちがほしいなぁ。
ということです。
まぁ、ユーザーのないものねだりと、プログラムもまともに組めないヘタレの
戯言レベルですね。改めて書き出すと(笑)
>>487-490 すごく面白いRPGより、使いやすいRPGツクールが欲しいてな感じですかね。
すごく強い将棋ソフトより、将棋思考ルーチンツクールみたいな。
定跡入れ、評価関数の編集、手筋、等を簡単な入力で行える。
そういうような意味かな?
この部分を見やすいインターフェイスで作り上げるのはけっこう難しいと思う。
RPGと同じLVぐらいのRPGが作れるRPGツクールを比べると、
RPGツクールを作る方が断然難しいように。
将棋ソフト作者は、それぞれやりやすいやり方で編集を行っていると思う。
でも、もしかしたら、そういうものができているのに、それをうpしてしまうと、
将棋が強い人がポンポン強い思考ルーチンを作ってしまい、
ソフトが売れなくなると考え、隠している製作者もいるかも。
492 :
◆R/rLuLKeEI :04/03/19 01:00
二兎を追うものはなんとやら。 でも追いたい。 色々なUIとちゃんと動く盤駒と思考や定跡や色々な付加機能をもったコンポーネントを自由自在に組み合わすことが出来て、シェア/フリーによる一部分の開発でもそれを取り込んだり置き換えたりできるようなシステムがいい。 共有すべきは、誰もがどの部分でも開発したり、使ったりできる将棋用プラットフォームだと思う。 近況: ・JVMのヒープメモリの上限を1GBにしたらデーモン将棋相手に投了まで行けた(5?手目で負けた。棋譜無し)。 現実を見ると、遅々としてすすまんなぁ(笑)。 理想にはほど遠いや。
ここに書くのはずいぶん久しぶり。
>>480 >>489 今年の選手権が終わったら考えます。
うさぴょんの骨組みをきれいにまとめて抜き出せばいいはず。
うさぴょんのUIのソースもおまけに付けましょう(w
494 :
◆R/rLuLKeEI :04/03/19 01:53
>>485 実際にはウイルスパターンの更新のように定期的な最新定跡のDLになりそう。
実績もあるうさぴょんの骨組みが提供されるようであれば 私の出番は無さそうですね(^^; 林森林 λ... 山篭りしてきます。
496 :
◆R/rLuLKeEI :04/03/19 08:23
420台から始まった共有化の話も問題提起した方達の想いとは少し違う形に収束するようですね。 大会後となるとGW後、うさぴょん2の開発や大会バージョンの整理、公開とか考えると叩き台バージョンの公開は9月頃かな。 ボランティアの方にはあまり無理はいえんしね。
>>496 いつ出来上がるかは、いつまで会社休んでるか次第ですかねぇ。
日記の方には書いているけど、昨年の8月終わり頃から病気で
ずーっと会社休んでます。もう半年以上になるんですね…。
まぁ病気なので思うように進められないけど、会社に行っているよりは自由になる
時間がいっぱいあるので、病気が治らなければ(笑)もっと早くリリースできそうです(笑)。
>>497 密かに静かに期待してますので、静養第一に。
>>463 どこのどなたか存じませんが、改めて読むと、うさぴょんのソース、
よく読まれてますね。批評も的確だと思います。
ただ、末端の処理については、実はKFEndの方法を参考にしているので、
変わった方法かも知れませんがオリジナリティーはあんまりありません(--;
さて、本題。
>>463 さん、うさぴょんの育ての親に加わって貰えませんか?
でも、オリジナルの将棋プログラム書いている方なのかな?
>>498 なかなか静養第一ってわけにも行かなかったり…(泣)。
>>500 体が資本ですから、くれぐれもご無理なさらないように。
なかなかそうはいかないんでしょうけど(泣同意
七行プログラミングか…
思考するの?
>>499 お察しの通り、自分で作っているものがあるので…。
ソース、ところどころ参考にしてます。お世話になってます。感謝。
>>505 そうでしたか。開発、頑張ってください。
2Chでプログラム名をさらすのがあれでしたら、
選手権で会った折にでもこっそり「あれは私です」って教えてくださいね(^^)
ここ見てて作りたくなって作ってます。 いまんとこ合法手の判定まで完成。 合法手といっても王手放置・打歩詰・千日手は考慮しておらず。 マターリ進めたいと思っとります。
508 :
◆R/rLuLKeEI :04/03/20 15:02
作っていることを表明していただくと何だか嬉しいねぇ。 近況: 前日からの徹夜&休日出勤で開発続行できず。 シャクなので息抜きに ・CSAサーバープロトコルの実装実験 2度目の挑戦 Java版サンプルCsaCommunicationを使用。 疑似サーバーTest56.exeとのコードレベルの通信方法は大体分かった。 やみくもに書き始めたのでこれで終了。 次回3度目の挑戦ではちゃんと状態遷移図書いてStateパターンの適用実験を予定。 仕事に戻りまっさ。
~状況っぽいもの~ ためしに簡単なルーチンを組んでみる。 合法手の生成がまったく出来ていないことがここにきてようやく分かる。 ▽8八・などというネ申の一手を指しだしてどうしょうもならん。 うあー
正しく動く盤駒が欲しい人への問い: プログラミング言語は何で作ってあるといいですか? 近況: 完全に煮詰まってしまったので、 書籍を購入。今までは『コンピュータ将棋』『将棋とコンピュータ』の2冊しか資料がなかったのです(^^;; 往復13時間ほどかけ書店に行ってきまして新たな本を購入。 『コンピュータ将棋の進歩3』『同4』『人月の神話』『コンピュータの名著・古典100冊』 しばらくは春の夜長の読書になりそうです。 注:私は職業プログラマではありません(^^)趣味でプログラム書いてる人です。
なるほど。資料ありがとうございます
>>511 13回大会の使用言語の集計は以下
27 C++
17 C
1 Ruby
1 Pascal
1 Python
1 Visual Basic
1 Delphi
1 ?
(手作業の集計なので誤りがあるかも・・・)
C++覚えないとダメですかねぇ・・・(遠い目)
Pascalで組むってのもすごいな
DelphiじゃないPascalってなんだろう?GNUかFree-しか思いつかん。 最初は使い慣れた言語で始めて効率を求めてC++に移植がよさげやね。
515 :
◆R/rLuLKeEI :04/03/25 02:14
8八・などという神の一手を指した方はその後如何? 近況: ・相変わらず成らなければならない位置で成らないバグはほったらかし。 そのうちやる。 ・序盤から証明数/反証数を使うのは無駄なので普通の評価関数とminimax手続きに戻した。 もう少しminimaxで遊んでバグ出しをする。 おやすみなさい。
とりあえず打ち歩詰除いて合法手の生成は実装。 思考のほうも組んでみたのでつが、minimaxからαβにしようとしたらおもいきりバグタ。 とりあえずminimaxにしといて打ち歩詰が先かな・・
幻のレスを補完、と 517 名前:デフォルトの名無しさん 投稿日:2004/03/25(木) 16:22 自信ないですが、アップしてみました 518 名前:デフォルトの名無しさん 投稿日:2004/03/25(木) 16:33 (゚Д゚≡゚Д゚)エッドコドコ?
518 :
◆R/rLuLKeEI :04/03/30 08:16
で、どこ? 近況: ・王手の判定を高速化 王手を回避しないバグを入れてしまったのでボツ。 ・駒の損得を入れてみた。 やはり負け。 価値の表を外部ファイルにして実験中
519 :
◆R/rLuLKeEI :04/03/31 01:49
年度末でバタバタしてコーディングに時間がとれない 近況: ・駒の価値のファイルをちまちまエディタで変更するのが面倒なねで将棋プログラム上のダイアログで扱えるように改造中。 年度始めもバタバタして進みそうにない。
520 :
デフォルトの名無しさん :04/03/31 01:52
この手のプログラムは やっぱりC++が一番楽だな オセロの時もお世話になった C++の作者に感謝
>>512 Cでもいいんじゃない?
最終的にGUI環境を含めた実現を目指すのであれば、
(Cで製作している人は)C++の選択がベターかと思うけど...
中には思考部分はC、GUI部分はC++と言う人も居るんじゃないかな?
どっちかと言えば思考部分こそC++だと思うが。
局面から指せる手をリストアップする・・ Cなら typedef sturct { /* ... */ } Te; int listup_te(Te te[]); /* 局面はグローバルで持つ、配列teは十分な大きさを持つ、戻り値は手の数 */ C++なら... class Te; class Kyokumen { public: std::vector<Te> listupTe() const; //... }; うーむ・・・正しくなさそう・・・ C++はわからんです。
無理にC++にしなくても(^^; とにかくC++のソースを山ほど読んで、 どういうところでC++の機能(クラス、テンプレートなど)を用いるかを 理解しないと、Cよりたちが悪いよ。
class Piece { // 通常の駒クラス protected: Board* m_pBoard; // 盤面へのポインタ std::vector<Move> m_MoveListNode; // 合法手を格納 public: virtual void generateMoves(); // この駒の合法手を生成 Move getNextMove(); // 格納した手を返す(次がなければEND_OF_LISTを返す) }; class SlidingPiece : public Piece { // 飛び駒クラス public: void generateMoves(); // 飛び駒用に、駒に当たるまでループして生成 }; こんな風にして、駒の中に合法手を生成する関数をいれる方法もある とか中途半端なアドバイスをすると余計分からなくなるかもしれない・・・
むしろrobocodeみたいのきぼ 親クラスから合法手を取得して思考部分のみのプログラミングで済むよーな 誰か一人が作れば(ry
>>528 だからそれが難しいんだって、何度言えば(ry
というのは、おいといて(^^;
問題点を挙げるとすれば、
製作者に「自分が理解できる構造・仕組みであればいい」というのが前提にあるからだと思う。
誰かに利用されることを前提とすると根本から考え直さないといけなくなったりする。
提供される側が、提供する側の「仕様が全て」と割り切るか、
提供される側が、提供する側に「要求」を出すか。
駒や座標の扱いなんか、いい例だと思うが、
提供される側として意味不明の数値よりは、意味が汲み取れる数値のほうがいいに決まっているが、
そうなるとどうしても、製作者側からみれば「無駄な」変換作業が必要とされる。
いざ提供されたとしても、思っていたものと違うといって使われないようであれば意味がなくなるし。
どういうフォーマットで受け渡しするのかが、必要じゃないかな?
あと、合法手を生成するレベルだと、
それなりの基本情報(例えば利き)を副産物?として得ることが出来ると思うけど、
そういう類の情報の扱いも、思考部分で独自にルーチンを組んで取得するのか
それともメソッド等で取得するのか...
528 :
◆R/rLuLKeEI :04/04/04 19:52
Javaなら局面クラスPositionから抽象クラスPlayerのsearchの中で サブクラスにある下のメソッドを呼ぶ。 class AfoPlayer extends Player { public Move searchMove(Position org) { // 合法手取得(全部+∞) MoveTreeSet mts = org.getAllMoves(); // 1手取りだし Move m = mts.removeFirst(); // 1手指す org.move(m); // 局面評価値を手の評価値にする m.setValue(org.calcValue()); // 手を追加(クラスMoveTreeSetが評価値順に挿入してくれる) mts.add(m); // 最善手を返す return mts.best(); } }
529 :
◆R/rLuLKeEI :04/04/04 20:11
上に書いたのは現在開発中のとほぼ同じ構造です。 親クラスで合法手なしなら上のメソッドは呼ばないし、呼んでもnullを返すと投了扱いにしている。 この枠組みに手を加えてManPlayerとMiniMaxPlayerを書いた。 評価関数が局面クラスと分離していないのが問題。でもいいや、動いてるし。
530 :
デフォルトの名無しさん :04/04/10 21:06
非常に初歩的な質問で失礼します。 将棋ソフトの開発はBorland C++ Compiler5.5程度でもできるのでしょうか? あるいは、Borland C++ Builder 6 Personal または、Visual C++ 5.0 6.0や.NET Std 2003などが必要なのでしょうか?
あぼーん
532 :
デフォルトの名無しさん :04/04/10 21:44
>>530 Borland C++ Compiler5.5なら十分できます。
533 :
デフォルトの名無しさん :04/04/10 22:00
>>532 お返事ありがとうございます。
1年後の選手権参加を目標にがんばってみようと思います。
534 :
デフォルトの名無しさん :04/04/11 00:18
昔、将棋のプログラムをVBで作ろうとしたのですが 駒を作るのが面倒なので辞めました。 どなたか駒をもらえないでしょうか?
535 :
◆R/rLuLKeEI :04/04/11 00:37
536 :
デフォルトの名無しさん :04/04/11 01:09
どうせなら24金製の駒が欲しいね。
537 :
デフォルトの名無しさん :04/04/11 01:20
硬い鉄の方がいい
538 :
◆R/rLuLKeEI :04/04/11 01:21
ああ、みてくれだけでいいのか。 だったら礒部将棋のページにフリーのPNG形式とBMP形式のがあるでよ。 個人的には白金製のディスプレイ用巨大駒が欲しい。
539 :
デフォルトの名無しさん :04/04/11 10:30
>538 ありがとうございます。 暇なとき作ってみます。
540 :
◆R/rLuLKeEI :04/04/12 07:17
近況: 既知のバグは残したまま ・評価の重み付けを何となく対話的に更新する処理を考えながら実装中。
コンソールアプリで作り始めたが、盤の上ではキー入力なのに、
ファイルを開くときにマウス入力になったり、
将棋盤を表示するスペースが大きく、読み筋を表示する位置が
なかったりしたので、ウィンドウズアプリで作り直し。
ただ、ウィンドウズアプリ製作はあまり経験が無いので、
別のゲームを作って知識を深めてから将棋に取り掛かる予定。
後、少し前に作ったオセロですが、よかったら遊んでください。
動作環境はウィンドウズで、キーは位置は、Enterで駒を置く、
スペースで次の一手のヒントを得る、Escで終了。
http://gamdev.org/up/img/487.lzh
プログラムの流れ、出力、入力以外の部分は コンソールアプリ、ウィンアプリ大体同じなので、 その部分はコンソールアプリの方でも製作継続中。 今はカーソルの移動、盤の反転、駒を動かす、 棋譜のセーブ/ロードなど、まだ基本部分の所まで。
543 :
◆R/rLuLKeEI :04/04/18 05:24
局面表の衝突が起こる前に仮想メモリを食い尽くしてダウンしてしまった。 Javaだと局面の配列はポインタの配列になるので局面を登録すると空きメモリが減っていくらしい。 とりあえずメモリ不足に強い探索アルゴリズムを考えてみる。
>>543 >局面表の衝突が起こる前に仮想メモリを食い尽くしてダウンしてしまった。
>Javaだと局面の配列はポインタの配列になるので局面を登録すると空きメモリが減っていくらしい。
(局面そのものの記録じゃなくて)
booleanかintの巨大配列に局面のハッシュ値だけを登録するのじゃ駄目?
4Gぐらい積むとか。
546 :
◆R/rLuLKeEI :04/04/19 16:53
ハッシュ値はハッシュ表の添え字になるんじゃなかったか? それにめったに起こらない衝突が起こったとき同一か否かは知りたい。 物理メモリをたくさん積んでも時間稼ぎみたいで根本的な解決にはならない。 やりたいこと: どんなメモリ量でも最適なハッシュ表のサイズを人の介在無しで決定する。 現状、ハッシュ値に32ビット値そのまま使ってんのが原因やね。 とりあえず前向き枝刈りを入れてみた(時間稼ぎ)。
>>546 ハッシュ表は↓な感じで評価関数をキャッシュするために使うと思ってたけど、何か違った?
int hyouka(Kyokumen kyokumen){
//ハッシュが登録されている場合はその中身を返す。
//登録されていない場合は真の評価関数の値を登録して返す。
//衝突は滅多に起こらないから気にしてない。
int hash = kyokumen.hashCode() / hashHyou.length;
if(hashHyou[hash] == 0 ){
hashHyou[hash] = _hyouka(kyokumen);
}
return hashHyou[hash];
}
>どんなメモリ量でも最適なハッシュ表のサイズを人の介在無しで決定する。
java.util.HashMapは動的にサイズを変えてるね。
それとも、確保できる物理メモリを全部起動時に占領してしまうとか。
548 :
◆R/rLuLKeEI :04/04/19 18:32
>>547 難しく考えすぎていました。
ありがとう、やってみます。
549 :
◆R/rLuLKeEI :04/04/19 20:42
うさぴょんのソースだとEvaluatedTblが局面表らしい。 が、要素の型EvaluatedValは構造体だしなあ。違うんかな。それっぽいけど。 64MBに納まる配列が二組。 64ビットで区別して衝突したら前のを二組目に押し込んで新しいのを一組目に入れるようだ。 64ビットハッシュ値はハッシュ表の添え字と関係あるけどそのものじゃないんだね。 仮想メモリ込みで空きが128MB未満だと動かんのか…違っていたらごめんなさい>うさ親さん
EvaluatedVal構造体には、評価値の他に、最善手などもしまって います。そうすることで、反復深化を行う場合に効率よく最善手から探索を 行うことが出来るようになってます。 それから、メモリの使用量ですが、デフォルト値はソースに書いてある64M ですけど、物理メモリの量にあわせて動的に決めてます。 そんなとこで。
分かってる事かもしれないけど、一応書いておきます・・・ struct Hash { // 局面表に登録する情報 unsigned __int64 key; // ハッシュ値 int depth; int value; Move best; ... }; 登録する場所、 Hash hash; .... hash.key = getHashKey(); hash_table[ hash.key & HASH_SIZE ] = hash; // 登録する場所は、 key & ハッシュ表の大きさ if(hash_table[ hash.key & HASH_SIZE] != NULL && // 既に何かが登録されてる hash_table[ hash.key & HASH_SIZE].key != hash.key) // キーが違うので同一局面ではないだろう。。。 // 再ハッシュして登録
hash.key = getHashKey(); if(hash_table[ hash.key & HASH_SIZE != NULL && hash_table[ hash.key & HASH_SIZE.key != hash.key) // 再ハッシュして登録 else // 登録されてる値より良い値なら更新 こうだった
553 :
デフォルトの名無しさん :04/04/19 22:13
]が足りない
554 :
◆R/rLuLKeEI :04/04/19 22:32
>>551 ?
「キーが違うので同一局面ではないだろう」というより「キーが同じなのに違う局面てことは多分ないだろう」ですね。
局面Aのハッシュ値 = 15000 局面Bのハッシュ値 = 25000 ハッシュの大きさ = 10000 だとしたら 15000 % 10000 = 5000 -> hash_table[5000] 25000 % 10000 = 5000 -> hash_table[5000] 登録場所は一緒だけどキーは違う
556 :
◆R/rLuLKeEI :04/04/19 23:15
そう、 ・キーが違うから局面が違う。 ・局面が同じならキーは同じ。 ・キーが同じでも局面が同じとは限らない。 どこが間違っているのだろう? ・キーと登録場所は違う。 ・キーと局面のハッシュ値は同じ。 この辺りの私の思い込みが怪しいのか…ようわからんので寝る。 起きて再考したらすんなり理解出来るかもしれない。
557 :
◆R/rLuLKeEI :04/04/19 23:38
意固地になっている私がおかしいのか‥そうだ、そうに違いない。 ただ今私の論理は破綻中。 やはり帰って寝ます(1.5時間くらい後)。
1つの局面にキーを3つぐらい用意して、それでも衝突するならハッシュ使うのは諦めるしかないんでわ・・・ 64ビットあれば、添え字の衝突はあってもキーの衝突はまずないんじゃないでしょうか、、。一日中探索したりしない限り。 あと、上のは局面表を構造体で登録する方法を示しただけです。 構造体がどうこう言ってたから、ハッシュ値しか登録してないんじゃないかと思ったので。
559 :
◆R/rLuLKeEI :04/04/20 02:53
ハッシュ値の元の局面そのものを登録してました。 実は最善手以外の全ての手も入れてました。 探索自体かなり遅いので32ビットでもキーの衝突は一度もありませんでしたが、 めったに起こらないことにも拘りたいのは私の性分なんでね。 仕方がない。 でも私が局面表の目的を誤解していたのは確か。 この度は猛烈に参考になった。 実装やり直しは多分5月中旬。 まだ色々と試行錯誤したいので越えそうにない壁にぶちあたった時はよろしくご教示くださいませ。 では今度こそおやみなさい。
>>559 めったにおこらないことにも・・・というなら、論理上ハッシュはつかえないのでないかと小一時間
561 :
◆R/rLuLKeEI :04/04/20 13:42
天変地異が起こったときは役に立たないとか? 何日も探索を続ければ一度くらいはキーの衝突はありえる。 その時キー以外に比較するものがなければ真に異なる局面なのか判別できない。 もし異なる局面でよりよい評価値であったなら正しくない諸情報で置き換え、またそれを使う。 キーと局面が一対一対応か、キーの他に局面そのものがあれば判別できるので前のを捨てて新しい のを入れるか、よりよい評価値であったなら更新するか、また使うときも異なる局面の情報を間違 って使ってしまう心配がない。 区別出来ないのは気持ち悪いなぁと思 略
562 :
◆R/rLuLKeEI :04/04/20 14:08
阪神大震災前に「日本の規準ではその程度の地震では高速道路が落ちることは絶対無い」と米国の震災の時に聞いた。実際に阪神大 震災では倒れたわけで、起こりうることへの対処がないのはとても不安。 この話題、私が非常に不利なので撤収したくなってきた。無視して頂ければ自然消滅しますので皆 様よろしく。
>>561 ,562
設計者が行なっているのは、ある「想定」に従ってコスト計算すること。
阪神大震災どころか、原爆が落ちたって大丈夫な建物というのを作ることは技術的には可能。
でも、コストがあまりにかかり過ぎる、ってことなだけ。
今回の話で言うなら、キーが誤って衝突したときにどれくらいの被害が起きるか。
少し手が信用できなくなるだけなのか、もっと致命的なことが起きるのか。
そしてそれを回避するためにはどれくらいコストがかかるのか。
というのを基準においてあくまで「コスト計算」として判断しなきゃダメ。
例えば、オセロの完全探索みたいな時は衝突は致命的。だからそういう時は
盤面情報が落ちないようにキーを作る。
将棋でももちろん情報が落ちないキーを作ることは可能で、
あとはそれがどれくらい必要なのかを検討するだけでしょ。
564 :
◆R/rLuLKeEI :04/04/20 17:26
キーの衝突があったらどれくらい影響があるか局面そのものも入れて実験してみたら衝突前にダウンした。 原因はすぐに分かったが他の人はどうしているのだろうと調べたり聞いたりしてみて、「でもこれ は完全じゃない」と強く思った次第。 不完全だか単純と完全だか複雑なら後者により興味がある。αβよりSSS、前向き枝刈りより全幅 探索、完璧な評価関数…私は負け組に属しているらしい。 確率的にほとんどないしほとんど影響ないから問題ないというは私が許さないだけです。 許さないならどうするというのかと言われると困ってしまうがどう 略
565 :
デフォルトの名無しさん :04/04/20 19:31
心配するな。 どっちみち、まともに動いてないプログラムなんだから。
566 :
デフォルトの名無しさん :04/04/20 19:34
ハッシュの計算には、なにを使うのが一般的なんですかね?
567 :
◆R/rLuLKeEI :04/04/20 21:38
段ごとに、最小完全ハッシュを作ることってできないかな?
http://www.breuker.demon.nl/thesis/index.html ここの、"The transposition table"という論文によると、
キーが衝突した時の解決策は
1.盤面の情報を全て記録しておく(メモリ不足になるので良い作法ではない)
2.キーが衝突した局面表に記録されてる手が、現在の局面での合法手かを確認する(エラーを少しは回避できるだろう)
ということらしいです。
2の場合、
ある局面でのある手の評価は、他の局面でも大体一緒だろう、
ということで、違う局面の評価だったとしてもある程度信用できるんじゃないでしょうか。
64ビットなら、衝突する可能性は1%程度だそうなんで、そうそうある事じゃないし、
たまに間違えちゃったら、まぁしょうがないかって具合でいいんじゃないですか、、、
市販の将棋ソフトも、大勝勢の場面で投了したり、詰んでない局面で詰みです、とか表示されたりすることもたまにありますし。
それでも嫌なら、ハッシュを使うのをやめればいいわけで・・・
570 :
◆R/rLuLKeEI :04/04/21 08:37
>>569 まさに、解決策1をしてみて駄目だったということを確認したわけだ。
しかしもっと基本的な部分で本当にまともに動いていないので局面表を使わない探索に戻した。
まともに動くようにしてから局面表を実装してみる。
現実的に取り得る対策として解決策1は絶対採用しない。
実現方法としてハッシュは多分採用する。
その前にO(logN)の別の実装を試してやっぱり遅くて駄目でしたという回り道をするだろう。
私が将棋とプログラミングに向かないようだな。
うーんと・・・1局面を60バイトで表現ってどこかで読んだ気がします・・・これがキーで。 (1つの駒の所属1ビット、名前4ビット、位置8ビットの12ビット=1.5バイトが40駒) キーからハッシュ作って・・・。重複不可なのならキーは必要だし・・・。 重複可なら60バイトのキー値はいらないし。 とか考える前に、私は静的評価関数を考えなければ。 近況: プログラム開発完全停止。 開発環境をVineLinuxに移行しようと模索中です。 環境整備できたら、データ構造から書き直しする予定。
>>571 (81マス×成不成+持駒)×先手後手というわけで計算。
(log(((81 * 2) + 1) * 2) / log(2)) * 40 = 333.949126
あと、「金はならない」「王はお互い一枚ずつ」という条件を加えると、
((log(((81 * 2) + 1) * 2) / log(2)) * 34) + ((log((81 + 1) * 2) / log(2)) * 4) + (log(81) / log(2)) = 319.626815
結果、最小ハッシュなら40バイトを切ります。
573 :
◆R/rLuLKeEI :04/04/22 00:46
古い文献で申し訳ないが、『コンピュータ将棋』p.64に"281ビッド(約35バ イト)で盤上は表現される。持ち駒があるときはその配分を付け加えるがその 分だけ盤上の駒が減るので35バイトで表現することができるといえる。"とあ るけど…今はまともに動くプログラムにする方が先決。
574 :
◆R/rLuLKeEI :04/04/22 01:37
うさぴょんのソースのHASHVAL.Hだったかに16進数値がずらっと並んだのを見かけたけど ゾブリストなんとかとかいうハッシュキーの生成に使うんかいな? 手元にソースかないんでわからへんねん。 わてのはまともに動いてへんからどうでもええねんけど。
575 :
デフォルトの名無しさん :04/04/29 10:46
全ての局面は何通りあるのかな? 天文学的数字だろうけど、どういう風に計算すればいいんだろう? 281ビットで表現できるということは2の281乗?
575
577 :
デフォルトの名無しさん :04/04/29 15:27
>>573 の文献は持ってないが、Huffman符号で切りつめてみたけど
盤面は最大で 267bit
最小で 81bit
持ち駒は片方のみ持つことで21bitぐらいか...。
>>575 俺が途中まで考えたのは…
盤に駒を置くより、駒に座標を持たせた方が空白を考慮しなくていい分だけ情報量は減らせるはず。
1つの駒に持たせる情報は、成り(2種類)、先手後手(2種類)、と座標(81+1(持ち駒))で、
2*2*(81+1) = 328通り
だね。
それと、手番(2種類)が必要だね。駒の種類は情報格納位置で表せる。
更に、ルール上、玉と金は成れないので、成り情報の分は減らせる。
更に、玉は先手後手1つづつと決まっているので先手後手情報の分も減らせ、なおかつ持ち駒になる事もないから座標から持ち駒の分も減らせる。
歩と香は成らない状態で敵陣1段目に存在することができないので、1つの駒につき座標情報を9つ減らせる。
桂馬は成らない状態では敵陣1段目と2段目に存在できないので、1つにつき18マス情報を減らせる。
持ち駒以外のマスには1つのコマしか存在できないから、駒の位置が1つ決まるたびにその分他の駒の位置は限定される。
二歩を考慮すると、もう少し情報を減らせる。
あとはこれを計算すればいいんだけど、面倒くさいんで、頭のいい人、お願い。
まあ、328の40乗より局面が多いって事はないね。
表現の最小のビット長は面白そうなパズルですね。
>>573 (コンピュータ将棋 ISBN4-7819-0581-1)の281ビット表現は
おいらにはワカランです(^^;;
最小の証明をやろうとすると大変だから、
発見した方法を提出していくといいかも。
うう、プログラムぜんぜん進んでない。。。
大会に出場される方々はいろいろ、準備されてるんだろうなぁ・・・。
やっぱし、もうちっと脳みそを鍛えねば来年の大会参加すらアヤシイですのぉ。
盤上の駒の有無:81ビット 盤上の駒情報:5ビット×40(種類3ビット、成り1ビット、先手後手1ビット) で全部盤上にあるときは281ビットで表現できる
>>580 の続き
持ち駒があるときは、1枚につき
盤上の駒情報5ビット減り
持ち駒情報4ビット(種類3ビット、先手後手1ビット)増える
583 :
まともに動いていない ◆R/rLuLKeEI :04/04/30 23:02
>>580-581 初めて281bitの意味が分かったよ。
局面の数は高々10の85乗と言うわけだな。いや違うか…。まあいいや。
ダビスタを、MX,NY以外で落とせるところを教えてください。
めちゃくちゃな誤爆だな・・。 家の2階からでも落としてください。
586 :
デフォルトの名無しさん :04/05/03 21:42
1日目終了上げ
587 :
デフォルトの名無しさん :04/05/04 00:24
予選敗者と間に合わなかった人で、ネット棋大会やらないか。 6月20日でどう。
>>578 盤面の記憶だけを考えてみた。
駒の種類と同じで、先手後手も位置で表現できる。
盤上の位置は0~80までの番号で表せられる
そうすると位置情報で7bit、成りで1bitか
(持ち駒は座標を盤外にする)
これで1盤面当たり40byte(320bit)
扱いやすさを考えると、この当たりが妥当かと思われる
ただし、これはCでの試算なので、C++はともかくJavaとかだと
classにするともっと消費されるかもしれない
>>588 王以外は先手後手情報は位置では表現無理でない?
>>588 盤面に全駒が乗っている場合の圧縮限界を計算してみた。
歩18香4桂4銀4金4角2飛2王1玉1と空枡41だから
81!
------------------*2^38*2^34=1.67E+053
18!*4!*4!*4!*4!*2!*2!
つまり、177bitで表現できる。(持ち駒を含めば180bit程度か)
案外、将棋の盤面って少ないのかも。
>>590 に訂正
> 81!
>------------------*2^38*2^34=1.67E+053
>18!*4!*4!*4!*4!*2!*2!
↓
81!
---------------------*2^38*2^34=1.67E+053
18!*4!*4!*4!*4!*2!*2!*41!
592 :
デフォルトの名無しさん :04/05/04 22:30
【将棋】コンピューター将棋世界一決定[05/04]
コンピュータ将棋ソフト世界一を決める第14回世界コンピュータ将棋選手権が
2004年5月2日(日)~4日(火) に渡って千葉県木更津市 かずさアークで行われた
予選を勝ちあがった5チームにシード3チームを加えた8チームの総当たり戦の結果
YSSが6-1で優勝、7年ぶりの世界一となった
また話題の北朝鮮製のKCCも健闘し、3強に迫る力を見せた
http://www.computer-shogi.org/wcsc14/ 最終結果は以下の通り()内は市販製品名、無いものはそのまま、TACOSのみ市販無し
*これらは全て大会バージョンであるため市販品とは違っていることに注意
1 YSS(AI将棋)
2 激指
3 IS将棋(東大将棋)
4 KCC将棋(銀星将棋)
5 柿木将棋
6 永世名人
7 TACOS
8 金沢将棋
>>591 をエクセルへ入力するのに間違いがあった。
それを直したら9.63E+070=236bit。
ついでに局面を持駒まで含めて数えるのをjavaで書いたところ、
すべての局面を表すのに必要なのは237bit~30byteらしい。
最小ハッシュ関数をどう作るのかは判らん。
594 :
デフォルトの名無しさん :04/05/05 16:35
>>580 >盤上の駒の有無:81ビット
>盤上の駒情報:5ビット×40(種類3ビット、成り1ビット、先手後手1ビット)
ということですが、1一に駒がある、ということは分かるんですが、
1一に歩じゃなくて香がある、という情報(その位置にある駒の種類)は、
どこをみれば分かるのでしょうか?
それが分からないと、正しく盤面を一意に表せないと思うのですが。
駒の種類が7種類なら、有無ビットがいらないのになぁ
>>594 ハッシュのことは、ほとんどわからないんだけど、
まず、
>>580 のデータで照合して、
それに合致した場合あらためて駒の種類も照合するというのではないの?
597 :
まともに動いていない ◆R/rLuLKeEI :04/05/05 20:35
>>594 81マスを一直線に並べてビットの立っている順に駒を並べれば区別できるはず。
盤上は1マス6ビットで十分、
81*6=81*(1+5)=81+81*5
有無ビットが0なら駒情報は無意味なのでこれを落として別にする。
81+81*5=81+(40+41)*5=81+40*5+41*5
最後の41*5が消せるわけやね。
>>597 なるほどφ(・・
81ビットと81マスを1対1に対応させれば、
ビットの立っている位置=固定位置となり駒の位置が解かる。
さらにビットが立った回数nから、n番目の駒情報が参照できる。
もっと勉強しなければいけないなぁ(^^;
599 :
まともに動いていない ◆R/rLuLKeEI :04/05/05 22:31
>>593 2^10≒10^3
なので
2^237≒10^71.1 今まで言われてきた総局面数の最小推定値を探しに前レス・前スレッドを遡ってみるわ(携帯で)。
600 :
まともに動いていない ◆R/rLuLKeEI :04/05/05 22:31
>>593 2^10≒10^3
なので
2^237≒10^71.1 今まで言われてきた総局面数の最小推定値を探しに前レス・前スレッドを遡ってみるわ(携帯で)。
14 :Socket774 :04/05/06 17:46 ID:OI60h5qD
>>10 同一プログラムだからといって条件が一緒とは限らない。
アルゴリズムひとつとっても、CPU毎に得手不得手がある。
自作板より
自作板の奴ら言うことなんざ、相手にするなw
delphiで作成してみます
605 :
まともに動いていない ◆R/rLuLKeEI :04/05/08 23:14
606 :
デフォルトの名無しさん :04/05/09 13:59
将棋プログラムって、江戸時代辺りからの積み重ねて来た 譜面のデータベース入力をベースにした人口無能では駄目なの?
「ベース」にどれくらいの応用力があるかどうかが勝負ですね
>>606 問題ないよ。それが現代の将棋だから。
人間も「考えている」わけではなくて、時間の許す限り手を「探している」んだし。
手を探しながら局面を展開して「記憶されている局面」と照合を繰り返す。
その照合によって得られた自分なりの局面評価をもとに判断する。
上級者と初心者の違いは、記憶している局面数と、
それらの局面の評価基準と言えるんじゃないかな?
「奇襲」や「勝負手」というものが存在するのも、
人間心理としてタラレバ(相手が対応できないかもしれないこと)に期待しているわけだし。
一般に、コンピュータに対する定跡外しは、これに該当すると思うよ。
「定跡さえ外せば弱い」という認識で対戦しているだろうし、
逆に「定跡を外しても強い(きっちり対応される)」という認識になれば、
そいうことはなくなるんじゃないの?
少し前にも出ているけど、
将棋における総局面数を管理(再現、評価など)できれば、
それに越したことは無いだろうけど
コンピュータの記憶容量と時間の関係から敬遠されてきた手法であることも事実。
全てをそれに頼るのではなく、
いかにそれを有効活用するかが重要かもしれないね。
遅くなりましたけれど、大会参加のかた、お疲れ様でした。
近況:
私はプログラムとは違う方に生活の比重が移ってしまっています(^^;;
来年はGWに予定が入ってしまいましたし、しばらくは将棋プログラムから遠のきそうです。
>>415 で動かしたプログラム・・・から成長させるのは大変そうなので、
時間ができるときまで、プログラムは封印です(^^;;
・・・いや、まあ。
大好きなプログラミングですから、
マルチスレッド関係の本と、コンピューター将棋の進歩2を最近買いました。
そのうち、また動き出しますね(^^)
すみませんが、将棋プログラムを自作されている方、あるいは自作しようとして
他のプログラムのソースコードを読んだりアルゴリズムの研究をされている方に質問があります。
「コンピューター将棋スレッド14」
http://game6.2ch.net/test/read.cgi/bgame/1083665979/ で議論になったのでお伺いしたいのですが(私はこのスレッドで"284","290"の発言をした者です)
皆さんが現在ご使用になっている、あるいは研究されているアルゴリズムでは
現在の局面からかなりの数の指し手を探索されてから何らかの評価関数を適用して
実際の指し手を決定されているものと思います(間違っていたらご指摘ください)。
1.その探索は深さ方向で大体何手くらい読んでいらっしゃるでしょうか?
2.手の探索及び評価に必要な計算量は探索の深さをn手進めると指し手の
横の広がりも含めてどのくらい増大するでしょうか?
特に読む手の幅が広くなると思われる中盤に関してお答えくださると有り難いです。
a. n x N のオーダー (N:任意の整数、計算量は探索の深さの高々整数倍)
b. n x logn のオーダー(a.とb.の中間的な計算量)
c. N ^ n のオーダー (N:任意の整数、計算量はNのn乗、n=探索の深さ)
3.上の質問に対するお答えがb.やc.(特にc.)の場合、数手深く探索しようとすると
計算量が爆発的に増加するものと思います(間違っていたらご指摘ください)。
その場合、計算量のオーダーをより低くするための有望そうなアルゴリズムがあるとお考えでしょうか?
勝手なお願いで申し訳ありませんが、できましたらご教授ください。
なお、「コンピューター将棋スレッド14」でコンピュータ将棋のソフトウェアの事を
よく知らずに生意気な発言をしている点をご容赦ください。よろしくお願い致します。
>606さんへ 「江戸時代辺りからの積み重ねて来た譜面のデータベース入力をベースにした人口無能」 といっても途中の局面の評価(どちらが有利な局面か?)はどうされるんでしょうか? ここにいろいろな駒の利きとか玉の固さとか何らかの理屈を考えた評価関数を持ち込んだら 人工無能(非常にトリビアルな計算のみで動くプログラム)というより普通の将棋ソフトに 非常に近くなると思いますし。 そこから到達した最終局面のうち、勝利局面と敗北局面の数だけで重み付けするんでしょうか? その場合、特定の局面から勝ち、負けに到達した対局数が少なすぎて十分信頼できる評価関数にならないのでは?
615 :
まともに動いていない ◆R/rLuLKeEI :04/05/11 02:03
現在開発中断中。中だるみ状態。 まともに動いていないプログラムですが 1.1~数手。深さは固定しない。 2.N^n 3.画期的なアルゴリズムはあまり望めない。
無理だって、所詮、将棋プログラムは人間に勝てないって。 そもそも、取った駒を再配置できるシステムが将棋を奥深い ゲームにしている反面、その事が決定的に最強将棋ソフトを 今日まで誕生させる事が出来ない原因でもあるわけだ。
無理だといわれるほど燃えるんですよ、これが(笑)
>>616 どういう条件下においてか、を書いてもらえると有り難いんだけどね...
コストを無視すれば、「無理」でもないし、「勝てない」こともないでしょう。
1.深さにより、重要そうな手を判別し、前向き枝刈。(読まないで捨てる手がある)。
幅としては大体30手前後を読む。深さは7~11手くらい。
2.N^(n/2) 私の場合、大体1手深く読むのに5~6倍時間がかかる。
3.前向き枝刈をもっと上手にやるか、既に
>>611 で触れられているように、ありそうな展開を
深く読み、なさそうな展開は浅く読むというように、CPUリソースの有効な利用が必要。
まだ『画期的』な方法とは言えないかも知れないが、
>>611 で触れられた激指の方法は、
多くのプログラムに影響を与えている。
1. 深さ4手固定です。幅は1手目が30手、2手目が24手、3手目が12手、4手目が10手です。 2. 1手深く読むとおそらく4、5倍時間がかかってるみたいです(正確なところ今ははわかりません) 3. すでに良く知られているアルファ・ベータ法は画期的だったと思います。 これを使わないと時間は何十(何百?何千?)倍時間がもかかります。これに匹敵する効果的な 手法はないですが、あるものだと信じて一応やってます。
623 :
まともに動いていない ◆R/rLuLKeEI :04/05/11 19:46
>>613 >ここにいろいろな駒の利きとか玉の固さとか何らかの理屈を考えた評価関数を持ち込んだら
>人工無能(非常にトリビアルな計算のみで動くプログラム)というより普通の将棋ソフトに
>非常に近くなると思いますし。
>そこから到達した最終局面のうち、勝利局面と敗北局面の数だけで重み付けするんでしょうか?
評価関数を使わないでも、江戸時代からの譜面は膨大な数に上るし、それらを
全てデータベース化すれば、ある程度の指し手は検索機能を使えば出来ます。ま
た、膨大なデータを集めたとは言っても、対戦相手が人間である以上、データベ
ース収録外の場面が必ず出て来ます。それらをRAMにストックして人間側が勝った
場合だけ、駒の指す順番を新たに記憶していけば良いんではないかな?この部分は
自己学習型ですよね。
将棋に置いて、評価関数を導入すればするほど、それこそAIプログラムに近
くなり、ベラボーな処理能力を要求されるが、AIを使わず検索機能だけを特化
すれば、実用的なスピードを出せると思います。
つまり、データベース検索と自己学習を合わせれば、いずれは最強の将棋プログ
ラムが出来ると思います。
幸いにも、HDDが一昔に比べて値段が安く為っているから、容量の問題はクリアー
出来るだろうし、CPUのスピードも民生用ですら一昔前のスパコン並のスピードに
なっています。
625 :
デフォルトの名無しさん :04/05/12 14:18
将棋ソフトが人間に勝てないのは、クセが読まれるからでないでしょうか? 1手毎に現在ある全将棋ソフトにCOMvsCOMで対戦させ、もっとも手数が少なく投了させれそうな手を採用する将棋ソフトをつくってみるとか。 アルゴリズムは他人任せだが、勝つか負けるかといえば、勝てるかも知れない。 こういうソフトの案は既出かな。
>>624 えーと、
>>622 の数字見て言ってる?
それと、ある局面でデータベースに複数の指し手があった場合、その選択基準は?
例年通り、うさぴょんのソースと大会版バイナリ、公開しました。
「C言語の人」さん、「まともに動いていない」さん、「うさぴょんの育ての親」さん 他、皆様ご教示ありがとうございます。 指し将棋プログラムを作りたいというの私に取ってもは学生の頃からの夢なのですが、 プログラムスキルの無さと自分自身の棋力があまりにも弱い事から(クラブ24で10級未満) 挫折し続けて夢に終わっております。 それでも最近C++のプログラムを少し勉強する機会がありましたのでもう一度チャレンジして みようかななどと思っております。多分、強いプログラムを作成するのは私には不可能だと思いますので 最弱(デタラメ)な手を指すところから自己学習して少しでもましな手を指すようなプログラムとか 必要な最大計算量の見積もりとか、何か私でもやれるような事に取り組んでみたいと思います。 有難うございました。また、何か分からない点を教えて頂けると幸いです。
>>629 頑張って下さい。
うさ親さんがよく言うように作り手の棋力はあまり気にしないでいいと思いますよ。
まず動くとこまでが大変ですね。
オレも将棋ソフトのためにとprintf文で"こんちわ世界"を表示させるとこから
はじめたんで、大変でした。でも動いたときはカンドーするし、弱くても愛着あるし。
市販のソフトとは比べ物にならなくらい。
大会にでて勝とうものなら…そりゃもう、バンザイ三唱もの。楽しいよ!!!
>>626 >それと、ある局面でデータベースに複数の指し手があった場合、その選択基準は?
相手の指し手指し順を、過去のデータより拾い、似ている局面を参考にします。
それでも、複数有った場合、取り敢えずはランダム選択してあとは自己学習に任
せる。
>>633 将棋の局面空間の広さからして、そういうことは現実的には不可能だよ。
実用的なデータベースを作るのにどれくらいの容量が必要かとか、
それを埋めるのに自己学習するとしてどれくらいの時間が必要かとか、
ざっと計算してごらん。
df-pnって最強?
最強だがGHI対策など実装は大変
先後反転・左右反転を考慮すると局面の数は1/4になるよね。 現実にこれが同一に表現されるようにしてる人は居るだろうか? 定跡外し・相振り・後手1手損戦法などで、有効になる場合があるかも知れない。
書いた途端に気付いたが・・。 どうせ定跡の検索なんて一瞬で終わるんだから、その時に考慮しても同じか。
卒研でdf-pnをつかって詰め将棋プログラムを作ろうと思うのだが むずかしいかなー?
>>634 >将棋の局面空間の広さからして、そういうことは現実的には不可能だよ。
物理的な限界なら、投資額によって決まりますけど?
「江戸時代あたり」からと使ったのは比喩的な表現です。実際は
使われる媒体により、予めストック出来る、指し手・指し順は決
まります。
要するに、GMDH等を使ったプログラミングコンテストに出すような
優れたプログラムを使わないでも、データ-ベースと人工無能である
程度までなら、カバー出来ると思いますけど。
将棋って初手で30手あるわけど、仮に10手先までの全ての変化を HDDに記憶する、としたらどのくらい必要になるのかな? 単純だと30*30*...30(12回)だけど、同じ形になってしまうのは除くとして。
(12回)じゃなくて(10回)だったよ orz それに角道をあけると3手目からいきなり増えそうだ。
持ち駒が入るとさらに一気に増えるね。 理論上ひとつの局面の最大着手可能手数は550手ぐらい?
>>640 上のほうで将棋の全局面は 10^71前後って出てるけど。
このうちの何パーセントくらいをデータベースに登録したら
実用になる将棋プログラムができると思いますか?
>>644 最初のベースとなる物は、一割以下で事が足りると思います。
後は、自己学習で・・・・
>>645 10^71の一割という事は10^70ですね。
一つの局面に1バイト必要だとすると1テラバイトの
ハードディスクが何台必要になるか計算してみてください。
どなたかが現実的には不可能と言った意味がお判りになると
思います。
647 :
デフォルトの名無しさん :04/05/14 16:38
>>646 10!71なんて、あくまでも理論値でしょう?
記憶させるのは、実際に勝負に使われた、自分
と対戦者の指し手・指し順のみです。それでも、
不可能何ですか?
>>647 いえ、けして不可能ではありません。
がんばって史上最強の将棋プログラムを作ってください。
なんでもいいから早く積極的に攻め込んでくる好戦的な思考ルーチン作ってください。
>> 639 だいじょぶ がんばれ
652 :
まともに動いていない ◆R/rLuLKeEI :04/05/15 00:01
ちょっとした思いつき: 二つの局面A,Bに距離d(A,B)というものは定義出来ないだろうか。 仮にA→Bへの最小手数とすると d(A,B)≠d(B,A) となりそうで具合が悪い。やはり次の条件は満たしたい: d(A,B)≧0 d(A,A)=0 d(A,B)=d(B,A) d(A,B)+d(B,C)≧d(A,C) d(A,B)≡0以外に上手い定義はないのか? 空間だから距離があってもいいかなと…類似度みたいなものやね。
類似の目的によるけど例えば似た局面で定跡を使うためなら A→Bへの最小手数 ただし駒はバック(逆向きにも移動)可 でどう?
駒取りが入るとややこしくなるな
現状の将棋がそこそこなのはなんで? 完全ハッシュみたいなことをする領域が無いからなのか、 CPUの性能が それでもまだまだで手数が少ないからなのか? 地球シミュレータくらいのスーパー紺つかえばどのくらいになるんだろ
地球シミュレータータイプのスーパーコンピューターはいわゆるベクトル型というやつで。 浮動小数点演算、それも特にベクトルや行列演算がバカっぱやくなるように設計されている。 同じ浮動小数点演算でもベクトルに特化していないでとにかく数をこなすのがスーパースカラーという奴。 で、将棋プログラムはもっぱら固定小数点演算あるいは論理演算しか用いないので浮動小数点演算がいくら速くても関係ない。 しかも現在の将棋プログラムのアルゴリズムは演算を並列化しにくいらしいのでCPU128個持つというような 密結合SMP(マルチCPU)でもどれくらい速くなるか怪しい。 つまりソフトの性格(必要とする計算パワー)とハードウェアがミスマッチなので例え地球シミュレーターで動かしたとしても 大して強くならんと思う。その前にまずそのハードウェアの能力を引き出すようなソフトの移植が非常に難しいと言える。 即ち、労力ばっかり大きい割に成果がほとんど望めないのでまず誰もやらないだろう。
そこで将棋専用チップの登場ですよ。
いっそSETIみたいに大量のPCで総当りw
将棋専用チップって誰か構想(アイデア)を持ってるのか? ディープブルーに使われたチェス専用CPUって手の探索を広く深く行なうためだけの サブCPUに過ぎないらしいしな。そういうものでも将棋に応用すれば手の探索だけは 結構速くなるかも知らんが。
ファミコンの森田将棋にはカセットに専用チップが載ってたらしい。 油もビッチがポケットマネーで高額高性能な並列コンピュータ組んで 馬力で思考させたらあっさりプロ打倒できたりしてな。
661 :
まともに動いていない ◆R/rLuLKeEI :04/05/16 00:45
ちょっとした思いつき2 1手目で得られる全局面分のプロセスを生成して並列に探索する。 だたし、適当なタイミングで評価値を調べて高いものがより大きな優先度になるように調節する。 重要でない手の先も念のため一応残して探索するけど、重要な手の先をより重点的に探索することが可能になったり… 複数台のPCに重要そうな手が集中しないように幾つかの手を抱き合わせて振ったり… 思いつきだけで書いてすんません。
ファミコンのCPUって6502(AppleⅡにも使われた8ビットCPU)らしいからな。 専用CPUつったって少し速い16ビットCPUかなんか積んだだけじゃねーの? 当時はFPGAなんか無かったと思うから、本気でカスタムCPUを起こしたりしたら 鬼のように金がかかったはず(何千万単位)。DSP使ってもしゃーないだろうし。 油もビッチって誰の事言ってるのか分からんが、どんな高額高性能な並列コンピュータを 組んだら将棋がどのくらい強くなるのかまだ誰も分かっていないと言う処だろう。 つまりアルゴリズムの研究が並列化の方向を向いていない。 将棋研究に使ってくれと超並列コンピュータを貸してくれる処も無いし。 ニワトリと卵だな。
663 :
まともに動いていない ◆R/rLuLKeEI :04/05/16 01:03
コンピュータ将棋の進歩4の第3章に詰将棋用指し手生成FPGAの開発記事があるが、 探索や評価もハード化すべきなのか?
謎の大富豪アブラモビッチの正体。 (Number) - goo スポーツ 7月初め、サッカーの母国イングランドに、信じられない事件が起きた。 ロシアの大富豪が、ロンドンの高級住宅地をホームとするチェルシーを買ったというニュースだ。 ロマン・アブラモビッチ、36歳。ユダヤ系ロシア人。英国のメディアによれば、新しい選手の獲得、 スタジアム、その他もろもろの経費に総額400億円近くを投入するという、 信じられない話である。その後チェルシーが、 約1カ月の間に8人の選手に総額100億円以上をつぎ込んだことで、それは現実の話となった。 ゲイツが将棋ファンならこれくらいの投資してくれるかもね。
今はディープブルーの何十倍くらい早くなったんだ?(;´Д`) そろそろ総当たりで解決する速度にならんものか・・・
現在でもまだあの頃(1997年)の何十倍もは速くはなっていないだろうな。
ハード(同じタイプのプロセッサー)の性能向上だけならせいぜい数倍から10倍かと。
ディープブルーがすごかったのはむちゃくちゃ贅沢なハードウェアを組んだからで。
http://hotwired.goo.ne.jp/news/news/culture/story/20021022205.html 512基のチェス専用アクセラレータチップなんてものを開発して搭載したからな。
将棋はまだまだこういうすごいハードウェアを組んで力技で押してたら人間の名人に勝てそうだと
言う見込みが無いし、IBMみたいに金のあるメーカーが人間に勝つシステムを組む動機も無いし。
(日本だと富士通あたりがそんなもの作ると却って非難ごうごうになりそうw)
ま、当分実現不可能そうだな。総あたりでやるには分岐(局面)の数多すぎだし。
>>666 作者が書いた資料によると512個ではなく480個(30ノードのRS/6000SPに16個のチップ)
だったらしい。
このハードで1997年の探索速度が2億ノード。
2002年にクラムニクと戦ったのフリッツがXeon900MHzを8個で600万ノード。
2億=20000万なので20000/600=33倍。
まだ速度では全然負けてるね。
670 :
まともに動いていない ◆R/rLuLKeEI :04/05/17 00:48
>>669 ありがとう。
興味が湧いたら読んでみます。
何も共有しない、無駄には目を瞑る、評価値さえ返してくれたらいい…
っていうか…まあいいや、退散します。
量子コンピューターになれば、さすがに解決するか。('A`)
環境ホルモンで人間がどんどん馬鹿になってるから そのうち追いつくよ。
>>671 ちなみに量子コンピュータはその原理上、「解が周期性を持つ」ようにアルゴリズムを組まないと超並列性が生かされない罠。
つまり、大量の候補の中から唯一の解を捜し出すような問題にはそのままではまだ適用できなくて、
候補の中に周期的に解が埋まっているようにうまいこと問題を変形すると使えるようになる。
というわけで、ハードがそこそこ使えるようになったとしても、
アルゴリズムの研究も進めないといけないわけで、こっちの方が多分難しい。
おそらく羽生には間に合わねぇ。
おまえら、つべこべ言ってないで、 誰かがTCP/IPでの簡単な審判役のサーバーを用意して 全てのプログラムを100回ずつぐらい対決させればいいじゃん。
羽生が痴呆になる(ことは殆ど無いが)までは コンピュータが勝つのは厳しいね。 DNAコンピュータとか量子コンピュータとか スーパーコンピュータ(ベクトル)とかがあっても
>>674 このスレの中の人同士で一度対決してみたいね。
まぁ審判役サーバなんて無くても、「ヤフーゲーム」みたいなのでもいいが
時間がかかるので 通信ソフトを作って 自動対戦させておけば楽だな
677 :
まともに動いていない ◆R/rLuLKeEI :04/05/17 23:33
>>676 ほとんど見込みはないが万一まともに動いたら参戦してみたいね。
679 :
デフォルトの名無しさん :04/05/18 00:51
脳型コンピュータなら大量の候補の中から唯一の解を捜し出すような問題がイチコロ
681 :
デフォルトの名無しさん :04/05/18 02:27
脳型コンピュータよりも、今のやり方の延長で10年以内に名人レベルに達するのでは? そもそも、今の技術では脳と似た動作を再現できるとはおもえませんが。 通りすがりのものです
なあ、ふと思ったんだがもし、将棋の初手から到達可能な全ての局面をグラフのようなもので 表す事ができて(グラフの矢印は指し手)それをメモリー上というかデータベース上に 格納できたらそれでもう必勝法はできるのかな? 最終局面からバックトラックしていって、局面に点数を付けるような方法で。 それともそれでも必勝法が見つからない可能性が有り得るのかな? 検査すべき局面が桁違いに大き過ぎるという問題は別にして。 (人間あるいはコンピューターが何百万年も懸けて局面を探索するとか仮定すれば)
通りすがりの者のほうがいい指摘をするね。 予想としては2010年(6年ぐらい)までには、 30秒将棋で名人にも十分勝ち越せると思う。 いや、30秒なら6年もかからないかな?
>>682 一応千日手になる可能性があるけど、原理的にはその方法で必勝法が見つかるよ。
でも何百万年どころか、何百億年かけても今のコンピュータじゃ無理だ(--;
>>682 どうやって全ての局面をメモリやHDに格納するんだよ
局面をURLに変換してみんなで持つんだよ
687 :
まともに動いていない ◆R/rLuLKeEI :04/05/18 08:45
盤を4×4とかに縮小してやってみるとか。
689 :
まともに動いていない ◆R/rLuLKeEI :04/05/18 22:33
そういえば昔5×5将棋があったけど、解決したんかね? オセロや囲碁と違って初期配置が決まっている将棋は盤面縮小は難しいのでは?
690 :
まともに動いていない ◆R/rLuLKeEI :04/05/18 23:08
オセロも初期配置が決まってましたな。すまぬ。
あまりやられてないの? 今なら世界に名を残せる? 実際プレイして面白いか云々はおいといて 計算量としてどんな程度なのかって事で やってみると面白そうに思うんけど。
初期配置が決まってないゲームなどない
将棋の思考ルーチンって盤のサイズ変わっただけで 大幅変更必要になったりするの? 簡単に流用できるなんな何でやらないんだって ひじょーにもどかしいんだが。
後手持ち駒:銀歩 ┌──┬──┬──┐ │__│__│▽玉│ ├──┼──┼──┤ │__│__│__│ ├──┼──┼──┤ │▲玉│__│__│ └──┴──┴──┘ 先手持ち駒:銀歩 一段目から成れる これなら、先手必勝だった。 単純にミニマックスで探索するだけで良かったんでこれは楽だった。 しかし本将棋とは規模が全く違うし駒の配置も違うんで、こういうのを調べて意味があるのかどうか・・・。
>こういうのを調べて意味があるのかどうか・・・。 あるあるあるある。 「今の計算機だとm×nのこういう配置でxx日で必勝手順が出る」とか そーいうデータ面白い。
なんつーか具体的な目安ができるというか。
697 :
まともに動いていない ◆R/rLuLKeEI :04/05/18 23:35
>>692 何も置かないというのも配置には違いないわな。重ね重ねすまぬ。
でもオセロは縮小だけなら簡単にできる罠。 #尤も、奇数×奇数では戦略が違いすぎてしまうので、実際には6×6か4×4しか選択肢がない。 ##そして、4×4では簡単に解けてしまうと思われ。
オセロは既に最強ルーチンが存在するらしいね パターン数が現実的な数値内で有限だからかな
>オセロは既に最強ルーチンが存在するらしいね 世界一に圧勝するってだけで読みきれてはいないだろ
>> 691 論文は公開していないみたいだが 後藤智章, 柴原一友, 乾伸雄, 小谷善行: 小さな将棋の解, Game Programming Workshop 2003, 2003/11/7. で色々解いてたが5x5よりは小さかった
702 :
まともに動いていない ◆R/rLuLKeEI :04/05/19 00:53
コンピュータリバーシ研究会というサイトによると4×4、6×6ともに後手必勝だそうだ。8×8は書いていなかった。
>701 ぬう。 >702 まだ解けてないもの。
>701 なるほど、5x5でもまだ解析的に(総当りで?)解けていないというわけだな。 恐ろしい!ところで5x5将棋ってどんな駒の配置なんだ?持ち駒は?
自分で解きやすそうなものを考えたら勝ち! 5×5の勝ち名乗りを上げれ!
706 :
まともに動いていない ◆R/rLuLKeEI :04/05/19 01:34
>>704 確かこんなL字型の配置だったはず。
歩
王金銀??
成りとか、持ち駒とかルールが凄いからな COMはチェスのがもうちょっと強いらしいじゃないか
>>678 SSEや3DNOW!は浮動小数点専用だから意味なし。
AltiVecは確か整数のSIMDもあったはずだから、それ専用に
プログラム組めば使えるはず。
5×5将棋は以前に特許かなにかで考案者とソフトハウスがもめたことがあったから みんな避けてるんじゃないかな?
711 :
まともに動いていない ◆R/rLuLKeEI :04/05/19 16:34
>>711 そうそう、詳しいこと知ってたらおせ~てくんろ
>>608 もうちょっと将棋に強くなってから書いてください。
囲碁ソフトとベクトルプロセッサは相性がいいと思う。
715 :
まともに動いていない ◆R/rLuLKeEI :04/05/19 23:55
>>712 PC9801用M?R?T?将棋におまけのように付いていた5五将棋について一悶着あったらしい。
知ってるのはこの程度です。
自宅を探せば5インチフロッピが出てくるはず。
98互換機が押し入れの中だから直ぐには読めないけど。
>> 701 3x4だね
コンピューター将棋スレッド14が盛り上ってるけど どうすれば開発者が増えるかねえ
>>717 スポンサーが一人増えれば開発者が一人増える(笑
腕試しをする場が必要なんじゃないかな 年に一回の大会のみとかじゃなくて 毎月開催のグラチャンとか
スポンサーがつくかどうかはともかく TCP/IPサーバを作れば今月のチャンピョンを竸うのは 気軽にできそうだね
作ろうぜ、プロトコル決めよう
722 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 02:03
出来ればCSAサーバープロトコル(案)を含む形で…あったらいいな。
一旦対局が始まればCSA形式で良いとして、 誰が誰と対局するかどうかを決めないといけないのかな
CSA形式へのポインターおせ~て
白砂青松さんに最弱プログラムの棋譜解説をしていただくと盛り上がりそうw
727 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 02:15
login中のものから乱数でペアを作って先後入れ替えて2局やったら対戦待ちリストに入れるとか。
730 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 02:27
LANプロトコルは私がこのスレッドの大分上の方にURLを貼っておいたはず。 探して下さい。携帯なんで検索出来ないんだ。
98年版ってなってるけどずっと変更無し? LANは接続されてしまえば232cで繋がってるのと変わりないから問題ないでしょう サーバーへの接続と認証をどうするかですにゃあ login認証で桶?
あ、すでに雛形があったのね、
733 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 02:32
ところでこれってライセンスとかは心配しなくていいのかな? 勝手に対局サーバー作っても大丈夫?
P2Pじゃ駄目? 対戦模様は2chのスレへキャストするとか?
>>735 練習モードはP2Pでやるとサーバーの負荷軽減になると思うね
でも試合モードは審判サーバーを経由しないとだめでしょやっぱ
737 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 03:05
実装方法やコードなら解るが、プロトコルにライセンスが発生することもあるのか…難儀な世の中だな。
ライセンスといわないまでも著作権とかはどうなんだろう?
プロトコルに著作権や特許を認めた判例はないと思うがなあ 甘い? あとCSAの目的からしてうるさいことは言わないと思うんだが
Linuxで動くサーバプログラムが公開されれば回線とマシンは提供できますよ
741 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 03:18
プロトコルの著作権はCSAにあるでしょうが、プロトコルの普及に貢献したとかで寧ろ喜ばれるのでは?
プロトコルつーてもそんなにめんどうでないのでは? オリジナルで作っちゃえば。
プロトコルつーてもさ 詰み判定はしない(王deadで終了) 初期状態確定済み 駒移動ルール確定済み となれば、やり取りする情報は 駒の移動と成る成らぬぐらいのもんでしょ?
プロトコルが複数できるとあんまり後々のためにならん気がするが。 すでにあるプロトコルに欠点があるなら別だが。
とりあえずサーバーのプロトコルを考えて作ろう! 出来ればTCP/IP接続でお願いしたい。 完成したら月1ぐらいで全員のプログラムを総当りさせて結果発表。 まずはプロトコルを皆で考えよう。
>>745 もうCSAがTCP/IP用のプロトコルを決めていたはず。だから新たに考える必要はないと思われ。
Webに文書置いてないのが不思議だけど。なんで?
>>748 おお、それそれ。
このプロトコルで、anonymous loginに(勝手に)対応すれば
野良サーバーが立てられるんじゃない?
anonymousでいいのか?、荒らしがくるぞ~
751 :
◆R/rLuLKeEI :04/05/22 16:28
荒らしが来るとして何をする? ソフトの振りする人がPCに張りついて月間MVPをかっさらったりするの?…やりそうな気配…
752 :
デフォルトの名無しさん :04/05/22 16:57
753 :
デフォルトの名無しさん :04/05/22 17:07
漏れは最強の将棋プログラムも、サーバーの対戦処理プログラムも 作れませんが応援してるよ。で誰がプログラムかくの?
754 :
まともに動いていない ◆R/rLuLKeEI :04/05/22 17:25
誰が都万氏の秘密のページからCSALANの擬似サーバーのソースコードを取ってきて改造するかだな。
よく分からんのでレスするだけ無駄かもしれんが、 詳しい人に教えてもらおーっと♥ ny見たいな感じでネットワークを作って、近くの人と対戦。 途中のノードに審判になってもらう。 審判が対戦記録をとって鯖にアップ。 それを閲覧すればよいので観戦はなし。 【将棋プログラム⇔ネット接続プログラム】←Internet→ 【ネット接続プログラム】←Internet→【ネット接続プログラム⇔将棋プログラム】 対戦者A = 中継ノード兼審判 = 対戦者B みたいな感じで接続するとか
禁手、千日手、連続王手の千日手あたりは紳士協定をクライアントが守るとして、 持ち時間のカウントだけあれば、とりあえずはサーバの役目を果たせる?
盛り上がってきました
あぁ、ちょっと盛り上がってきたね。 盛り上がるだけでなく、ちゃんと実現したいものだ。 もし誰かがサーバー役のプログラムを作ったとしても そのサーバーに接続するのにIPアドレスとポート番号がいるんだが・・・ サーバープログラムを作る奴はいても、 サーバーに接続させるために自分のPCのIPアドレスとポート番号を 晒す勇気がある奴がはたして現れるのか?
759 :
デフォルトの名無しさん :04/05/23 01:32
CGIなどが動くレンタル(またはフリー)サーバーではだめなのか?
760 :
デフォルトの名無しさん :04/05/23 01:36
>>755 将棋の手を送受信するにはサーバー一つあればで十分じゃないか。
一度に10局ぐらいやっても大した負荷ではないとおもうが。
SoftEtherの実験用匿名仮想 HUBとか使えば、普通のPCで一時的にサーバにして公開とか、 出来そうな気がするけどどうかな?
762 :
まともに動いていない ◆R/rLuLKeEI :04/05/23 01:46
持ち時間のカウントダウンもクライアントにやらせたら? 最低でもloginユーザーから二つを選んでパイプストリームで繋いであげるだけの機能しかなくてもいい。 そうしておいてサーバーはストリームを監視してどちらが"%TORYO"コマンドを送ったかまたは接続を先に切ったかで敗者を知る。 結果はすぐにランキングページに反映するだけ。
とりあえず(人間様が)ネット対戦できる将棋板を作る(ここまではP2PでOK)。 それに観戦モードを付ける(ここで鯖がいるかな)。 それにプログラムを接続できるようにする。
昔オセロのサーバーを作りかけてたのでそれ改造すればできそうなんだが なかなか時間がとれない・・・・
765 :
まともに動いていない ◆R/rLuLKeEI :04/05/23 02:13
766 :
デフォルトの名無しさん :04/05/23 02:17
>>765 本気だとおもうけど。まあ一時的に使っていいよという程度だとおもうが。
>>751 一局二局ならまだしもリーグ戦なんかの長丁場になると疲れ知らずのPCに人間はかなわないだろう(笑)
>>768 マクロっぽいのでなんとかならんかね?
正直それでもいいような気がする。
770 :
◆vAsNuq1gfU :04/05/23 02:58
>>767 逆に毎度ふざけたログイン名で対戦、即投了、ログアウト。最弱の名を欲しいままにする方がありえるかも。
772 :
デフォルトの名無しさん :04/05/23 03:05
>>768 のリンクで人間相手にレートが稼げたプログラムが
強いってことでいいんじゃないのか?
>>769 が言ってる部分のプログラムを作ればそれでいいとおもう。
rubyでサーバちょっと書いてみたYO
http://up.isp.2ch.net/up/f585a1790d81.zip % ./shogi_server hoge 4081
して、サーバをスタート
人間がクライアントをする場合は、別windowから
% telnet 127.0.0.1 4081
として接続 (先に接続した方が先手)
プロトコル通り
LOGIN TANUKI pass
で、ログイン
同様に、さらに別windowから、後手として
% telnet 127.0.0.1 4081
LOGIN KITSUNE pass
すると、
BEGIN Game_Summary
Protocol_Version:1.0
Protocol_Mode:Server
と表示されたら、"3.3 対局の合意"として
AGREE
を両者入力
あとは、
+7776FU
のように手を入力
%から始まる手を入力すると、対局終了。
今日はここまで。
おやすみ...
ダウソできね~ぞ?
仕事が速いね~エロイ!
776 :
まともに動いていない ◆R/rLuLKeEI :04/05/23 08:26
「らの掲示板」からこんなん見つけました。
>修正しました。 投稿者:都万 投稿日:11月12日(水)22時46分40秒
>
>山下君から指摘のあった仮想サーバの全角文字のバグと、CSA将棋の投了コードを送信しないバグを修正しました。
>仮想サーバのソースは下記URLから、CSA将棋のソースは秘密の部屋(himitsu.htm)から、また実行形式はダウンロードの部屋からダウンロードしてください。
>
>
ttp://www2.ttcn.ne.jp/~tsuma/test56.lzh 早速、ダウンロードしました。
C++/MFCというかプログラミングそのものが不得手なんで誰か
>>740 さんのLinuxでも動くようにしていただけませんかね。
777 :
まともに動いていない ◆R/rLuLKeEI :04/05/23 08:41
あ、
>>773 さんが始められてましたか。すんません。
778 :
デフォルトの名無しさん :04/05/23 08:41
>>776 VMWAREを740さんが入れてくれればすぐにでも動くのだが。
>>774 ダウソ出来ないですか。
出来た人います?
どなたか、どこかいいアプロダ教えて下さい。
>>777 私は単なる通りすがりの名無しなので、形になるまでお付き合い出来ないでしょう。
ちゃんとしたプロジェクトを立ち上げて下さい。
>>779 今朝やったらダウソできたよ、鯖落ちてたのかな?
落としてから気づいたが ruby わかんね~(おい
だいたい出来たところ - Timeoutチェック 一定時間pingに返答しなかったら負け - 持ち時間切れチェック 今日までにやるところ - CSA標準棋譜ファイル形式の出力 当分やらないところ - 合法手判定とか 改造案 - LOGINのpasswordを利用して、対戦相手を決める Aさんがhimichu+で、Bさんがhimichu-だったら、この二人で対戦 ↑ 意見キボンヌ ## ちょっと出かけてくる
782 :
デフォルトの名無しさん :04/05/23 13:59
>>781 改造案いいんでないかい?
ただ、最後の文字は先手/後手の表明だとすると+が二人居て-が来たらどちらとカップリングするのかな。
あと、
パスワード無し⇒誰でもよい。サーバー任せ。パスワード有りの奴とは組まさない。
で如何?
ウプしました。
http://up.isp.2ch.net/up/be88525a3fa2.zip (266.74 KB)
>>781 どもです。
> ただ、最後の文字は先手/後手の表明だとすると+が二人居て-が来たらどちらとカップリングするのかな。
himichu+が二人来たら、一人目のconnectionは切るようにしました。
> パスワード無し⇒誰でもよい。サーバー任せ。パスワード有りの奴とは組まさない。
そうしました。
>>780 exerbというツールで作った.exeも入れました。rubyをインストールしなくても実行できます。
>>783 ありがとうございます。
本当に動くのか、激しく心配。
socket.flushを入れたのを、多分、深夜にアップします。
なんか本格的になってきたな。俺も将棋プログラムを作り始めようかな。 仕様は56でいいんだよな?
もりあがってまいりますた。 俺も自作のやつを CSA プロトコル喋れるように改造するか…
LAN対応版CSA将棋に加えてうさぴょんの育ての親さんが密かにこしらえてるスターターキットが揃えばなお一層新規参入者が増えるね。 善いことだ。
>> 785 どうもです.それでは,新バージョンを待って取り替えようと思います. サーバのログもリアルタイムで見られると便利だと思うので, 間に合えば STDOUT.flush もお願いします. (間に合わなければこちらでやります)
>>783 うう、ログインできなくなった・・・・
ハングさせちまったかなスマソ
対戦させる時の持ち時間はどうするの? できるかぎり長くするといいと思うんだけど。
再起動しておきました. shogi_server:41:in `write': Broken pipe (Errno::EPIPE) (41行目は @sente.socket.write(start_message("+"))) なので,ログインしてからクライアントがおちるとソケットに書けなくなって サーバが落ちるのかな? ruby 読めても書けないので 773さんお願いします.
>>792 ちゅうことはやぱり私が落としてしまったんですね・・・すんまそ~ん
エラー処理が実装されるのをまっときます(汗
>>791 将棋プログラム同士を自動で対戦させるんだから、
人間の都合を排除して
かなり深読みできる時間があるといいね。
その間通信は 途絶えるけど
>>794 あんまり長時間沈黙するとルーターのNATテーブルがタイムアウトして通信が切れるから
一定時間ごとに(2~3分くらい)ダミーパケットを流す必要があるね
クライアントの負担を減らすならサーバーが現在時刻とか消費時間とか
そのあたりの情報を各クライアントに垂れ流ししてもいいかも
クライアント側は必要なければただ読んで捨てるのみ利用したければ利用する
作ったばかりの人にとっては 一手10秒の方がサクサク進んで面白いかも
実際の人間が行うルール(持ち時間)と同じ方がいいんでない?
>> 793 本質的な解決ではないけれど,サーバが落ちたらもう一度起動するラッパを書いたので お気軽にどうぞ.
なにげにコンピュータ将棋協会のサイトが落ちているようだが 昨日からのここの盛り上がりとなにか関係あるのだろうか?
ほんとに落ちてるね。ここからのアクセスがあったろうけど。 それと関係あるのかな。
コンピュータ将棋選手権の当日のアクセス数と比べれば大したことないんじゃないかな。
>> 802 おつかれさまです たしかにダウンロード全然進まないです..
804 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 00:59
>>801 ほぼ半日落ちてる。
サーバープロトコルのページは手元に保存してあるからあっしには無問題たが。
806 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 01:31
>>795 クライアントのタイムアウトチェックのようにpingを数分感覚で繰り返していればいいんでない?
これならクライアントの読み捨て処理がいらんはず。
だれがつないでるかわかるように who コマンド実装きぼんぬ ついでにチャットもできるようにとか
808 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 12:59
拡張コマンドはこんなふうに %EX WHO するのはタイプ数増えるから駄目? ここで欲しい機能は本家でも追加されるかもしれないから、その時までの暫定ということで…
>>808 コマンドに該当しないものはそのまま各クライアントに流すということでいいのでは?
>>808 は
>>807 のチャットへのアンカー間違い
>>809 特に拡張とか定義しなくても実装されてないコマンドを受け取ったら
ただ単に無視するだけでいいと思う
プロトコルは拡張しない方が好みかなあ サーバもクライアントもシンプルに保つ方が後々良いと思うんだよね というわけで代案 whoはサーバが対戦中の試合や対戦待ちリストをstatus.htmlに随時書き込んで クライアントが好きな時にhttpでダウンロードする チャットするのは人間なので特に規約を決めずに別にサーバをたてる どうでしょう
ところで、基本的なところを知らんので教えて欲しいんだけど、巷の将棋ソフ トで CSAプロトコルを喋れるやつはあるの?
813 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 13:45
あまりRuby使いの773さんに負担を掛けない方向で…Rubyわからんです。
814 :
デフォルトの名無しさん :04/05/24 14:46
んで、誰かもう対戦してみた?
誰かランダムプレーヤー投入しない?
>>795 30秒に一回pingして、30秒以内に返って来なかったら負け、となっているつもりです。
>>807 whoの機能は必要そうですね。もう一つ、別のportを使うようにしようかしら?
チャットは独立したソフトでも用が足りると思うので、消極的。
>>808 拡張コマンドでwhoするためにログインしたけど、将棋はしたくない、
というような場合に問題が出そうな気がします。
>>809 規定されていないものを各クライアントに流すのは、問題です。
サーバにコマンドを拡張し、クライアントから拡張コマンドが送られて来たらサーバが答える、
という形式であれば、互換性が保てるので問題ないでしょう。
>>811 極力、拡張したくないですね。
status.htmlでもいいかもしれません。
>>813 どもです。
>>815 ログの感じでは、誰も繋いでないみたい
>>816 生telnetでサーバに繋ぐのもアレなので、CSAプロトコルで対人対戦が出来るように、
端末ソフトを作るのがいいかも。
818 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 20:40
>>812 巷の将棋ソフトと木偶の坊とLAN対応版CSA将棋でなんとかならん?
>>818 ども。なんとかせんと喋れんけど、なんとかすれば喋れる、ってレベルなのか。
って意味では
> CSAプロトコルで対人対戦が出来るように、端末ソフトを作るのがいいかも。
これって需要あったりするのかな。
820 :
まともに動いていない ◆R/rLuLKeEI :04/05/24 21:28
接続してからログインまでならコマンド拡張の余地がありそうですね。
>>819 テスターさん向けの需要なら少々あると思う。
>>817 >>30 秒に一回pingして、30秒以内に返って来なかったら負け、となっているつもりです
プロパイダーによってはパケットロス率の高いところがあったりするので一回だとたまたまというのがありうるので
数回返ってこなければ落ちているという判断のほうがよいのではと思います
うう~ん、ログインエラーで入れないなあ エラーメッセージにはこちらの入力したIDとパスワードが出てるのに 切られてしまうようです
>>822 passwordの仕様が
>>782 になっているので、
- passwordなし
or
- passwordの最後の文字が+か-
でやってみてください。
うぬぬ、今度は入力の途中で切られてしまうようになってしまいました。 みんなはうまく行ってる?うちだけ?
のんびり入力してると途中で切れるようです 速攻で入力すると切れないようですね でもBEGIN・・・・が返ってこないです
telnet wdoor.c.u-tokyo.ac.jp 4081 して、 LOGIN username と叩く。 相手が来るまでキーボードにさわらずに我慢する。 相手が来ると、メッセージがバッと流れるので AGREE と叩く。 あとは、 +1234FU (先手の場合) -1234FU (後手の場合) みたいに手を入力 で、いけると思います。 バグってはいないと思いますが、激しく使いにくいですね。 誰かログインしてください。
パスワード無しだとうまくいきますねパワードと+-を入れるとログイン後無反応です と思ったらBIGINが流れたあと切れてました。
>>827 タイムアウトしてるのかな?
パスワード無しでログイン
少し間をおいてもう一個ログインすると
両者にBEGINメッセージが流れたところで回線断です
あ、もしかしたらWINDOWSのtelnetが改行をcrlfで送っちゃってるのが原因かな?
繋いでみたけど意味不明だ・・・ 接続→速攻でLOGIN 適当な名前(Enter)→無反応・・・ ここで対戦相手がくるとメッセージがパッと流れるって事っすか? せめてLOGIN (Enter)の後にログインに成功しましたぐらい表示してほしいよ;;
KNZWはいつ先発がいい? ・巨人戦直後の火曜 ・魔の水曜 ・三浦の木曜
832 :
まともに動いていない ◆R/rLuLKeEI :04/05/25 00:52
両方とも $ telnet wdoor.c.u-tokyo.ac.jp 4081 Trying ... Connected to wdoor.c.u-tokyo.ac.jp. Escape character is '^]'. LOGIN matomoni LOGIN:matomoni OK ... P+ P- + まで出た。しばらくすると、一方は #TIME_UP #LOSE Connection closed by foreign host. 他方は #TIME_UP #WIN Connection closed by foreign host. なりました。当方、Linuxです。悠長にプロトコルを参照してる暇がないですね。
プロトコルの仕様がわからないんだけど、 これって矯正切断用のコマンドとかないの?
834 :
デフォルトの名無しさん :04/05/25 00:55
KNZWの仕様がわからないんだけど、 これってフォーム矯正切断用のコマンドとかないの?
出来ればtelnetではなく CSAサーバプロトコルと同じTCP/IP接続にしてほしい わかりにくいよ;;
telnet二つでやってみた。 ちゃんと通信できたっぽいけど、 空白の関係で上手くそろわないで 内容の理解にすごい時間がかかった。 そのあいだにTimeout…ショボーン
>>835 CSAと同じだからTELNETではわかりにくいのだよ
>>837 補足、便宜上TELNETと言ってるだけで
TELNET用ソフトを使って人間がCSAプロトコルを話しているといえばわかってもらえるかな?
839 :
まともに動いていない ◆R/rLuLKeEI :04/05/25 02:06
プロトコル実装のテストやデバッグにtelnetを使うというテクニックはよく耳にするが、 要するに皆でよってたかってテストをしているようなもんだな。 いきなり完全準拠は困難だから改善していきませう。 で LOGIN:matomoni OK の出るタイミングがなんか違わないか?
> のんびり入力してると途中で切れるようです 取り敢えずまだみんな手打段階みたいだから、暫定的に TEMEOUT 関係のパラ メータをもちっと大きくしてくださると嬉しいかもかも > 設置者さま # ま、ローカルでテストすりゃいいんだけど… ボチボチ手動の CSA クライアント作ってみてるんだけど、初期盤面はホント はパーズして解析せにゃいかんのだよね? メンドいなぁ
841 :
まともに動いていない ◆R/rLuLKeEI :04/05/25 08:00
YSSのページにWIN向けのサンプルソースがあったような…
ちょっと行ってくる。
>>56 が生きてたらそこにもサンプルソースのリンクがあったはずなので、使えるコードは使おう。
サーバのログに日付と時刻があるといいです
843 :
デフォルトの名無しさん :04/05/25 14:07
繋いでみた。Winからだと改行コードのせいで乱れるね。 ちょっと暇になったら手動用のクライアント作ってみっかな。
844 :
デフォルトの名無しさん :04/05/25 14:12
>>842 禿どう、つーか、whoコマンド(LOGIN時。実装はどんなでもいい、自分を含めて
誰が繋いでいるかわからないと禿しく不便かも)はやはり必要かも。
今はサーバのログ読んでます。
845 :
デフォルトの名無しさん :04/05/25 14:16
あっ、接続時にLOGINしている名前を羅列してくれるだけでいいかも。
こんな感じでdaemon化してPIDを記録したいのですが、いかが。 --- shogi_server.orig 2004-05-25 13:06:41.000000000 +0900 +++ shogi_server 2004-05-25 14:54:04.000000000 +0900 @@ -416,6 +416,22 @@ end end + +def write_pid_file(pid) + File.open("/var/run/shogi-server.pid", "w") {|f| + f.puts pid + } +end + +def daemon + return if $DEBUG + pid = fork + write_pid_file(pid) + exit!(0) if pid + Process.setsid +end + if ($0 == __FILE__) + daemon main end
しばらくはtimeoutの時間を延ばしてもらわないと、 皆telnet使ってテスト中だし。 ついでに接続している人一覧表示とかあればイイ(・∀・) いきなりプログラム同士の対戦もやりにくいし、 これ使って人間同士の対戦からやってみたいね
>> 840, 848 とりあえず10秒から30秒に延ばしてみました DEFAULT_TIMEOUT = 30 # for single socket operation もっと延ばした方が良い?
LOGIN:OKが出ない理由を知りたくてRubyソースを読んでみた。 BEGINと一緒に出してるから対戦相手が来ないとLOGIN:OKが出ないんだね。 if (rival.socket.hello?(sprintf("LOGIN:%s OK\n", rival.name)) && rival.socket.hello?("BEGIN Game_Summary\n")) player.socket.hello?(sprintf("LOGIN:%s OK\n", player.name)) player.socket.hello?("BEGIN Game_Summary\n")
いまサイエンスゼロで世界コンピュータ将棋選手権の解説をやってる。 とりあえず、静大のTACOSがレポートの中心らしい。
将棋って世界中で知られてるのか? アメリカとかにも将棋って知名度高いの?
>>852 Yahoo!!GameにShogiがないところをみると知名度は低いでしょう。
>>852 低いと思います。
囲碁と違って、
一部のテーブルゲーム好き(or AIプログラマ)にしか
知られてないんじゃないでしょうか。
というのも、チェスのような特徴ある駒の形と違って
文字で駒を識別するため
アルファベット圏の人が漢字を見ると
文字の見分けがつき辛いらしいです。
アルファベットに置き換えた駒もあるようですが
深くやるとなると、文献が漢字のものがほとんどなので
手が出し辛いのがネックなんじゃないでしょうか。
そういえば子供のころ「全」みたいな成銀が苦手だった
56見てて思ったんだけど 持ち駒から指した時のプロトコルが見当たらない ちょっと、 どうなってんの???
857 :
◆R/rLuLKeEI :04/05/27 21:15
858 :
◆R/rLuLKeEI :04/05/27 21:23
859 :
◆R/rLuLKeEI :04/05/27 21:28
860 :
◆R/rLuLKeEI :04/05/27 21:30
861 :
◆R/rLuLKeEI :04/05/27 21:31
862 :
◆R/rLuLKeEI :04/05/27 22:35
面目ない。投稿できなかったと思って何度もやり直してしまった。他意はない。
863 :
◆R/rLuLKeEI :04/05/27 22:41
面目ない。投稿できなかったと思って何度もやり直してしまった。他意はない。
ここ見てる人でオリジナルの将棋AIが完成している人って結構いる? 強さはどうでもいいから。 なんか人が少ないような気がする・・・
865 :
デフォルトの名無しさん :04/05/28 01:15
>>864 よくわかんないっす。
将棋AIって、将棋のプログラムのこと?
人が少ないって、制作者が少ない、ここに来る人が少ない、ってこと?
>>865 将棋AIはプログラムが将棋を指すアルゴリズムの事を指して言いました
あと人が少ないってのはその制作者の人数の事です
作ってる人が多いなら俺も作ろうかなと思ってます
>>866 作ってますよー。
本業の合間がなかなかとれず遅々として進んでおりませんが。
現在の状況
・駒の動き(合法判定):作成中
・勝敗の判定:王手放置と投了のみ。詰まされたかどうかの判定は後回し
当面の目標
・MAN対MAN
・その局面の評価(先手優勢とか、そういうの)をCPUにさせる
とりあえず、ここまでできれば棋譜の通りに自分で駒を動かしてみたり
しながら楽しくなっていくかなあと。
対戦できるようになるにはまだまだかかりそうですけど、
詰み検索アルゴリズムは公開されている資料も多いし、
思考ルーチンも局面の評価が上手くできればそんなに大変な作業では
ないんじゃーないだろーかとか、楽観的に考えながらゆっくり進めようと
思ってます。
作っている人がどれぐらいいるのか、対戦できるレベルまで完成?させた
ものをいじっている人がどれぐらいいるのかは自分も気になるなあ。
>>866 自分も作りかけ。といってもモノは簡易手動 CSA クライアントなので
>>866 の
言ってるのとは違うけど。
元々フロントエンドは作ってたから、バックエンドを CSA 用にすげ替えるだ
けなんだけどなかなか時間が…orz
でサーバーは進化してるんだろうか? >>773氏はまだ居る?
とりあえず現状を整理しておこう 小物 サーバのログに日付と時刻 (842) Winからだと改行コードのせいで乱れる (843) daemon化してPIDを記録 (847) LOGIN:OKが出るのが遅い (850) タイムアウト関係 大物 WHOコマンド チャット その他 手動用のクライアント これくらい?
手動用クラ期待sage。 どんな感じだろう?telnet + α(コマンド一覧表示等) とか? 普通の将棋ソフトにプロトコル通信足したのとか
>>871 いる。土曜日にscratchからやり直す予定。
telnet接続 -> authコマンド -> 拡張モード(WHO, 対戦相手決定とか)
-> LOGINコマンド -> CSAモード(CSAプロトコル準拠) -> 勝敗決着
-> 拡張モード
telnet接続 -> LOGINコマンド -> CSAモード(CSAプロトコル準拠)
みたいのを考えている。
>>872 水曜日あたりに更新版出して、書き込んだつもりだけど、書き込めてなかった。
Winからだと改行コードのせいで乱れる (843)
CSAプロトコルが、改行をLFに規定しているので、どうしょもないのです。
この手の奴は、CRLFなのがよく聞く話だけど
daemon化してPIDを記録
個人的趣味により、当分はPID記録するけど、daemon化せずの予定
>>874 TELNET端末からのアクセスを正式に許すなら改行コードは両対応しないといけないですね
マッキントッシュも勘定に入れるとcrのみというのも有りだし
client -> serverの方は、 serverが寛大なのは通常問題がないので、現状でも、LF/CRLF/CRどれでもいいはずです。 server -> clientにしても、改行コードを選べるターミナルエミュレータを 使ってもらえれば、LFでも大丈夫だと思ってます。 CSAプロトコルから外れるのは、避けたほうがいいと思います。
WHOコマンドなどを取り入れたらすでにSCA上位互換ということになるので このさい改行コードの対応もぜひ(笑 こんな案はどう?、 接続後いきなりLOGINが送られてきた場合は相手はプログラムなのでLFで行く TELNETが相手の場合は一発目に改行を送ってもらってその改行コードを使う LOGINプロンプトなんかもだしちゃったらいいかも サーバープロジェクトが複数立ち上がるのがまずくなければ vb.netの勉強にちょうどよさげな題材なので WINDOWS版のサーバーを書いてみようかと思ってます でも773氏の気分がそがれるようならやめときます
>>877 なるほど。一発目のコマンドにあわせて送り返すのはいいアイディアかも。
> WINDOWS版のサーバーを書いてみようかと思ってます
> でも773氏の気分がそがれるようならやめときます
ぜひ書いてください。
>>873 あー、自分のブツは CSA frontend on Emacs なので縁がない人には全く縁が
ないかと…。
>>818 とか既存のコードを使えばもっと簡単に手動用クラはできそうだけど。
この路線で盛り上がってオープンな yet another 将棋倶楽部24 ができればと
妄想中。
鯖側は漏れも参加してみたいが、ruby分からないので辞退。 プロトコルの仕様を読むところからだけど、 既存のフリーソフトを自分なりに改造して ネット対戦版をつくっていきたいなぁと妄想
>>878 うい~、ではぼちぼちととりかかります
今日の成果、接続して送受して終了まで、なんと数行でかけてしまうというのがわかった
しかし、おぶじぇくとしこうがようわからん(笑
うにうに・・・、途中から素のVBへ逃げるかも
883 :
まともに動いていない ◆R/rLuLKeEI :04/05/29 12:58
実はtest56.jarを作りかけて773氏のが動き始めたのを知って止めたのが残ってたりする。
実は自分も鯖作りかけてたりする@Java
885 :
まともに動いていない ◆R/rLuLKeEI :04/05/29 13:25
>>884 因みに私のはLOGIN/LOGOUTだけのコンソールアプリなのにまともに動いてないので884氏に期待。
関係ないがEclipseはええよ。
>>885 いまんとこ同じようなもんです。
自分もコンソールアプリですけど…簡単なGUIでもつけた方が良いですか?
Eclipseは既に使用中。
名前とパスワード、32バイト以下なら2byte文字も使用可能にしないと駄目ですかな? 1対1プロトコルとサーバプロトコル、読み比べると2byte文字使用可能な様に読める… 1on1 “空白を含まない32文字以内の7ビットASCII文字列” server “空白を含まない32バイト以内の(略)文字列”
火曜日バージョンをアップします。
http://up.isp.2ch.net/up/f4e4e84035fe.zip ↓これは直したつもりです。
サーバのログに日付と時刻 (842)
LOGIN:OKが出るのが遅い (850)
pingに反応しないと切断するのも、止めました。
telnetした直後に、誰が接続しているか、表示されます。
(CSAプロトコル違反なので、次のバージョンでは止めます)
>>887 空白にはタブを含むのか
英数字以外の7ビットASCIIの扱いはどうなるのか
とか不明ですね。
漢字を通すにしても、文字コードが定められてないですし。
889 :
まともに動いてない ◆R/rLuLKeEI :04/05/29 16:53
>>886-887 将来Xサーバーを起動していないUNIX上でも使いたいので私のtest56.jarは意図的にコンソールアプリにしてます。
サーバーは8ビットスルーにしておくつもり。
でもログイン/パスワードだけ。
>>888 ども。クライアント作りに使わせてもらってます。
で、指し手に対する応答がちょっと変みたい。例えば telnet で
+7776FU を送ると
+7776FU^M,T10
みたいに指し手とカンマの間に CR が入ったのが返ってきます。
応答のときは str から CR を取り除かないといけないのかな。Ruby 詳しくな
いので報告だけですまんこ。
あ、telnet って CRLF で送るんだっけ。だから CR が付いてきちゃうのか。
規約どおり LF で送れば問題ないのかな(まだやってないけど)。ってこと
で
>>890 は気にしないで下さいませ(;´Д`)
>>891 サーバの受け取りは、CRLF/LF/CRなんでもいけるはずです。(つもり)
chomp関数が対応してくれるはずなので。
scriptの方を使っている場合はRubyのversionを教えて下さい。
1.8以降でないと、駄目だと思います。
>>892 なるほど、了解です。script の方を ruby 1.6.7 なマシンで動かしてました。
ruby 1.8.1 上でやったら確かに telnet からでも問題ありませんでした。
ちなみに 1.8 以降でないと駄目なのはこの改行コードだけの話ですか?
それとも他の機能も 1.8 以降でないとマズいですか?
>> 888 wdoor 更新しました
>>877 ふと思ったんだがウインドウズでサーバー作ってもライセンス料払えないなと・・・・
なんで自分で作ったサーバーソフトを運用するのにMSに金はらわにゃならんのか
なっとくいかね~
896 :
デフォルトの名無しさん :04/05/31 00:25
>> 888 クライアントのテストに使わせていただいてます。 END Position END Game_Summary が、送られてこないみたいですがなぜでしょう? ソースを見ても送ってないように見えます。
暑くて頭がまわんない・・・・・ ただいま室温35度・・・しむ
>>896 すみません。バグです。
>>893 今のところは、改行コードの問題だけだと思います。
今後は分かりません...
とりあえず簡単だけど手動対戦できるとこまでは完成。 もちょっと綺麗にしたらアップできそう。
>>898 了解です。1.8 の方でテストしていくことにします。
手指しや観戦用のクラに使う将棋板は駒の画像提供してくれる神は居ませんか~? あとテキストでうまく表現するアイディアとかも無いでしょうか? これがあればサーバーが面倒見ればtelnetだけで対局もできるかもと思ったのですが 漢字が上下逆に表示できたら簡単なのになあ
>>901 > あとテキストでうまく表現するアイディアとかも無いでしょうか?
将棋板を覗いてみるといいと思う。テキストだけでも充分表現できてるよ。
>>903 行ってきました
探し当てたのは ▽歩 ▲歩 ★歩 ってやつでした、ほかのはなかなか見つからなかったので
もしこっちのほうがもっといいというのがあったら教えてください
駒が横長になってしまうのに少々違和感がありますが(笑)しょうがないですよね
これ見て思いつき
歩> <香 って横向きにしちゃうのってどう?違和感ありすぎ?だよね(笑
C言語の初心者です なんとかTCP/IP接続が出来るので自分も参加したいと思ってます グラフィックがDOS画面で駒とか配置してるんだけど、 WINDOWSプログラミングって出来て当然なのでしょうか? 覚える事が多すぎてちょっと手を出す気が起きないのですが・・・
>>905 さんくす、いくつかダウンロードしてみました
ライセンス関係の記述が無いみたいですね
各自で入手してもらうようにすればいいのかな
>>906 windowsプログラムはCにこだわらなければVBなんかだとボタンやテキストボックスなどの部品を
ドラッグ&ドロップでペタペタと貼り付けていくと外見があっというまに出来上がってしまうので
非常に簡単に形になりますよ
ぶっちゃけ本質のとこだけコーディングすればいいので(ちょい誇張)非常にらくちんです
細かいことをいわなければ・・・(笑
>>904 縦長がよければ
歩
▽
▲
歩
でどうだろう。
へぼでよければ駒絵くらい提供できるけどね。
>>904 > 探し当てたのは ▽歩 ▲歩 ★歩 ってやつでした、ほかのはなかなか見つからなかったので
説明が書いてあったと思うけど★☆は最終手ってことね。
成駒は
成銀 "全"
成桂 "圭"
成香 "杏"
ってなカンジ。
> 歩> <香 って横向きにしちゃうのってどう?違和感ありすぎ?だよね(笑
相手側の駒 "v歩"
自分側の駒 " 歩"
ってのも使われてるよ。
>>913 >>相手側の駒 "v歩"
みましたみました、でも私的に非常に見づらかったので脳内却下してました(笑
>>912 皆が自由に使えるものを提供してもらえると非常にうれすいです~
>>906 用意されてるものを利用するほうが楽ちん。
CならたぶんBCBが楽。
たとえば、盤面にはTStringGrid(オブジェクトも格納できる表)
なんかを使って、盤面のクラス定義してメンバに一個もたして、
表示はなるべくTStringGridのメソッドを利用するようにしたり。