数値解析Ⅱ

数値解析Ⅱ
「オセロプログラムの作成」
班員
荒木
岸
倉田
長田
井口
元輝 (班長)
一大 (プレイヤー)
紳一郎 (アルゴリズム)
州平 (プログラマー)
雄太 (広報)
我々は過去に多くのチームが挑み続けてき
た「オセロゲーム」にとりくむことを決めた。
我々が目指す先は今日までに生み出され
た数多くのプログラミングを超える、最強の
オセロプログラムの制作である。
開発に基づき、我がチームはまず、個々の
役割を明確かつ詳細に分割することで作業
の効率化を図った。また、自由な発想が奇
抜で斬新な戦略を作り出すことを再確認し
た上で、多方面からオセロを分析することを
徹底し、作り上げた案をスムーズにプログラ
ミングに反映できる体制を構築した。
<使用したプルグラムソース>
工学社 「楽しく学べるJAVAゲーム・アプレット
>
(第3版)
以上のプログラムをまず班全員で作成し、プ
ログラマーがプログラムを解析、班全員でオセ
ロのルール調査及びアルゴリズムの検討した。
そしてプログラムの方向性を決め、元のプログ
ラムを改変して実際に動かし、新たな改善点
を見出す、ということ繰り返してより強いプログ
ラムを模索した。
<使用プログラム>
・ 人対コンピューターでオセロを行うプログラム。
JAVA Appletによるソースプログラムでブラウザ
上で動作する。
・ 必ず人間が黒で先手。人間が勝つと次のゲー
ムはコンピューターが白先手で始まり、コン
ピューターが勝つと再び人間が黒の先手をとる。
・ 途中終了のためのResetボタンと打つところの
ない時ようにPassボタンがある。勝敗は盤面が
すべて埋まった時のみ判断できる。盤面上が一
色または、双方が置けなくなった時はResetす
るしかない。
• 使用プログラムの構成
初期変数を読み込み、{ゲームの初期
設定}を行った後、{プレイヤーの石の置
き場所選定}→{ある場所に石が置ける
かどうかのチェック}→{コンピューターの
置き場所選定}→{ある場所に石が置け
るかどうかのチェック}を繰り返し、{ゲー
ム終了判定}で1ゲームが終わる。
・重要な変数として、盤面の場所指定のためのstone[x]という
配列がある。
左上から盤面に番号xをつけ、黒の場合は1、白なら2、ない
時は0をこの配列に格納する。
0
8
16
24
32
40
48
56
1
9
17
25
33
41
49
57
2
10
18
26
34
42
50
58
3
11
19
27
35
43
51
59
4
12
20
28
36
44
52
60
5
13
21
29
37
45
53
61
6
14
22
30
38
46
54
62
7
15
23
31
39
47
55
63
<わが班の基本方針>
・ コンピューターの石の置き場の選び方において、元のプログ
ラムソースのアルゴリズムは乱数によってランダムに置き場
所を指定し、{ある場所に石が置けるかどうかのチェック}を
通れば置くというものであった。しかし、これではまったく戦略
的ではなく、ランダムの置き場所指定が300回を超えるとパ
スしまうので、いい手悪い手の判断がただの運頼みになって
しまう。これでは強いプログラムになるはずがない。強いプロ
グラムの作成には置き場所をどう判断するかが、最大の課
題となる。
・ オセロを分析していく中で気付いたこと、それは有利な場所
と不利な場所があるということである。そこで我々は有利なと
ころには高い、不利なところには低いポイントを設定し、この
ポイントの高さに応じてコンピューターが置き場所を選ぶよう
なプログラミングを作成した。
<ポイント制プログラム>
・ポイント制のプログラムの要はポイントの設定である。ポイントの設定をうま
くすることで思い通りにコンピューターに打たせることが可能である。ここ
で有利な場所、不利な場所がどのような場所なのか考える。例えば、角
は重要な場所であると言える。よってより有効である場所に置くように、
基本の盤面ポイントをpoint[x]という変数配列を作りxに場所、変数として
以下の図のポイントを代入する。
50
5
40
40
40
40
5
50
5
5
15
15
15
15
5
5
40
15
30
30
30
30
15
40
40
15
30
1
1
30
15
40
40
15
30
1
1
30
15
40
40
15
30
30
30
30
15
40
5
5
15
15
15
15
5
5
50
5
40
40
40
40
5
50
• しかし、この固定されたポイント表を適用したままでは
不具合を生じる場合が出てくる。例えば、先ほどのポ
イント表に従うと、四隅と接する3マスは5ポイントと低
く設定されているが、
もしこの四隅に自分の石があれば、そのとなりに置
いても取られることはなく、むしろ置いておきたい有効
な手となり得る。
つまり、より強いプログラムを作るには、状況に合わ
せて有利になるよう‘変化する’ポイント表の存在が
不可欠となる。
そこで我々はプログラムの中にif文を取り入れることで
この問題を解消した。具体例をいくつか紹介したい。
<具体例>
(Ⅰ)・・・四隅を取ったらその周囲は有利である。 (+40)
つまり四隅の隣は、(もともとの5)+40=45となる。
○
(+40)
(+40)
(+40)
(Ⅱ)・・・たとえ端でも相手の隣には置きたくない。 (-15)
つまり相手の石の隣は、(もともとの40)-15=25となる。
(-15)
○
(-15)
(Ⅲ)・・・端から一つ離れた場所であっても、置くことでその列が
すべて自分の石になる場合は置く。
(+14) (+14) (+14)
●
○
○
○
●
●
○
○
●
●
●
○
また我々独自のプログラムに‘手数’に応じてポイントを変えるという
ものを加えた。以下に示す。
(Ⅳ)・・・終盤(手数が49手以上)対角斜めがすべて自分の石であるなら四
隅から一つ隣におきたい。
(+5)
(+5)
○
○
○○
○○
○
(+5)
○
(+5)
<ポイント制プログラムの考察>
基本的に相手のミスには自分が有利になるように打つ
プログラムであるため、的確にミスをついて来る。し
かし、今の段階では自分から有利な状況を作り出す
ことはできないので、相手が強い時は置き場が少な
くなり、不利な場所に相手より先に打たざるを得な
い状態になる。正直、まだ強いレベルではない。
結論として最強のプログラムを作るには、すべての盤
面の状況に対して最善の一手を打つように作れば
いいわけであるが、もしそれを作ろうものならプログ
ラムの数は天文学的な数となり、とても我々が作成
できる代物ではない。
オセロに限らず、ボードゲームでの強さとは、
目先の局面だけにとらわれず、相手の心を読
み、いかにして勝利というゴールにたどり着く
かである。その道のりには数々の駆け引きが
存在するため何手も先読みできるだけの想
像力が不可欠になる。現時点でのプログラム
にそれを理解させることは極めて困難である。
今回の課題を通じて感じたこと、それは人間
の「考える」という行為がどれほど複雑で偉大
で奥深いものであるか、ということである。