コンピュータ将棋を作成する上で、適しているコンピュータ言語(開発環境)を教えてください。
1.有料無料問わず、一番適していると思われる言語は何だと思いますか?
2.フリーの言語で、一番適していると思われる言語は何だと思いますか?
3.開発がしやすく、動作速度等、バランスが良さそうなフリーの言語を教えてください。
4.言語の違いをわかりやすく教えてください。
いずれか1つの質問にお答えいただいてもかまいません。
URLは、言語のサイトか、比較サイト等、関連深いURLを入力してください。
コメントは言語と、それを選んだ理由を記入してください。
自信がなくてもかまいません。
たくさんの回答をお待ちしています。
初期ポイントはMAXで、URLとコメントの質により、独断で配分します。
質問はすぐに終了しませんので、じっくりと回答していただいた方が嬉しいです。
http://homepage1.nifty.com/Ike/usapyon/
「うさぴょん 〜将棋を革命する力を〜」
ここの例ではC++ですね。
基本的に思考アルゴリズムを言語にフィットするように直すだけだと思いますのでCでもJavaでもはてはBrainfuckまで何でもかけると思いますw
でも将棋じたいではLOGがのびたり、よそうしない手を打たれたりしたときの処理が簡単なようにすくなくともC++クラス以上のオブジェクト指向言語のほうが楽でしょう。
ウェブページなどで動かすのでしたらJavaで組むのがらくでしょうし、一般的アプリケーションとして組むならC++やC#などある程度ユーザーが多ければ使いやすいとおもいます。
http://d.hatena.ne.jp/yaneurao/20060105
やねうらお−よっちゃんイカ(ry - コンピュータ将棋の進歩5
ここに載ってる本も参考資料としては優秀かとおもいます
http://bach.istc.kobe-u.ac.jp/prolog/intro/
Introduction to Prolog (in Japanese)
私が開発を依頼されて選択するとして、将棋そのものをProlog、ASPとしての通信インタフェース、MMIをJAVAで、設計でDBを使う場合はC系列で作成します。
Baku7770様、回答ありがとうございます。
Prolog:AI用言語ですかー
初めて知りました。
勉強してみます。
http://www.computer-shogi.org/wcsc15/
$@Bh(J15$@2s@$3&%3%s%T%e!<%?>-4}A*<j8"(J</p>
このページの[参加チーム]の所をクリックしてみてください。
世界でトップの将棋プログラムを競う大会で、使われている言語はC++が圧倒的に多いので、やはり向いているといえます。
�����ԥ塼���������ϸ��ηǼ���
この掲示板には日本でトップレベルのコンピュータ将棋プログラマーが集まっています。
初心者が書込んでもわからないことは親切に教えてくれます。
コンピュータ将棋に関する情報が非常に豊富なページです。参考にしてみてください。
コンピュータ将棋に関する情報を詳しく知るためには専門書を読むのが近道です。
http://www.computer-shogi.org/enter.html
$@%3%s%T%e!<%?>-4}6(2q$N0FFb(J
コンピュータ将棋協会の会員になると専門的な資料が手に入ります。
入会しても大会や例会に参加をしなければいけないというものではありません。
http://www.computer-shogi.org/
�R���s���[�^��������
jyouseki様、回答ありがとうございます。
やはり、C++ですかねー
何故、C++が有利なのか答えられる方、いらっしゃいますか?
コンピュータ将棋に関する情報を多数紹介していただき、大変参考になります。
http://esearch.rakuten.co.jp/rms/sd/esearch/vc?sv=30&v=2&...
【楽天ブックス】 の検索結果:本/オンライン書店
『コンピュータ将棋の進歩5』という書籍を私は読みました。この中で「TACOS」という将棋ソフトは、ライバルソフトの「激指」開発チームが考え出した「実現確率打ち切りによる探索アルゴリズム」を採用したところ、飛躍的に強くなったとあります。
コンピュータ将棋の開発者は「いずれはプロ棋士に勝つ」という共通の目的を持っているために、ライバル間でも画期的アイディアを惜しげもなく提供するようなことが行われています。
他の人の考えたアイディアを自分のソフトに実装しようとした場合、言語は同じである方が安易なのは当然ですね。
そんなわけで多くの将棋プログラマはC++を使っているのでしょう。
将棋の必勝法解析がもしできたら、世界に推定数百人いる将棋プログラムの開発者の存在意義がなくなります。
昨年の「コンピュータ将棋選手権」で全勝優勝した「激指」は東京大学大学院の研究室で開発されています。日本で最高レベルの頭脳の持ち主が何人も何年かけて進化させてきたソフトです。それでも完全解析は、遥かに遠い目標です。
それだけの高い壁を越えるには、どの言語がいいかではなく、ハードも言語も開発できるくらいの実力が必要ではないでしょうか。
http://www.jaist.ac.jp/~t-hashi/TACOS/
コンピュータ将棋 TACOS のホームページ
http://www.logos.t.u-tokyo.ac.jp/~gekisashi/index.html
$B>-4}%W%m%0%i%`!V7c;X!W$N%Z!<%8(B
jyouseki様、再回答ありがとうございます。
素人プログラマの考えですが、探索アルゴリズムは、どの言語でも記述できるのではないでしょうか?
言語の違いは、記述のしやすさや、処理速度の違いに表れるのではないでしょうか?
私は、必勝法の探求が目的であって、思考ルーチンの開発だけにはおさまりません。
もちろん、ハードの開発ができる立場なら、それを検討する可能性もあります。
ただ、実績がありませんので、実績を積むのが先ですね。
私が一生かけて取り組みたい夢です。
ハードの性能が急激に上がるのであれば、必勝法は100%解析できます。
最低でも、自分のプログラムが自分の棋力を超えるところまでは到達したいですね。
http://www.benedict.co.jp/Smalltalk/talk-21.htm
歴史上最大のチェスゲーム 〜ディープブルー〜 /週刊スモールトーク
>何故、C++が有利なのか
C/C++が選ばれがちな最大の理由は、C/C++コンパイラで生成したコードが、多くの場合最も
計算速度が速いからでしょう。
C/C++のコーディングは難易度が高く、プログラム技法に手をとられてアルゴリズムに
集中しづらいという欠点があります。
しかし将棋やチェスのアルゴリズムでは「計算量の爆発」が起こることが用意に推測できますから、
限られた時間内で次の一手を出さなければならないゲーム用としては、GUIはともかく演算は
C/C++ということになると思います。
http://homepage2.nifty.com/Fujimaki/download/Comparison/
主な開発ツールの数値計算速度比較
各言語・ツールの速度については比較しているサイトがいろいろありそうです。
Motamota様、回答ありがとうございます。
Visual C++が高速みたいですね。
他にも同意見や違う意見を募集します。
http://public.research.att.com/~bs/
Bjarne Stroustrup's Homepage
主に「3.開発がしやすく、動作速度等、バランスが良さそうなフリーの言語を教えてください。」に答えます。
私は、やっぱりC++言語を推します。
s-timeさんはスピードを中心的な懸念として、実行時効率とその他の事柄のバランスと言う視点をお持ちの様子です。
「非常に優秀なプログラマが開発にあたる場合」に限定すれば、実行時効率を追求することに関してアセンブリ言語が他の高級言語より優れていることは疑いようがないと思います。
しかし実際には、高級言語の処理系(特にコンパイラ)には優秀なものが多く、へぼなアセンブリ言語プログラマが書いたコードよりも並みのプログラマが高級言語で書いたコードの結果のほうが優秀な場合もしばしばです。
そんな訳で、開発効率とか保守性とのバランスを考えると、よほどの場合を除いてはアセンブリ言語は開発環境の第一候補にはなり得ないと思います。
一般論はそれで良くて、このテーマ(将棋)だとProlog辺りとかも魅力的かも知れません。
しかし、ちょっと概算してみると、このテーマはもしかすると「よほどの場合」に該当するかも知れないと思えて来ました。
兎も角、アドレッシングする必要がありそうなデータ量が膨大なのです。
膨大なデータ量に対抗するため「究極の効率を求めてアセンブリ言語」と言いたいところですが、アセンブリ言語ではやはり問題ありと思います。
(1)概算して出てきた数字を見るに、多分、現在手に入るようなコンピュータでは必勝法に辿り着けません。
⇒取り敢えず今日手に入るコンピュータで探求を始めて、何度かコンピュータを乗り換えて探求を進めることになると思います
⇒するとアセンブリ言語では移植性が問題なので、せめてC言語と言えます
⇒C言語はポータブルアセンブラとも呼ばれており、そこそこ優秀なプログラマが開発にあたる限り、アセンブリ言語に対して殆ど実行時効率のペナルティはありません。(C言語でもアセンブリ言語に対して実行時効率のペナルティが不当に大きくなる問題領域もありますが、このテーマなら多分問題にはならないと予想します)
⇒C言語は他の高級言語に比べるとコンパイラの作り込みが簡単なので、及び人気があるのでコンパイラの提供が優先されるので、次々と最新のコンピュータに乗り換えて行こうとする状況にも適していると思います。
(2)概算して出てきた数字が馬鹿でかいので、多分、現在手に入るようなコンピュータでは扱いづらいと思われます。
⇒将棋の盤面で取りうる局面の数が「2の32乗」とか「2の64乗」とかよりも少ないなら、全ての局面をフラットにアドレッシングすることが(現在手に入るようなコンピュータで)素直に出来るのですが、どうもそうは行かない様子です。
⇒C言語で組み込みの整数型の範囲を超えるような局面にそれぞれIDを振ろうとすると、とてもややこしいコードを書く羽目になります。その辺をC++言語のクラスで隠蔽すれば開発効率の面で有利と言えます。
⇒C++言語は「ベターC」と呼ばれており、そこそこ優秀なプログラマが開発にあたる限り、C言語に対して実行時効率のペナルティは全くありません。
⇒次々と最新のコンピュータに乗り換えて行こうとする状況に鑑みても、C++言語コンパイラはCコンパイラの次くらいには提供されると期待出来ます。
以上のような理由から、開発効率と移植性、実行時効率のバランスがとれたC++言語を推す次第です。
将棋(日本の将棋と思います、以後いちいち断りません)は、上記URLで使われている用語で言えば「ゼロ和2人の完全情報ゲーム」ですから、多分必勝法が存在する筈です。(先手又は後手が必ず勝てる)
将棋のルールでは元々引き分けは定義されていない(ゴメンナサイ、公式なプロの将棋のルール上引き分けがないかどうかは確認出来ませんでした。常識的に知られている範囲では引き分けの状態はないですよね?)ですし、日手に関するルールも(繰り返しの内容で)無限に差し続けることを許さず・必ずシロクロつけるように気を使った内容になっていますので、必勝法はきっと存在します。
必勝法を探求する上で、全ての局面を洗い出す必要があります。
大雑把ですが、全ての局面を識別するのに充分な整数範囲を考えてみます。
取り敢えず、9×9=81マスの盤面と持ち駒置き場のために38マス(将棋の駒は40個、玉と王が持ち駒になることはない)が存在するものとします。
38 + 81= 119
この119マスのうちのどこか40マスに駒が置いてある筈です。(C:コンビネーション)
119C40 = 76.37123216…×10^30 ※1
うげげ、この時点で「2の128乗」よりも遥かに大きいです。
119マス中の40マスに40個の駒を並べる順列組み合わせを計算します。(P:パーミューテーション)
40P40 = 815.9152832…×10^45 ※2
それぞの駒には上下の向き(先手の所有か、後手の所有か)及びうらおもて(例:歩とト)の4通りがあります。(^:べき乗)
4^40 = 1.20892582…×10^24 ※3
※1,※2,※3をの積だけの整数範囲があれば、将棋の全ての局面にIDをつけられます。
大きすぎて掛け算する気になれません。
上記の計算では「18枚の歩を区別する必要はない」とか、「持ち駒置き場の38マスはフルに区別しなくて良い」とか、「明らかに有り得ない局面(1一に歩があるとか)」を無視していますが、あまり複雑にすると局面のID番号から実際の駒の配置を連想するのが難しくなってしまいます。
もうちょっと絞り込む余地はあると思いますが、それでも膨大な局面があって「2の128乗」でも効かないのは確実じゃないかと思います。
※説明がへたっぴぃな殴り書きで済みません。
http://www.cbook24.com/bm_detail.asp?sku=4797328541
C++の設計と進化 コンピュータ書籍専門ネット書店 cbook24
ベターCと言う呼び方について、ネットワーク上の拠り所を探している最中に目に止まった、書籍の紹介ページです。
私、買いたくなっちゃいました。¥4,000-か。
ポータブルアセンブラと言う呼び方について、念のため拠り所を探しました。
最近はポータブルアセンブラと言うと別なものを指すことが多い様子で、C言語のことをそう読んでいる事例はここしか見つからなかったのでした。
http://www.borland.co.jp/cppbuilder/freecompiler/
Borland C++Compiler 5.5無償ダウンロード
おっと、フリーのツールを紹介するのを忘れるところでした。
私がWindowsをターゲットにアレするときの主力ツールです。
http://www.borland.co.jp/cppbuilder/freecompiler/turbodebugger.h...
Borland Turbo Debugger 5.5無償ダウンロード
デバッガもフリーで利用できます。(登録は必要)
Kityo様、回答ありがとうございます。
すばらしい回答です。
言語以外に、場合の数にまで言及していただいて・・・
C++で決まりそうですが、質問の自動終了まで、回答を募集します。
http://ja.wikipedia.org/wiki/%E6%89%8B%E7%B6%9A%E3%81%8D%E5%9E%8...
プログラミング言語一覧 - Wikipedia
>C++クラス以上のオブジェクト指向言語は他にどんなものがあるでしょうか?
URLを参照してみてください。いろいろあります。
また、独自の高級言語を作ってから将棋のアルゴリズムを実装するということも考えられなくはありません。
ただ、いかに質問者さんのライフワークといえども、一人の人間でできることには限界があります。
過去の資産やコミュニティを有効活用する上でも、特定のプログラム(将棋アルゴリズム)で
多数派のものを選択するのがベストと思われます。
これまでの回答から、C++ですね。
>ウェブページで動かして、データ収集をしようと思っているので、Javaになりますかね?
何らかのシステムを開発するにあたり、まず検討しなければならないのは
どのような実行環境で動作させたいのか?なので言語以前に次のことについても
考えてみてはいかがでしょう。
- ハードウェア(PC/Mac/etc..)
- OS(Linux/Windows/etc..)
- 仮想マシン(JavaVM/.NET Framework)
- ネットワーク環境(スタンドアロン/Internet/etc..)
上記の殆の回答は言語そのものについて考察されていますが、
質問者さんの実現イメージが伝わり切っていないように感じます。
もし、ブラウザ上で動作させたいのなら、
- Javaアプレット
- ActiveX(IE限定)...言語はVC/VBくらいが妥当
- Javaスクリプト
- VBスクリプト(IE限定)
くらいしか使えません。
将棋のプログラミングについて素人ですが、私の提案するシステム構成は、
UI部 ........ ブラウザ上でDHTML+Javaスクリプト(AjaxによるWebアプリケーション)
Webサーバ部 ..... Javaサーブレット(Apach+Tomcatアプリケーションサーバ)
アルゴリズム部 ... ネイティブコンパイル可能なC++(JavaからJNIで呼び出し)
OS部 ............. Linux
DB部 ............. OSで動作可能なものなら何でもOK
ハードウェア部 ... マルチコアCPU搭載のLinuxサーバ
といったWebアプリケーション構成はいかがでしょうか。
ポイントは、アルゴリズム部分はネイティブなC++でチューンナップして、
マルチスレッド可能なアルゴリズムを実装し、CPU増強により高速化が期待できるようにする。
たとえば、CELLプロセッサなどのマルチコアCPUが普及した場合に、格段に速度アップが期待できる。
参考 : CELL
http://www.atmarkit.co.jp/fsys/zunouhoudan/069zunou/cell_bladel....
UIは基本的には流行があるので、現在流行しているAjax構成を適用し
ブラウザ上で動作可能でかつ使いやすいUIを実装する。
参考 : Ajax
http://blog.goo.ne.jp/twinkle_555/e/634b1bb99c62384aec7db150fc91...
上記の構成なら、ほとんどのクライアントで動作し、かつサーバの増強やソフトウェアの改良にも
柔軟に対応できると思います。
以上
ToMmY様、回答ありがとうございます。
プログラムは何でもかけるとは思いますが、その中で処理速度の速いものや、かきやすいものや、配布がしやすいものや、データベースとの連携がとりやすいものや、投資金額が少ないものを探しています。
コンピュータ将棋の本やサイトの紹介も参考になります。
C++クラス以上のオブジェクト指向言語は他にどんなものがあるでしょうか?
ウェブページで動かして、データ収集をしようと思っているので、Javaになりますかね?