おまいら最強のリバーシプログラムしてみろよ part2 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/01/22 06:13:18
まずBearRevのDLLを作る
そして世界最強っぽいリバーシプログラムWZebraを倒すスレ
期間は三ヶ月以内で頼む
どんどんアイデアとプログラムを頼む

本格的リバーシ BearRev
URLリンク(www.vector.co.jp)

最強っぽいリバーシプログラムWZebra
URLリンク(www.radagast.se)

姉妹スレ おまいら最強の将棋プログラムしてみろよ part5
スレリンク(tech板)l50

2:デフォルトの名無しさん
07/01/22 06:19:51
>>1
乙get


3:デフォルトの名無しさん
07/01/22 06:24:17
前スレ

おまいら最強のリバーシプログラムしてみろよ
スレリンク(tech板)


4:デフォルトの名無しさん
07/01/22 06:25:15
ー\\ | | //:::::::|   ∠/       //          / ,' {
´ ̄`ヽ.| r/:::::::::::::|  //          / /           /-‐/、 }
<.´\ | /ノ 〉::::::|//    __    / /         /_..-‐/、ヽ!
::::::::\ Y「/:::::∠/     l⌒'⌒ヽ. i /        ,'  __/  ∨
:::::::::::: / /.::://|       ヽ   ||/ /⌒,>     |''" /'ヽ/
:::::::::::/ //(二二二.._'''ー-----つ_ノ_|.//  ノ     ___|ノ//       この映像をよーく見てほしい
:::::::::///:::::::::::::|    ̄/`フ ̄/''r―┴<二二ニヽ¬'∨            お気づきだろうか?
::::::./!/;:ヘ:::::::::::::|     //   /⌒!ヽ ..丶_.....\  / |ヽ
:::::/ / 〈,/::::::::::::|    ヽ`ヽ、⊃く-┘/´  厂  〈 | | / ̄`ヽ-、,r'
/∠/:::::::::::::::::::|   _____>∠/ / l⌒l  /    ヽjノ '⌒ ̄ ̄ ̄`!|
/⌒´::::::::::::::::::::::|/ ̄ ̄ ̄\_,r' 、/ヽ レ′         / ̄`ヾ}     そう葉っぱそっくりに
::::::::::::::::::::::::::::::::/ ─    ─ \.|ヽ_/            /''"´ ̄ソノ     擬態したやる夫が
::::::::::::::::::::::::::/  (●)  (●)  \.     .            __,/ '      隠れているのである。
:::::::::::::::::::::::::|    (__人__)    |     .   . ,. ‐..二ニ ---一'′
::::::::::::::::::::::::.\    ` ⌒´    /         //
::::::::::::::::::::::. . |-‐/ /   /  /         //                そこで今夜はこのような
:::::::::::::::::::::::::. ∨  〈  ヽ/  /|     / ./                 驚くべき能力を持った生き物たちの
:::::::::::::::::::::::::::::. ` ̄|`ー'"´ / ,' |   ,//        ,. ‐''" ̄ ̄`ヽ   世界へ皆さんを招待しよう


5:デフォルトの名無しさん
07/01/22 06:25:16
>>1 のやる気が感じれないので


        終了




6:デフォルトの名無しさん
07/01/22 06:26:12

これ以上くそスレ増やすなヴォケが


7:デフォルトの名無しさん
07/01/22 06:39:44
オセロプログラム作成の基礎知識
URLリンク(www.amy.hi-ho.ne.jp)
URLリンク(hp.vector.co.jp)
URLリンク(uguisu.skr.jp)
URLリンク(fujitake.dip.jp)
URLリンク(ray.sakura.ne.jp)
URLリンク(vivi.dyndns.org)
コンピュータオセロ界にブレイクスルーをもたらしたBuro氏の論文
URLリンク(www.cs.ualberta.ca)
オセロの試合結果は何通りか?@Wiki-関連スレ
URLリンク(www9.atwiki.jp)
海外製強豪プログラム(ダウンロード可・ソースコードあり)
URLリンク(www.cs.ualberta.ca)
URLリンク(radagast.se)
URLリンク(othellogateway.com)
URLリンク(cassio.free.fr)
海外製強豪プログラム(ダウンロード可・ソースコード無し)
URLリンク(abulmo.club.fr)
URLリンク(xoomer.virgilio.it)
URLリンク(www.herakles.tournavitis.de)
和製強豪プログラム(ダウンロード可・ソースコードあり)
URLリンク(www.kitsunemimi.org)
URLリンク(fujitake.dip.jp)
和製強豪プログラム(ダウンロード可・ソースコード無し)
URLリンク(www.amy.hi-ho.ne.jp)
URLリンク(www2t.biglobe.ne.jp)

8:デフォルトの名無しさん
07/01/22 06:44:37
リンクまとめといたからよかったら参考にして。
オセロに関して自分が分かる範囲ならできるだけサポートするよ。
おまいら期待してるぜ...

9:デフォルトの名無しさん
07/01/22 07:30:18
>>1

10:デフォルトの名無しさん
07/01/22 09:18:36
まだやってんの?

11:デフォルトの名無しさん
07/01/22 10:08:10
Ntestのソースを読んでみたが難しい・・・
誰か理解できる人居る?

12:デフォルトの名無しさん
07/01/22 10:08:15
>>7


13:デフォルトの名無しさん
07/01/22 10:23:15
NtestよりZebraのソースコードが比較的わかりやすいと思う。
ロジステロは変数名がドイツ語・・?

14:デフォルトの名無しさん
07/01/22 11:37:41
まだやってたのか、、、オレも参加、、いややめとこ

15:デフォルトの名無しさん
07/01/22 11:43:58
誰か一緒に>>7を参考にしてオーソドックスな技術を使って作りませんか?
言語はできればC(C++無し)で・・

16:デフォルトの名無しさん
07/01/22 12:10:56
>>15
一緒に何やるの?

17:デフォルトの名無しさん
07/01/22 12:16:46
リバーシプログラム作りだろ

18:デフォルトの名無しさん
07/01/22 12:21:38
一緒にコード書くの?
変じゃないか。
短いだろ。

