おまいら最強の将棋プログラムしてみろよ part6
おれも
>>500と同意見。
結局、相手の思考を予測するってのは、自分の思考に自信が無い時の小手先の対策なんじゃね?
>>498-499 相手のアルゴリズムを読んだとしても、その相手はこっちを騙すためにわざと気付かないふりをして
弱く見せかけているのかもしれないぞ
相手を見て判断するのは対人戦での面白さを出すには重要なとこではあるけどさ
>500-501
人間のトッププロにはなかなか勝てない(全体的な実力では上回れない)
からこそ、そういう戦略に価値があるのでは?
例えばコンピュータ将棋は詰みのある局面でそれを発見するのが
やたら速いが、相手(人間)もそうだと仮定していたらその利点は
あまりうまく生かせずに>498の挙げたような状況に陥るかも知れない。
詰みを正確に速く見つける能力がむしろ弱みになってしまう。
>502
特定の相手の指し方を事前にじっくり研究していたらどうかな?
たとえば対渡辺竜王を想定して。
ディープブルーも実はカスパロフの指し手を事前にたっぷり研究して
相手の指し方のモデルを持ってたと言う話だし。
>>503 個人的には、そういう方向性が好きなのだが、
こと「プロに勝つ」という目的においては、
>>500が正しいと思う。
というか
>>503の方法でプロに勝つには、とてつもないプログラム技術と
ハードウエア能力が必要になって現実的でない。
プロに勝つというのは、ほっといても100年後には達成できるけど、
楽しめる、指導してくれる、というコンピュータ将棋が今後の課題やね。
>504
その考えが甘いとしたら。
つまりコンピュータが人間のトッププロより圧倒的に強くなると言う事は
相手がどんな指し手で来てもそれに対して正しく応手できると言う事だが
将棋と言うゲームがそう御しやすいもので無いとしたら厄介だぞ。
その可能性は多いにある……と俺は思う。
それよりは対戦相手のモデルを持っておいて相手の思考の癖(隙)を突いて
序盤からジワジワ優位を築いて行く方がまだ望みがありそうに思える。
確かにセコイ方法だけどなw。
>>505 確かに俺の考えが絶対に正しいとは言えないが、
相手モデルとかでプロに勝てるなどというのは
とんでもなく甘い考えだと思う。
>>505がセコイ方法だとは全く思わない。
実現できたら本当に素晴らしいが、実現が難しすぎる。
507 :
デフォルトの名無しさん:2007/10/23(火) 02:07:42
{41, 85, 45, 12, 02, 77, ・・・} (これがひとつのデータです) という可変長データが複数あるとします
これらを効率よくメモリに記録するにはどうしたらいいですか?
508 :
デフォルトの名無しさん:2007/10/23(火) 02:08:36
場所まちがえました すみません
あんまりセコクない対人戦略だと、
短時間の勝負ほどコンピュータ有利であることを考えて
時間攻めがいいんじゃないかな?
極端な例だと、80台パソコンを連結して並列に先読みさせる。
可能な相手の指し手が80ある局面なら、人間の思考時間に全部考えて、
ほぼノータイムで指すこともできるはず。
そうされると持ち時間2時間でも、正味1時間位に感じるんじゃないかと。
あるいは、"少しよくなるけど局面を単純化する手"より
"よくもわるくもならないけど局面を複雑化する手"を優先する方針にする。
そうすると選択肢が多くなり、人間側の読み筋から外れる率が高くなる。
人間の場合かなり前から現在の局面のことを考えているので、
先読みを空振りさせた場合の負担は、コンピュータよりずっと重いはず。
一から考え直すことになって、かなり苦しくなるじゃないかな。
竜王と対戦したボナンザも、予測読みが当たればノータイムで指した。
また、ボナンザは人間なら早期に枝刈りしてしまう手を指すこともあったので
読みを空振りさせるという点でもそれなりにできていた。
80台のパソコンというリソースがあるなら、普通にやらせても強くなるから
下手な小細工では意味がないということになると思う。
いや、、アイデアを否定してばかりであれだが、
実際そういうアイデア自体は貴重だし、生かしていくべきだと思う。
ただ、それはすごく難しい(だからこそ素晴らしい)と言いたかった。
511 :
デフォルトの名無しさん:2007/10/23(火) 10:27:47
相手の指しやすい手から調べるのはかなり有効な手法だよ プロの棋譜、定跡を使うのはその為
個人に限定してもよい
>>510 持ち時間1時間として
コンピューターが3回に1回ノータイムでも、1時間つかいきれば
人間側の思考時間は、自分の持ち時間と合わせて2時間ある
コンピューターが全部ノータイムの超早指すると
人間側の思考時間は、自分の持ち時間の1時間しかない
読みを空振りさせる回数が3回位増えると
1回あたり数分位とられるから10分くらい損する
ぜんぜん違うと思うんですが‥
結局、80台を良い手を捜すためにつかっても、2割位しか
最前手が変わらないなら、時間攻めで人間が間違うのに
かけた方がお得なように思うわけで
実際、複数台での並列先読みや、局面の複雑度を測ったりするのは、
相手の指し手の傾向をつかむより遥かに容易じゃない?
自分のプログラムはまだ弱いのでそんな段階ではないけど。
誰か人柱にならないかなあ。
台数が80倍になると、一般的に思考時間を9倍にしたくらいの強さになる。
つまり、思考時間:1分、強さ:1台9分相当を選択するか、
思考時間:0分、強さ:1台1分相当を選択するかという問題になる。
(人間が常に同じ時間を消費するという前提)
コンピュータよりも人間の方が持ち時間の価値が高いことを利用するわけだ。
悪い手は切り捨てて愚直に80手読まないようにするなどの工夫もできる。
そうなると普通の予測読みとの境界がぼやけてくる。
俺は、通常の予測読みがいいと思う。俺も実測してないのでこれしか言えない。
あの自演犬やってないと言い張ればいいと思ってるな
バレてないと思ってるのは自分だけだぞw
ああ?おお?
将棋のプログラム作っている人の開発環境が気になります。
VC6++っていうのは古いでしょうか?
将棋ならコンパイラやIDEは関係ないと思うが、
VC2005EEがある今、VC6を使う理由がない。
519 :
デフォルトの名無しさん:2007/12/04(火) 08:33:00
VC++6は軽い
VC++6ってインテリセンスのだいぶ貧弱だったような
まぁ、x64がコンパイルの出来ないでいいならVC++6でいいんじゃね。
VC++6はバグが多くて嫌
つーか、>518を読んでどうしてそういう結論になるのか判らん。
まぁ、VS6の正規ユーザで尚且つ時代遅れのPCを使っているというなら止めないが。
525 :
デフォルトの名無しさん:2007/12/07(金) 00:45:10
VC6は2004にバージョンアップ版が出ている
新しいVistaつかうより、バージョンアップされたXPの方がいいということもある
仕事じゃなければ好きなのを使えばどれでもいいさ
VC6なぜか人気あるが自分の経験から言うとあまり印象よくないな。
特に付属のSTLかなりバグがあってひどかった。
今となってはかなり古いコンパイラだから
テンプレートのサポートが微妙だったりするけど
自分の使い方では2003よりもよかったよ
インストール早いし、起動軽いし
STLはSTLPORTいれて使うもんだと思ってる。
そんな私も2005に移行しましたが。
529 :
デフォルトの名無しさん:2007/12/14(金) 14:21:23
VC6の怖いとこは
一見するとコンパイル通って正常に動作しているようでも
トンデモな解釈をコンパイラがしている箇所があったはず。
std::cout << typeid(1.0F==1.0F).name() << std::endl;
std::cout << typeid(1==1).name() << std::endl;
仕事だからVC6とかいう発想は
無責任もいいとこ。
まともなコンパイラの機能テストをしていれば
Noob以外はそのような発想はしないでしょう。
ぼ、Borland C++ Builderは? いいの?
USIプロトコルの info コマンドって、minmax探索に偏ってるね。
MC+UCTだと info string ばっかになりそう。
もうちょっと融通利かせないとUSIプロトコル使う意味なす…
>>531 setifnomenuコマンドなんてのが必要かもね。
setinfomenuだった。
info pvで「最後のモンテカルロシミュレーションの手順」でも送ってやればいいんじゃね。
GUIがちゃんと対応出来るかどうかは知らん。
最強じゃなくてもいいからだれか大局将棋実装しておくれw
やるからには最強を目指す!
ところで大局将棋ってナニ?
ごめん、やっぱムリ。
てか、駒の動かし方全部把握してるヤツ居るのか、これ?
仮に把握できたとしても、動かす気になれねぇ。
スレを立てるたびに貼る必要はあるのか…
最長の地位を保つための儀式なのか…
こんなのランダムに動かしてれば人間の方が飽きて投了するだろw
大局将棋はゲーム性が低いな
ゲームと言うより占いの儀式みたいなものだったって聞いたような気がした(うろ覚え)。
>>537 テレビ番組で、プロ棋士同士が対局してたな
駒の動かし方は本を見ながら確認してたw
1日では勝負がつかず、3日くらいかけていたと思った
トリビアだな
森羅万象棋作ろうぜ
「バーサーカーソウル!」
市販の将棋強すぎだろ。なんか将棋もプログラミングもやる気ナクナタ・・・
おまいが弱いだけ
前回のGA見てみろ。やる気沸くぞ。
554 :
デフォルトの名無しさん:2008/01/17(木) 07:02:17
もっとこのスレ盛りageようぜ
C言語でやってる人いる?
C++の方がいいのかな?
557 :
デフォルトの名無しさん:2008/01/20(日) 14:56:43
C++の方がいい
部分的にC言語やアセンブラも使える
558 :
デフォルトの名無しさん:2008/01/27(日) 14:07:14
スレッド使ってますか?
559 :
デフォルトの名無しさん:2008/01/28(月) 16:28:29
使ってますがなにか?
もう、ブルージーンで最強のチェスプログラムできちゃったので将棋プログラムは興味ないわ
門外漢がよーいうわ
作ってる人近況報告してよ
強化学習してる。死にそう。
いちから作り直してる。
565 :
563:2008/01/28(月) 21:01:55
>>564 ばかやろう、俺なんてマイナスからの出発だぞ。
566 :
564:2008/01/28(月) 21:16:24
>>565 なんだよ、マイナスってw
以下、マジレス。
おとといのUSIエンジンの登場でモチベーションがかなり上昇した。
弱くても、勝てなくても、笑われても、それでもいいからとにかく形にすることに決めたよ。
>>566 ランダムざしに負けるのがマイナスじゃね?
俺も強化学習やってる
俺よりは強いんだが・・・
569 :
563:2008/01/28(月) 23:20:41
パソコンぶっ壊れたから修理するところから。
あと、部屋が汚くてどこに本があるか分からないから掃除するところから。
>>567 負けそうだから怖い。
>>568 出現頻度の低いパラメータって学習が遅くね?
なんか対策考えないとなぁ。
>>570 自分は出現頻度が低いパラメータは保持したまま
別のパラメータが変わるような局面に分岐させたりしてる
ちなみに効果の程は測ってないけど
7五玉で投了
>>571 なるほど、賢いなぁ。
俺は猿だから対局数でごまかそうかなっと。
れさライブラリ使ってる人いる?
あの! Delphiで将棋作るとC++より速度遅いですか?
576 :
デフォルトの名無しさん:2008/02/07(木) 16:07:46
ボーランド製品ならどう速度だろ
あの! Delphiで将棋作るとVisual C++より速度遅いですか?
578 :
デフォルトの名無しさん:2008/02/07(木) 16:16:26
最適化や個人の技術によるが同程度ならVCの勝ち
579 :
デフォルトの名無しさん:2008/02/09(土) 21:48:35
あの! Delphiでインラインアセンブラだけで将棋作るとC++より速度遅いですか?
並列化のことで何年か前にYSS掲示板で議論になってましたけど
すごく初歩的な話なんですがrootでsplit(分割)する/しないってのは
どういう意味だったんでしょうか?
最初の深さ1だけは読んで、そのそれぞれの(1手読みの)手を並列化するのが
「rootでsplitする」でいいのかな?
しない、ってのはどういうことなんでしょう?
YSS掲示板で訊いた方がいいんじゃね?
あまりに初歩的すぎかなとおもって・・・
真面目に質問すれば大丈夫
あ,ここより将棋板の方が人(実際に作ってる人)が多いから
そっちでもいい alternative だったか,開発者用のスレがある
32bitパソコンを使ってますがintでなくcharを使うと
メモリの節約にはなるが速度は遅くなるのですか?
メモリアクセスが減るから速くなるケースもあるかもしれません。
要は、一概には言えないのでテストケースを充分絞って実験してみることです。
587 :
デフォルトの名無しさん:2008/02/11(月) 14:21:17
char や floatが遅いというのはデマ
キャッストに時間がかかるというのはデマ
へぇ〜今調べて自己解決しますたと言うところだったんですが
一概に言えないのですか。へぇ〜
そりゃそうだろ。メモリ2GB程度のパソコンごときで1G件のデータを扱おうとしたら
charじゃないとswapしまくりで遅くてしゃぁない。
将棋では1Gも使わないでしょう。
ところでYSSの人は配列は2のべき乗にすると速くなると言ってますが
みなさんそうしてるのですか?
591 :
デフォルトの名無しさん:2008/02/11(月) 15:22:57
それはデマ スワップが発生しないように最低限の確保が速い
へぇ〜デマばっかりなんですね。
今のパソコンと将棋ソフトでスワップはないと思いますが。
でもそう言うには相応の理由があると思いますが、
実際に実験してないけど理論的には速いはず、というところでしょうか。
593 :
デフォルトの名無しさん:2008/02/11(月) 16:07:36
512や1024ならスワップ起こるよ
OS、ほかのプログラムが動いているとハッシュテーブルがメモリ外に出ることがある
するととても弱くなる
たとえばボナンザで実験するとわかる
>>580 rootでA,B,Cと候補手があるとして
BやCの評価値の評価値を並列に探索して求める場合はrootでsplit。
Bの評価値が確定してからCを探索する場合はrootではsplitしていない。
>592
デマというか、ハードウェアとかコンパイラに依存するので時代によって……
>>594 ありがとうございます
>BやCの評価値の評価値を並列に探索して求める場合はrootでsplit。
というのは直観的に理解できそうです
rootでとりあえず指し手を列挙してみて
おらこれとこれとこれがあるから行ってこいやぁ、みたいなw
でも
>Bの評価値が確定してからCを探索する場合はrootではsplitしていない。
というのがよくわかりません
この場合、どこで並列処理(並列化)をしているのでしょうか?
Bにも子供たちが…
てことは……
深さ0(? 現局面のこと)で指し手を列挙して
おのおのの指し手について並列するのがrootでsplit
深さ0で指し手を列挙したあとその指し手の1つをまず取り出して
そこからの指し手(深さ1以下の指し手)について並列するのがrootでないsplit
ってことですか?
実際の方法論としては
たとえば候補手が50個並んでいて
CPU1が候補手aを、CPU2が候補手bを読んでいって
先に終わったほうが候補手cを読む……という「仕組み」自体はいっしょで
それをrootでやるかそうでないかだけが違う(というかYSS議論では違ってた)
ということでしょうか?
>>598 深さ0で指し手がA0、B0、C0と3つあるとすると、今のプログラムは
A0の手を調べるのに全体の50%の時間を使ってしまいます。
そこで、A0の探索が終わった後に、B0、C0の2つの手を並列に探索します。
その方がA0の探索の結果を使えるので効率がいいためです。
A0の手の下にはA01、A02、A03の3つの手があるとすると、
A01の手を調べるのにこれまた50%の時間がかかります。
そこで、A01の探索が終わった後にA02、A03の探索を並列に行います。
こうやって延々続いていきます。
深さ0でも並列に探索するのが「rootでsplit」で
深さ0でのみ並列に探索しないのが「rootでsplitしない」です。
「rootでsplitしない」場合でも深さ1、深さ2、、、、ではsplitします。
並列化ド素人の自分だが
Aspiration searchの真ん中の値で二分すれば
単純に二倍速くなりそうという感じは受ける。
ちょっと試せないので分からないけど。
ボナンザも歩の交換値2つぶんでAspiration searchをやってるらしいので。。
やっぱり問題はその次からの一回の探索を分ける方法だねえ。