19:デフォルトの名無しさん
07/01/22 12:24:26
一緒にやろうじゃなくて
やってくれの間違いだろ

20:デフォルトの名無しさん
07/01/22 12:27:46
書き始めたら難癖つけてくる奴がでてくるんだよ。
その方法じゃ遅いとか、変数名がわるいとか。

for使うなとかw

21:デフォルトの名無しさん
07/01/22 12:37:03
fore使えってことだな

22:デフォルトの名無しさん
07/01/22 15:49:35
思考する部分以外を誰かが書けばいいんじゃないの?
インターフェイスを決めていおいて、思考する関数は各人が書くと。

23:デフォルトの名無しさん
07/01/22 15:59:49
沈思黙考

24:デフォルトの名無しさん
07/01/22 16:01:53
それこそ>>1のBearRevでいいかもよ
ヘルパルーチンはそろってるし

25:1
07/01/22 19:17:45
1です
昨日はすみませんでした
寝てしまい間に合いませんでした
今日中も無理かもしれないですがいい出来になってきました
大改造に踏み切りました
全部グローバル変数にして重複して使いまわす事にしました
なぜならば、いい変数はコンパイラがCPUレジスタにセットしてくれるからです
その都度、生成するとメモリ上に変数が乗る可能性が高いです

26:1
07/01/22 19:20:14
コンパイラの最適化機能を発揮させるには、全部グローバルが基本ですよね

27:デフォルトの名無しさん
07/01/22 19:26:13
中途半端な知識で語らないで最適化云々は実証してから言え

28:1
07/01/22 19:34:38
まあ実際は、時間のかかる部分に、時間を食うので
メモリ上の変数でも、レジスタ上の変数を使っても大して速度に違いは出ないんでしょうけど
でも、もしかしたら何度も使う部分が一回あたり0.001秒くらい縮んだとすれば10万回呼んだとして
100秒短縮出来ることになります

29:1
07/01/22 19:39:31
プロファイリングの結果で最適化してくれるのは、何がありますか?

5つ入っているんでけど

マイクロソフト2005の無料版と、ボーランド2006の無料版と
VC++ver.6pro.とインテル無料版とボーランド5.5の無料版が入ってます

いつもは、快適動作のボーランド5.5を使っています

30:デフォルトの名無しさん
07/01/22 19:46:24
>>28
前から指摘されている通り、あんたの偏った頭で考えるよりもコンパイラの方が賢い。
最適化なぞ気にせずに先ずは動くものを作れ。

31:デフォルトの名無しさん
07/01/22 20:51:16
お前はもうこのスレの1じゃないだろ。
前スレの1だろうが。

32:デフォルトの名無しさん
07/01/22 20:52:05
>>25-26
また愚かなことを…

ローカル変数だろうがグローバル変数だろうが、コンパイラが利用計画を立てた上で
上手くレジスタにキャッシュするから、アクセス速度は違わないと思われ。
グローバル使い回しなんてやってもバグだらけになるだけで、百害あって一利なし。

>>28
1ループ1秒とすると、1日と3時間46分40秒が1日と3時間45分に短縮されるわけですね(w

33:デフォルトの名無しさん
07/01/22 21:20:06
変数はローカルでもグローバルでも構わないから
前スレの1は動くものができるまで書き込まないでくれ。

”動くものができるまで”、だ。


34:デフォルトの名無しさん
07/01/22 21:24:24
本気で強いのを作ろうと思ってる奴はおらんのか?

35:デフォルトの名無しさん
07/01/22 21:30:15
土日で作ってみたがWZebraの四手読みより弱かった…

36:デフォルトの名無しさん
07/01/22 21:31:46
乙。
アルゴリズムの解説してほしい。
それは公開しないの?

37:デフォルトの名無しさん
07/01/22 21:34:35
>>34
単にちょっと強いと言うのならともかく、最強争いに加わろうと言うのなら、
才能、それもきわめて稀有で突出した才能を持つ『たった一人』が必要。
正直、人の力を結集してどうにかなる問題ではないと思う。

38:デフォルトの名無しさん
07/01/22 21:40:17
>>37
才能より研究への情熱があれば蓄積された情報を活かして
かなりのところまでいけると思う。

現最強を最強たら占めているのは、才能とは思えんのだがどうなんだろう?

39:デフォルトの名無しさん
07/01/22 21:42:43
>>38
蓄積された情報なんて今さら漁ってどうすんの
本当の最強を目指すなら既成概念なんて百害あって一利無しだろう
必要なのは天災のひらめきだけで十分だ

40:デフォルトの名無しさん
07/01/22 21:43:47
>天災のひらめき
>1 の事ですか?

41:デフォルトの名無しさん
07/01/22 21:49:01

あなたはどんなところに「強さ」を感じますか?

私はじっくり長考した上で最善の手を打たれるよりも
さくっと秒殺で決定打を放ってくれる方が強さを感じます


42:デフォルトの名無しさん
07/01/22 21:51:25
>>39
今更あさるも何も膨大な記録を活かすって流れもないから何ともいえないんじゃね?


真の最強が完成したら、完全先読み初手投了になるだろうがそこに達するのが目標だろ?
本当に”最強”を目指すなら 定石探索、最善手探索、完全先読み、終盤解析のうち
一つ目と四つ目は意味がなくなるから、確かに圧倒的なひらめきも必要だと俺も思うが。

FTP archive at NEC
いくつかの文献とともに、IOS でプレイされたすべての棋譜(約500,000)と
コンピュータプログラムのLogistelloとKittyの対戦の棋譜(約100,000)を含む
棋譜データベースがある。
これらの棋譜データベースは強い評価関数を作るのに役立つ。



43:デフォルトの名無しさん
07/01/22 21:52:52

>完全先読み初手投了になるだろうが

引き分けになることが証明されているそうですが


44:デフォルトの名無しさん
07/01/22 21:54:13
>>43
まじで?ソースある?

45:デフォルトの名無しさん
07/01/22 21:55:06
>>43
証明されてませんよ。
引き分けの可能性が高いだけです。

46:デフォルトの名無しさん
07/01/22 22:11:27
人が思いつくような事はたいてい既に誰かに思いつかれてる。
問題を解決しようとすれば"蓄積された情報"を思いついてしまうから
"蓄積された情報"を避けるためにそれを知る事は重要。
天才ってのは知らずに運よくそれを避けられる人の事じゃないんだろ?

47:デフォルトの名無しさん
07/01/22 22:22:48
URLリンク(www.amy.hi-ho.ne.jp)
から飛べるような文献を適当に当たりながら流し読みしてみたが
オセロはやはり蓄積された情報を解析して手を打つのが全て。

強いプログラムを組むのには”発想”の余地があるかもしれないが、”強い”と”最強”は異なる。
複雑化した○×ゲームと考えると残るのは解析するための”効率”であり
前スレ1の時短縮はもっとも大事な因子である、やはり天才。

48:デフォルトの名無しさん
07/01/22 22:25:47
ようするに今>>1には最強のプログラムを作れないということはわかった。

だれか今から>>1より強いオセロ作ってくれ

49:デフォルトの名無しさん
07/01/22 22:27:27
>>46
だから馬鹿って言われるんだね

50:デフォルトの名無しさん
07/01/22 22:32:54
>>48
前スレ1が居なくなれば俺作るよ

51:デフォルトの名無しさん
07/01/22 22:36:50
>>47
   ∩___∩   ?     
   | ノ\     ヽ        |
  /  ●゛  ● | ?      |
  | ∪  ( _●_) ミ        .J
 彡、   |∪|   |   
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /



52:デフォルトの名無しさん
07/01/22 22:37:54
>>25
全部グローバル変数にしたら遅くなるよ。
ローカル変数は、スタックポインタからの相対位置で表せるので、
ポインタを介してアクセスするグローバル変数より速いのだ。
たとえレジスタにセットしてくれても、プログラム全域で保持すると
他の部分で遅くなってしまう。

53:デフォルトの名無しさん
07/01/22 22:41:29
>>52
スタックポインタからの相対アクセスもポインタアクセスだと思うが。
と言うかそれ以前にどのCPUの話?

54:デフォルトの名無しさん
07/01/22 22:42:05
>>51
すまん、ずーっと英語の文章を読んでいたので変な日本語になってしまった

結局は次の二つのことが言いたかった。
・最強=全ての事象を探索するしかない、
・強いプログラムと最強のプログラムはまったく違う。

55:デフォルトの名無しさん
07/01/22 22:51:26
>>53
1の開発環境はWindowsだと思うのでx86。
スタックポインタの場合、[esp-8]などと一発でアクセスできるが、
そうでない場合[eax]とアクセスする前にeaxにポインタを格納する手間が要る。
もしくは、eaxをポインタに占有されて使えるレジスタが減ってしまう。

56:デフォルトの名無しさん
07/01/22 22:52:43
何アホなこと言ってんの
ローカル変数なら最初から最後までレジスタに置いておけるけど
グローバルだとそうはいかん(メモリに書き戻す)から必ず遅くなる

57:デフォルトの名無しさん
07/01/22 22:54:03
>>56
その通りだが、俺が何か変なこと言ったか?

58:デフォルトの名無しさん
07/01/22 22:56:21
レス番つけろよ

59:デフォルトの名無しさん
07/01/22 23:02:03
>>レジスタが云々言ってる奴
スレリンク(tech板)l50
スレ違いだからこっちでやれ。

60:デフォルトの名無しさん
07/01/22 23:08:00
>>55
例えば mov edx,[MemAddress] と言う形式の指定方法があるので、
わざわざアドレスをレジスタにロードする必要は無い。

61:1
07/01/22 23:09:14
全部グローバルが鈍いなら、main()だけだったら速いでしょ?使うのはマクロだけで
書き換えたらバグだらけになったので、元のまあまあ動いたところからやり直すことにする
明日やることにする

62:デフォルトの名無しさん
07/01/22 23:11:38
まだアホな事言ってるし

63:55
07/01/22 23:14:23
>>60
>>59のスレでレスするよ。

>>61
その発想は俺にはなかった。さすがだ。
そのやり方では色々問題が出てくると思うが、がんばれ。

64:1
07/01/22 23:15:30
>>52
メモリの呼び出し速度が遅いってことなんだけど
より遅いのはハードディスクだけど
例えば、int型のデータ読むのに
メモリ100ms
ハードディスク1000ms
レジスタ5ms
とかかかるならレジスタを何度も繰り返し使った方がいいとおもうけど

65:1
07/01/22 23:17:59
インライン展開はループがあると出来ないってほんと?

66:デフォルトの名無しさん
07/01/22 23:19:37
メソッド呼出しとか、変数入出力のレベルの
スピードを気にするなら、アセンブラで組めよ

67:デフォルトの名無しさん
07/01/22 23:20:41
>>64
おいおい、世界初のCPUだってメモリ1アクセスに100ms もかからんよ。

68:デフォルトの名無しさん
07/01/22 23:21:05
わしもそう思う

69:デフォルトの名無しさん
07/01/22 23:27:39
>>64
レジスタを何度も繰り返し使った方がいいのは確かだ。
ただし、レジスタは少ないのでメモリアクセスは必ず必要になってしまうのだ。
なるべくメモリを使わないようにするという目的のために、
「全部グローバル変数にする」というアプローチは間違っていると言いたいわけ。

70:デフォルトの名無しさん
07/01/22 23:30:41
>>前スレ1
最適化も自分でやりたいの?
そういうのはやってやる、もしくはコンパイラがやるって言ってるのに。

71:デフォルトの名無しさん
07/01/22 23:30:53
ヒント:キャッシュ

72:デフォルトの名無しさん
07/01/22 23:39:46
前スレ1が何をしようともコンパイラの最適化には劣るし
オーソドックスに書かなければコンパイラの最適化を阻害する

73:デフォルトの名無しさん
07/01/22 23:40:08
どうせろくにプロファイリングもせずに、影響少ないとこばかりいじくるんだろうしなあ

74:56
07/01/22 23:40:45
>>55 スマンカッタ お前さん宛じゃなかったんだ
生温く見守っていようと思ってたんだが,我慢できなかった
今は反省してる

>>64
レジスタのアクセス速度は100ps(pは10^-12)のオーダー
メモリだと一次キャッシュにヒットすれば大差ないが
そうじゃないと大雑把に言って十倍〜百倍程度は遅くなる
ディスクなんて論外.使わないで済むようにコーディングしり

>>65
関数分けないと再帰呼び出しができないから
終盤の読み切りが書けなく(正確に言うとかなり書き/読み難く)なる

これは強いゲームプログラムを作るには必須っつーか常識レベルの
ハードウェアの知識だから>>1はもっと勉強汁

75:1
07/01/22 23:47:02
再帰はもともと使わない設計ですよ
再帰で深くいくと鈍くなったり動作不安定になりそうな気がするので

76:デフォルトの名無しさん
07/01/22 23:53:23
また責任転嫁してるし

77:デフォルトの名無しさん
07/01/23 00:01:33
>>75
>鈍くなったり
探索数が深度の指数関数的に増加するんだから当たり前。浅いうちから
鈍るならアルゴリズムが良くないのでは。

>動作不安定
バグが原因。バグの原因となってるものは前スレで散々言われたはず。
今までの調子で書いてる限り改善しないだろうね。

78:55
07/01/23 00:05:03
>>74
そうか。こっちこそ早とちりスマソ。


1のプログラミングスタイルはかつての俺で(笑)、共感は少しするが、
もうちょっと謙虚にスレ住人から情報を吸収して勉強するとか、
最適化を語るなら、速度も実測するなりして研究してからにしてくれ。

79:デフォルトの名無しさん
07/01/23 00:15:32
典型的な荒しの判別方法

都合の悪い質問をスルー



80:デフォルトの名無しさん
07/01/23 00:19:09
>>75
終盤の読みきりをどうコーディングするつもりなんだ?
深さは固定じゃないし,ループで書くと再帰よりぐちゃぐちゃした
コードになるぞ(自分でスタック管理しなくちゃならなくなるから)
再帰で書いて鈍く(これ意味が分からんが)なったり動作が不安定になる
なんてことは(バグがない限り)絶対無いから安心して再帰使え
再帰が今一つ理解できないんだったらもっと頭の汗をかけ
論理的な思考ができる人間なら必ず理解できるからガンガレ

81:デフォルトの名無しさん
07/01/23 00:26:20
処理速度の話は一番最後で良いような。
まずは正しく動くのを作るのが最初だろ。
動作確認しやすいように関数分けたり、処理を簡素化したプロトタイプ作れば更に良し。

82:デフォルトの名無しさん
07/01/23 00:36:38
>>81
それはさんざん言ってきたんだが無視されるんだよ

83:デフォルトの名無しさん
07/01/23 00:54:18
>>1見たいなやつが会社に入ってきたら自分の感情を抑えていられるかどうか…
殴ってしまいそうだww

84:デフォルトの名無しさん
07/01/23 01:41:40
まずはスピードを気にせずにちゃんと(思った通りに)動くものを作れ
それから全部捨ててデータ構造から速度が出る様に設計し直すのが
思考ゲームで強いソフト作る時の最短コース(急がば回れ)だ

85:デフォルトの名無しさん
07/01/23 01:57:57
>>1はプログラムは初心者だけど、アルゴリズムが頭にあるなら、思想があるなら
プログラムであーだこーだやって、早いだの遅いだのやるんじゃなくて、
(グローバル変数がなんだのレジスタが何だのそういう件はいらない)
プログラムについてはここのスレの意見を聞いて、
アルゴリズムをちゃんと完成させろよ。

今の>>1がプログラムについてなんか言っても、ここの人間には価値がない。
そもそもおまいはアルゴリズムが強いって言い出したんだから、そこを主張しろ。

86:デフォルトの名無しさん
07/01/23 02:07:56
>>85
アルゴリズムを完成させるも何も>>1は1ビットたりともアルゴリズムを変更する気はないと言ってる

87:デフォルトの名無しさん
07/01/23 02:19:39
912 :1 :2007/01/20(土) 13:36:06
評価関数を変更することにしました
枚数×2 + 空白の数
では、指せる手の数が増えすぎて幾らアルゴリズムが良くても計算不可能なようです

指し手の可能数と、マスの位置による点数を使うことにします

評価関数はアルゴリズムのうちに入らないのかな?
前スレ1は他人と違う言語をしゃべってるようだ。

88:デフォルトの名無しさん
07/01/23 02:25:18
>>1の言ってるアルゴリズムが、最適化のことだったらワロスww

89:デフォルトの名無しさん
07/01/23 02:47:58
>>88
ああ、なるほど。そう考えるとしっくりくるね。
でも最適化技術をとことん使っても解けるような問題じゃないのにね。

90:1
07/01/23 06:57:30
思考ルーチンには、再帰は使ったらいかんと思います
スタック管理をパソコンにまかせて自動処理させると危険なんです
予め必要なメモリ領域を確保しておいてループで書くのが王道でしょ

91:デフォルトの名無しさん
07/01/23 07:02:22
>>90

そんな事は、無い。
当然だが、スタック管理は人間よりPCにまかせたほうが、安全
なるだけ難しいとこは、PCにまかせて、シンプルで保守しやすい
コードを書くことこそが、真の王道



92:デフォルトの名無しさん
07/01/23 07:10:55
危険とか王道って、どっからそんな思い込みが出てくるんだ

93:デフォルトの名無しさん
07/01/23 07:28:38
>>92
>1の偏りきった脳味噌から。きっと>1はいつも斜めに傾いで座っているのだろう。

94:デフォルトの名無しさん
07/01/23 07:31:10
どこまで深くなるかがあらかじめわかってるのだから
再帰でも問題は無いよ

95:デフォルトの名無しさん
07/01/23 07:36:06
王道も何も知らない無知の癖に王道を語ったらいかんと思います
お前のようなカスが書いたプログラムが危険なんです
無知は無知らしく識者の言うことを聞くのが王道でしょ

96:1
07/01/23 08:04:44
オセロだけではなく、将棋と囲碁に応用する目的があるんです
最大500手くらいあったらどうなんでしょうか?


再帰呼び出し

ある種の複雑な問題を解くコードをシンプルに記述できる場合があるが、
再帰による入れ子の数に応じて占有するメモリが増加する上、
実行速度も効率的とは言えず、非再帰的に記述できるならそうすべきである。

URLリンク(e-words.jp)

97:デフォルトの名無しさん
07/01/23 08:09:35
そんなもの知ってる
お前じゃない

98:1
07/01/23 08:10:19
再帰は確実にインライン展開が出来ず、その都度、宣言されている変数の確保と
関数呼び出しのオーバーヘッドがかかるんです だから鈍い

99:デフォルトの名無しさん
07/01/23 08:13:01
>>98
>再帰は確実にインライン展開が出来ず、
ループもインライン展開できないとか書いてただろ、お前

だいたいループにするって言っても、どうやるの?
自分でスタック用意するのか?

100:1
07/01/23 08:15:28
当初から、再帰は一度も使っておらず(これは初めから一貫していました)
手数と、読みの深さごとに必要な領域を確保しています
パスも含めて128手分とってあります

101:デフォルトの名無しさん
07/01/23 08:17:29
そんなのソース見たから知ってる
だからどうした?
何が言いたい?

102:デフォルトの名無しさん
07/01/23 08:17:41
インライン展開できてるかどうかくらいは確認してるんだよな

103:1
07/01/23 08:42:19
それはしてません
でもとにかくループがいいんです
わかってください

104:デフォルトの名無しさん
07/01/23 08:50:58
残念
sageちゃ駄目なんだ

105:1
07/01/23 09:27:14
同じ事繰り返すんだけど、どうやったら直るかわかる?
今日はしばらくパソコン触れないのでうpしてみる
まだ変数名とかプログラムはわかりにくいままですが

URLリンク(up2moe.moe.hm)

106:デフォルトの名無しさん
07/01/23 09:34:04
わかりやすいプログラムになったら皆見てくれるよ

107:デフォルトの名無しさん
07/01/23 09:34:15
「直る」って何?
どうなればいいのかも言わずに何言ってんの。

108:1
07/01/23 09:37:21
直る=深く探索するです

今の時点では、強いかどうかではなく同じ探索を繰り返さないようにしたいんです

109:デフォルトの名無しさん
07/01/23 09:48:20
128とか255とか、境界値のあたりがあいまいだからだよ
そんなんでよく再帰がどうのとかいえるな

110:デフォルトの名無しさん
07/01/23 10:00:43
>>1は知った知識をむやみに口に出したがるんだな。
それがたった一部の悪い所にもかかわらず、よい部分を知ることもなく
検討もしない。

すべて自分の思い込みで、自分がいいと感じた(たまたま最初にいいと思った)
方法しか使わない。

再帰が遅いとかいって使わないし、読みにくくなるだけなのにグローバル変数乱用したがるし。
プログラムの王道はわかってないようだな。

そもそもそんな馬鹿みたいにメモリ使うプログラムが速いとは思えないが。
スラッシングで遅くなるぞ

111:デフォルトの名無しさん
07/01/23 10:04:09
URLリンク(up2moe.moe.hm)
直ったよー

112:デフォルトの名無しさん
07/01/23 10:20:59
>>111
仕事はえぇぇええええw
俺もやってたが、foreの展開までしかいけんかったww

113:デフォルトの名無しさん
07/01/23 10:23:53
>>111
remove()とcupu()は関数にするだけじゃだめだ。ビルドしてないだろおまい

114:デフォルトの名無しさん
07/01/23 10:30:20
リファクタしようと思ったら発狂しそうになった

115:デフォルトの名無しさん
07/01/23 10:30:23
マクロを展開するだけならプリプロセッサでできるね

116:1
07/01/23 10:35:34
うまく動かないのは、mtd()だけであとは正常動作をしていると思われます

117:デフォルトの名無しさん
07/01/23 10:36:09
>>111
プリプロセッサ通してコードフォーマットかけた
>>113
はい、やってません。

118:デフォルトの名無しさん
07/01/23 10:43:21
>>117
アンカー>>112だった。
>>113
コンパイル通した。
remove()とcupu()はとりあえずマクロに戻した。
URLリンク(up2moe.moe.hm)


119:デフォルトの名無しさん
07/01/23 11:05:40
>>103
「でも」「とにかく」
これダメプログラマの言い訳の典型だな
大昔のFORTRANじゃあるまいし,再帰の利点が理解できないんじゃ
アルゴリズムの良し悪しが云々できるレベルじゃない
きちんとしたプログラミングの教育を受けてないみたいだが
取り敢えずプログラミング作法とプログラミング書法辺りは読んどけ
後,雑誌の記事とか友人から得た知識は捨てろ

120:デフォルトの名無しさん
07/01/23 11:08:20
>>119
いや・・>>103は偽者だから・・
でも言ってることは正しい

121:デフォルトの名無しさん
07/01/23 11:10:42
も一個
プログラムの最適化に関しても勘違いがある
プログラムの実行時間の90%以上はコードの極一部に集中する
だからそこだけ頑張って他は読み易さ/改良のし易さを優先する
全体をインライン展開しようなんてのはアホのやること 1%も変わらん
兎に角,お前が考え出したアルゴリズムの正しさの確認が最優先だろ?
そのためにプログラムにして実際に動かすんだから
正しいかどうかが分かってないうちから最適化に手間かけるたら二兎を追うものになってしまうぞ

122:デフォルトの名無しさん
07/01/23 11:13:22
>>120 そうなの?<偽者
まぁどっちでもいいや

123:デフォルトの名無しさん
07/01/23 11:14:22
だめだこいつ new して delete してない
はやく何とかしないと

>>121
>正しいかどうかが分かってないうちから最適化に手間かけるたら二兎を追うものになってしまうぞ
俺もそう思う


124:デフォルトの名無しさん
07/01/23 11:18:12
>>1 にはこれを読むことをすすめておく
URLリンク(www.pro.or.jp)

125:デフォルトの名無しさん
07/01/23 11:21:04
あとさぁ、最適化にこだわるんだったら何でC++使ってるわけ?

126:デフォルトの名無しさん
07/01/23 11:22:26
>>124
俺もそれ見たことある
それに出てくる悪い例でも1のに比べたらはるかにいいと思う

127:デフォルトの名無しさん
07/01/23 11:24:18
確かに、再帰は末尾再帰にしない限りこういう用途では使うべきではないと思う。

128:デフォルトの名無しさん
07/01/23 11:25:55
>>125
hashtable の初期化が面倒なだけじゃね?あれはC++と言ってもほとんどCだ。

129:デフォルトの名無しさん
07/01/23 11:26:57
>>127
今は(未だ)そういうレベルじゃないよ。

処で、>1の使っている糞コンパイラは配列のインデックスにcharを使っても警告出さないの?
アセンブル出力見れば判るが凄く無駄なコードを出力する原因になっているんだけど。

130:デフォルトの名無しさん
07/01/23 11:30:53
遅くても良いから動くコード書いてください
動くコードができたら、アルゴリズムを考え直しましょう
アルゴリズムを考え直したら、書き直しましょう
その連続です。
最適化はコンテストの直前にするものです。

131:デフォルトの名無しさん
07/01/23 11:44:27
>>前スレ1
MTDって亜流がいっぱいあるんだけど、どれを参考にしたの?

132:デフォルトの名無しさん
07/01/23 11:48:39
msu()、charの参照なんて無意味なものを引き数にしている。
serch()、何このtypo。
mtd()、ddが未使用。
adress()、xhは未初期化でアクセスされることない?

133:デフォルトの名無しさん
07/01/23 11:49:07
void fn(char t){
  char i,bnn[64];
  for(i=0;i<64;i++){
    if(bt[wb[t][i/8][0]][i%8]==1)printf("●");
    if(bt[wb[t][i/8][1]][i%8]==1)printf("○");
    else printf(" ");
    if(i%8==7)puts("");
    //初期化しておく
    bnn[i]=0;
    if(bt[wb[t][i/8][2]][i%8]==1)bnn[wz[i]]=1;
  }
  puts("");
  for(i=0;i<64;i++){
    if(bnn[i]==0)printf(" ");
    else printf("*");
    if(i%8==7)puts("");
  }
  puts("");
}

グローバル変数が何の目的で使われてるのかわからんのが多すぎ。

134:デフォルトの名無しさん
07/01/23 12:02:06
よーし、俺も俺も。

inline void serch(char w)
{
  if (w == 97)
  {
    z = 97;
    goto EE;
  }

中略...

  z = 97;
  EE:
  ;
}

return; 使えよw

135:デフォルトの名無しさん
07/01/23 12:08:56
if (mode[tsu[1]] == 1) {
mode[tsu[1]] = 0;
mode[tsu[1] + 1] = 1;
goto GG;
}
if (hash[x].a <= g) {
if (g <= hash[x].b) {
GG:
;
if (kar[tsu[1] + 1] < 1) {
if (kt == 0) {
hmove();
}
move();
goto BB;
}
}
}
すげぇ、ifブロックに飛び込んでる。

136:デフォルトの名無しさん
07/01/23 12:18:41
ちょっとロジックを追おうと思って、cupuマクロで使っているremove()マクロを見たら、
gotoしている先が別のforループの中だと知って諦めた。

137:デフォルトの名無しさん
07/01/23 12:20:40
これは、もう
2重以上のループからでるとき以外go toは使うなと
指導すべきタイプの人やね。

138:デフォルトの名無しさん
07/01/23 12:24:33
違うよ


リアルだと絶対に関わりたくないタイプの人だよ。

139:1
07/01/23 12:30:40
わかりやすくするために頑張ってオブジェクト指向プログラムに書き換えますよ
待ってて下さい!

140:デフォルトの名無しさん
07/01/23 12:45:11
とりあえず分かった範囲だけ書いてみる。

bt[a][b]
    意味:        a の、下から b ビット目の値
    代替記法:    ((a >> b) & 1)
wb[t][y][c]
    意味:        ビット詰めされた盤面
                  c は色で 0:黒 1:白 2:何もおかれていない
                  y は盤面の縦座標(0〜7)
                  t は不明
zw[x+y*8]
    意味:        座標で指定された手の優先度。ban の写し。

wz[n]
    意味:        nで指定された優先度の手の座標。zwの逆引き
we[n]
    意味:        3のn乗
ch[n]
    意味:        0:黒、1:白として、色の入れ替え。もしくは論理反転。
    代替記法:    (1-n)
F
    意味:        たぶん現在の手番???
zi[p]
    意味:        縦座標(y)の値。
    代替記法:    (p/8)
zj[p]
    意味:        横座標(x)の値。
    代替記法:    (p%8)

>1 は、最低限これらを全て分かりやすい名前に書き換えるべし。

141:デフォルトの名無しさん
07/01/23 12:49:23
>>139
待て。
俺たちが手直しするまで何もするな。
手直しが終わってからそれを元に書け。

142:デフォルトの名無しさん
07/01/23 12:51:27
どうしてこんなに面白いの?

143:デフォルトの名無しさん
07/01/23 13:00:43
>kar[0] *= (0.9 + (double)(cr / (10 * (1001))));
これ、10010で割るのは整数でいいの?

144:デフォルトの名無しさん
07/01/23 13:04:13
これは、ネタの傾向からみて、
引退した爺さんプログラマーがネタで
ドキュソを演じてるんじゃないかなぁ

145:デフォルトの名無しさん
07/01/23 13:05:43
>>139
余計なことすんな。
書き換えとかしなくていい。今のおまいのレベルじゃ読みやすくなる保証は皆無

どういうものを作りたいのか俺たちに教えてくれればいいんだぜ

146:デフォルトの名無しさん
07/01/23 13:26:05
たしかに{}の入れ具合とか、初めてにしちゃできすぎ

147:デフォルトの名無しさん
07/01/23 13:43:09
一文字変数の所為もあって、ループ制御変数と一時変数の名前がぶつかっていたり、
酷いのはグローバル変数とも名前がぶつかっていたり。
取り敢えず、レガシースタイルは諦めて「使う場所での宣言」にしないとどうしようもない。
最低限、グローバル変数は一文字名前禁止だな。

148:デフォルトの名無しさん
07/01/23 13:49:12
>>139
lp、li、lj、ba の意味が分からないので解説頼む。

149:デフォルトの名無しさん
07/01/23 13:55:55
>>148
//周囲のマスとのインデックス差
char lp[8] = {1, 9, 8, 7, -1, -9, -8, -7};
//周囲のマスとの縦座標の差
char li[8] = {0, 1, 1, 1, 0, -1, -1, -1};
//周囲のマスとの横座標の差
char lj[8] = {1, 1, 0, -1, -1, -1, 0, 1};
だと思う
ba ってあったっけ?banの事なら
//コマのおいてあるところは1
unsigned char ban[64]=
{
0, 48, 12, 4, 5, 13, 49, 1,
55, 56, 40, 32, 33, 41, 57, 50,
19, 47, 28, 20, 21, 29, 42, 14,
11, 39, 27, 64, 64, 22, 34, 6,
10, 38, 26, 64, 64, 23, 35, 7,
18, 46, 31, 25, 24, 30, 43, 15,
54, 59, 45, 37, 36, 44, 58, 51,
3, 53, 17, 9, 8, 16, 52, 2
};
この順番で着手を試すらしい。


150:デフォルトの名無しさん
07/01/23 13:57:48
lp[n] = li[n] * 8 + lj[n]
この関係式が成り立つっぽ

151:デフォルトの名無しさん
07/01/23 13:59:54
あ、main()の中にbaってあったね。
よくわからん。

152:1
07/01/23 14:02:20
>>lp、li、lj、ba

+が現在位置としてlが下の番号のときに
lp(l) は、z (=8*x+y)での移動位置
li(l)、lj(l)は (x,y)座標での移動位置

567
4+0
321

baはテンポラリでbf()()を生成するときに使用

bf(番号0)(z) zに対して通常の座標を返す
bf(番号1)(z) zに対して左右反転の座標を返す
bf(番号2)(z) zに対して左に90度回転した座標を返すなど

153:デフォルトの名無しさん
07/01/23 14:03:41
>>149-150,152
dクス

154:デフォルトの名無しさん
07/01/23 14:10:56
>>1前スレ1
MTDの解説サイト教えて。
お前が見たところ。

155:1
07/01/23 14:14:24
>>154
Research Re: search & Re-search
URLリンク(www.cs.vu.nl)

156:1
07/01/23 14:16:03
>>154
MTD(f), a minimax algorithm faster than alpha-beta
alpha-beta法の改良の1つであるMTD(f)についてのページ。
MTD(f)の他、置換表付alpha-betaの実装についても書かれています。
また、彼のPh.D ThesisであるResearch Re: search & Re-searchは
様々なゲーム木探索の手法について詳しく述べたもので、一読の価値があります。
URLリンク(fujitake.dip.jp)

157:デフォルトの名無しさん
07/01/23 14:24:54
あぁこれか。
前にざっと読んだ事ある。

158:1
07/01/23 14:30:13
でも、使っているのはMTDサーチではないですよ

>>135の部分ですが、

a <= 予測値 <= bならば確率が残っている範囲で指し進めるモードと、
確率が残っていたら指し進めてあとでa <= 予測値 <= bのチェックを行う
2つのモードがあります 深さでは探索を終わりにはしません

159:1
07/01/23 14:34:25
名付けるとMTD(f , r)サーチですかね

160:デフォルトの名無しさん
07/01/23 14:38:46
>名付けるとMTD(f , r)サーチですかね
rは何の意味?

161:1
07/01/23 14:40:25
>>160

r = 局面の予測された実現確率
f = 局面の予測された評価値

162:1
07/01/23 14:43:36
将棋では、大駒や金銀を取る手の実現確率の予測はしやすいという点があります

163:デフォルトの名無しさん
07/01/23 14:48:52
r=realizability?
なるほど。
やりたいことは大体わかった。

164:デフォルトの名無しさん
07/01/23 15:53:50
BASICで書いた方がいいよ>>1

165:デフォルトの名無しさん
07/01/23 15:54:22
>>1次からコメント入れるようにしてね

166:デフォルトの名無しさん
07/01/23 16:17:21
>>164>>165
1にそういうことを言っても無駄だと思う。
なぜそうした方がいいのかを何とかして理解させる必要がある。
自分が間違っていると思わない限り、1はいつまでも我が道を行くだろう。

167:デフォルトの名無しさん
07/01/23 16:17:40
>>163に期待

168:デフォルトの名無しさん
07/01/23 16:22:49
そもそも2chでスキルもない癖に自分専用スレを平気で立てる時点でもうアウト

169:デフォルトの名無しさん
07/01/23 19:12:34
優れた人は何も言わずにモノだけ出すからな
スレ立てて騒ぐ奴に限ってろくなものを出さない

170:デフォルトの名無しさん
07/01/23 22:25:03
1は人の意見を真摯に聞くべき。
煽りじゃないよ。
会社でも1人で突っ張ってんの?
これが正しいんですとか言ってたらだめだよ。

171:デフォルトの名無しさん
07/01/23 22:25:59
>>139
わかりやすくするんなら、オブジェクト指向じゃなくて構わないので
関数の分割と、変数名の変更と、利用すべきところでの再帰の利用
をして欲しい。

172:デフォルトの名無しさん
07/01/23 22:28:14
ヒント:オブジェクト指向だと遅いw

173:デフォルトの名無しさん
07/01/23 22:33:41
>>170
ヒント 小学生

174:デフォルトの名無しさん
07/01/23 22:36:12
>>172
ヒント:覚えたての知識をひけらかしたい

175:初心者
07/01/23 22:42:27
if (mode[tsu[1]] == 1) {
mode[tsu[1]] = 0;
mode[tsu[1] + 1] = 1;
funcA();
}
else if (hash[x].a <= g && g <= hash[x].b) {
funcA();
}


funcA()
{
if (kar[tsu[1] + 1] < 1 && kt == 0) hmove();}
move();
goto BB//糞;
}


176:デフォルトの名無しさん
07/01/23 23:29:38
最適化とかは動くものができてからの話なわけで

177:デフォルトの名無しさん
07/01/23 23:40:35
>>176
>>1は質の高いアルゴリズムによる高速化と、最適化による高速化がごっちゃになっているのかもしれない

178:デフォルトの名無しさん
07/01/24 00:04:10
ここまで来るとただの馬鹿だな
根拠の無い自信でつっぱねるだろうが

179:デフォルトの名無しさん
07/01/24 00:36:33
配列の先頭とそれ以外で用途が違うから読みにくい

180:デフォルトの名無しさん
07/01/24 01:14:36
>>1さん 俺は弱いリバーシしか作ったことないけれど、
実現確率が正確に求まるとは到底思えない。矛盾してないかい。
自分的には確率使うなら囲碁のモンテカルロ法とかのが
ずっと良さそうな気がする。
URLリンク(www.geocities.jp) (加藤さんの翻訳)

181:デフォルトの名無しさん
07/01/24 01:59:10
>>前スレ1
お願いだから将棋に帰ってください。
これ以上リバーシを冒涜しないでください。
スレリンク(tech板)

182:1
07/01/24 02:35:27
まだ、人の意見を取り入れられるところまで行ってないんです
根本的にまともに動作してないのに、体裁だけ整えてあとは他人に任せるとかは駄目でしょ?
まともに動作したらより良くするために意見をどんどん取り入れますよ

>>175
if (hash[x].a <= g && g <= hash[x].b) は、ifを分割した方が速度が出るとおもいますよ

>>180
実現確率を正確に求めてないんです
評価値順に手を並び替えて一手目50%、二手目25%とか半分づつにしているんです
評価値の高いものを深く読むということに使っているんです

183:デフォルトの名無しさん
07/01/24 02:40:18
速度が出るとおもうじゃなくて
実際出るかどうかだろ?

184:デフォルトの名無しさん
07/01/24 02:43:39
>実現確率
>一手目50%、二手目25%
適当にこんな数字決めてないでMPC使えばいいじゃん

185:1
07/01/24 02:44:27
>>183

if(A) if(B) { C; }の方が、if(A && B) { C; }より演算数が少なくなるため
速いおもいますが 実際にはやっていませんが...どうなんでしょうか?

186:1
07/01/24 02:47:05
MPCとはなんですか?

187:デフォルトの名無しさん
07/01/24 02:49:12
>>185
URLリンク(www.st.rim.or.jp)

188:デフォルトの名無しさん
07/01/24 02:50:07
>>186
URLリンク(www.cs.ualberta.ca)

189:デフォルトの名無しさん
07/01/24 02:53:01
前も同じリンク教えたのに読んでなかったのかよ

190:デフォルトの名無しさん
07/01/24 02:53:35
今の段階でアドバイスしてる多くは、より良い動作を実現させるための助言じゃなくて、
まず動かすための、プログラムを見易くするためのアドバイスが多いと思うんだけど、
まともに動かせるように助言してくれてるのに、あえて無視してるのか?まぁなんてことでしょう!

191:デフォルトの名無しさん
07/01/24 02:55:13
>if(A) if(B) { C; }の方が、if(A && B) { C; }より演算数が少なくなるため
>速いおもいますが 実際にはやっていませんが...どうなんでしょうか?
そう思うのは勝手ですが、そんなゴミを垂れ流さないでください。
A && B と書いたとき、Aが偽だとBは評価されません。
つまり、 A && B はif (A) B と概ね等価になります。
>187のリンク先の下の方を参照してください。

192:デフォルトの名無しさん
07/01/24 02:59:14
コンパイラの最適化でもそういうとこってうまいことやってくれるんでしょ?

193:1
07/01/24 03:00:51
>>188
ありがとう読んでみます

ifはわからないのでrand()を使って実験してみる

194:デフォルトの名無しさん
07/01/24 03:01:21
取り敢えずのゴールは
>>1の考えるアルゴリズム積んだリバーシを動かすこと」
(WZebraを倒すとかは取り敢えず後回し)

「アルゴリズムは完成した」 (前スレ>>190での、>>1の発言)
「考えているアルゴリズムに変更の余地はない。その動作を正確に実現するコードを作るだけ」 (前スレ>>806での、>>1の発言)

現状として、
>>1はコーディングが出来ない (または、限りなく下手)
そして、このスレには>>1のアルゴリズムは知らないが、コーディングを出来る人が揃っている。



何故>>1が 「アルゴリズムの概念だけを公開して、コーディングは他人に任せよう」
と思いつかないのか、そしてそれを指摘されても無視し続けるのか、理解出来ない。 (←以前誰かが指摘してた気がする
「数学やってる」っていってるくせに、三段論法とか知らないのかな?
まあ論理学出来てる人にも見えないが……

195:デフォルトの名無しさん
07/01/24 03:41:36
>>185
てきとーに測定してみた。

a=0, b=0: if(a && b): 1.0 clocks, if(a) if(b): 1.0 clocks
a=0, b=1: if(a && b): 1.0 clocks, if(a) if(b): 1.0 clocks
a=1, b=0: if(a && b): 2.0 clocks, if(a) if(b): 2.0 clocks
a=1, b=1: if(a && b): 4.0 clocks, if(a) if(b): 4.0 clocks

どっちも同じだね。

196:1
07/01/24 03:59:40
もしかしたらまとめた方が速いかも....
実験では同速度だったけど
分岐予測を当てやすくさせるためにはまとめた方がよさそう


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5105日前に更新/194 KB
担当:undef