SCENE RESEARCH STATION  
with my everyday
thinking-and-doctrine

*2004.11.30

人狼::戦略研究(2)

暇潰しと称してさらにコードを書いた.現在ソースとヘッダで32KB突破.暇人だな,自分.
検証が足りない気がするけど,以下結果.

X06村 - 狂人が占い師COの村
戦略:狂人が対抗CO.50%の確率で黒判定を出す.村人に本物を見破る術はないが,二人の占い師の意見が一致したときには確定白or黒の情報が得られる.狩人は白確定を等確率で守る.白確定の占い師がいればそれを最優先,次に白確定の霊能者を守る.
村勝率:52.13%
感想:X05村ではほぼ村の勝ちが決まっていたが,狂人がCOするだけで勝率は半減する.

X07村 - リーダーの村
戦略:確定白がリーダーとして立候補する.リーダーが占い先と吊り先を指定し,占い師はそれに従う.また,情報を多く得るために占い師は5日までは吊らない.
村勝率:66.07%
感想:吊り先を統一することによって真占い師が確定しなくても情報が得られるようになる.

X08村 - 人狼が占い師COの村
戦略:人狼が占い師CO,人狼に対して必ず白判定を出し,人狼以外には50%の確率で黒判定.占い師2CO.
村勝率:59.72%
感想:狂人のように人狼に対して黒判定を出すことはないので少し人狼有利になる.

X09村 - 占い師3COの村
戦略:狂人と人狼が占い師CO.占い師3CO.
村勝率:51.75%
感想:一般的な占い師3COの状態.霊能者の情報がなくても村側は5割程度の勝率があることを示す.

X10村 - 霊能者の村
戦略:霊能者が即CO.真占い師が確定していない場合,占い師の意見が対立した者を優先的に吊る.
村勝率:86.16%
感想:すぐ偽占い師のウソがばれるため,村が圧倒的に有利.

X11村 - 賢い狼の村
戦略:狼が今までランダムに喰っていたのを,白確定優先で喰うように変更.ただし,白確定が1人の場合はGJを避けるため5日以内の場合は喰わない.
村勝率:76.77%
感想:それでも真霊能者確定してると村がかなり有利.

X12村 - 賢い狼,占い師3COの村
戦略:X11から真霊能者を外した.
村勝率:48.88%
感想:ほぼ五分の戦い.

以上から,占い師3CO時で霊能者を無視しても50%程度の勝率があるようだ.まだ霊能者騙りや共有者トラップ等は実装していないのでなんともいえないが,少なくとも霊能者の情報を合わせればさらに勝率は上がるだろうし,共有者トラップも有効かもしれないので村人有利なのは確実だろう.
ただ,偽COしたときにどれくらいの割合で黒を出すとか,そういったパラメータの調整もあるが,一応正確ではないにしろそれなりに双方が有利になるような値を設定しているつもり.

なお,まとめサイトの勝敗結果/雑談によると,
投票COのページに最近50ヵ村の勝率を示しました.A国村人勝率70%と凄いことになってます. -- high 2004-11-22 (月) 22:12:34
と,かなり村人有利な事が明らかになっている.

*2004.11.27

人狼::戦略研究(1)

以前,人狼BBSの非常に限定された環境の勝率を計算した.
ただ,簡単な計算モデルはその手法でできるが,あの調子で複雑なモデルをポーティングするのは僕の技量を上回るので,人狼BBSのフレームワーク(X村と呼ぶことにしよう jinroh.cpp,jinroh.h)を作り,そこに個人の戦略モデル(X00.cpp)を投入して繰り返し実行することによって勝率の近似値を求めることにした.
フレームワークはCOや占い結果などを出力する話し合いのパートと個々の能力を行使するパートに分かれており,話し合いではかなり適当なメッセージ通信によってそれぞれのキャラクタが情報を得る.勿論人狼は赤ログで秘密の会話をすることも可能だ.
といっても人間の思考ルーチンをそのまま移植するのは大変なので,まずは非常に簡単なバカなモデルを作り,それをX村に投入して勝率を観測してみた.なお,基本的にX(n+1)村はXn村のモデルを継承している.

X00村 - 痴呆の村
戦略:誰もCOしない.吊りも人狼の喰いも全て乱数によって決定する.誰も操作せず,突然死もない村と思えばよい.
村勝率:23.83%
感想:村人12人に対して人狼3人(この場合,狂人と村人のアルゴリズムが等しいので村人は12とする)なので,村が有利な状況と思う人がいるけどそんなことはない.能力者が能力を発揮せねば村は狼の餌食だ.

X01村 - 食べ放題の村
戦略:狼が団結して投票.
村勝率: 2.89%
感想:あまりにも村人が馬鹿なので,狼の組織票によって吊りが行われる.馬鹿な村人にはもはや勝つ術はない.

X02村 - 占いの村
戦略:初日に占い師CO,占い結果報告もし,村人は黒がいれば吊り,白は吊らない,グレーは各自ランダム.狂人は完全ランダム投票.
村勝率:52.94%
感想:狼が馬鹿なので対抗COもせず,喰いもランダム.けど,相変わらず村が団結しないので狼の組織票が効いてしまい,真占い師が居るにも関わらず五分の勝負.

X03村 - 団結の村
戦略:吊る時に村人で団結して投票.
村勝率:76.69%
感想:団結すると勝率が跳ね上がる.リーダーシップを取る人間が村には必要であることが分かる.もしくは乱数を用いずに皆同じアルゴリズムで動く必要がある.例えばグレーは辞書順に吊るとか.

X04村 - 狩人の村
戦略:狩人は占い師を守る.占い師がいなければ確定白を守る.
村勝率:88.66%
感想:占い師の延命は村の勝率向上に繋がる.

X05村 - 共有者の村
戦略:共有者が初日に2人CO.
村勝率:96.16%
感想:確定白が増え,グレーが減れば勝率も上がる.

てことで,対抗COもないし狼の組織票にも気づかない現実離れしたモデルの村でした!(だめじゃん)
とりあえずこれから言える事は村側は団結しなければならないってことかな.
これは現実の世界にも当てはまるかもしれない.各自ばらばらに動いてしまう組織というのは脆い.反対に意思の統一ができている組織は強い.つまり,各人の協調性とトップのリーダーシップ,カリスマ性が強力な組織には不可欠ということ.つまり全体主義最強ってことだな.んだんだ.(ウソ)

人狼側の偽COなどのフィーチャーも取り入れたいところですが,そうなると命題論理というかパターン絞込みというか公務員の数的推理みたいな思考ルーチンが必要になってくるので結構大変かも.

あと,ソースがこの段階にして冗長かつ汚いのも困ったものです.もっと本質的な記述に専念できるようにうまくフレームワークを作らないといけない.それ以前の問題としてバグが潜んでそうですが.

参考 : 人狼BBSまとめサイト - 戦略議論板

*2004.11.03

人狼::人狼BBS

人狼BBSというものをご存知だろうか.
村人の中に人狼が紛れ込んでいて,その人狼が毎晩一人を喰らう.村人は誰が人狼かを推理しつつ疑わしいものを毎日ひとりずつ吊るし上げていく.最終的に,人狼を全滅させれば村の勝ち,村人が人狼以下になったら人狼の勝ち,というゲームをBBS形式で進める.
人狼かどうかを占える占い師や,死んだ人が人狼かどうかが分かる霊能者といった能力を持った人がいるので,その人を頼りに村人は人狼を探し出すことになる.ただ,誰がどの能力を持っているかは全く分からないため,占い師が出てきてもまずそれが本物かを見極めなくてはならない.
という知的(?)なゲームであるが,それぞれに村長や神父,木こり,村娘,爺といったアバターが与えられ,そのロールプレイをするのも一つの楽しみとなっている.

んで,何が最適な戦略かを計算してみようかと思ったんだけど,なんとも大変そうなのでとりあえず簡単に「不死身の占い師が居る場合」と「占い師不在の場合」の勝率を計算してみた.
一応戦略ルールとして,
1.狼は確定白が居れば,それを襲う(グレーを狭くするのは自分の占われる確率が高くなるので不利)
2.吊り先はグレーからランダムで選ぶ.狼の議論誘導は考慮しない
3.占い先はグレーからランダムで選ぶ.狼の議論誘導は考慮しない
4.吊り先と襲う先は被らないものとする(村で吊り先を一致指定する場合被らないはず,各自投票の場合狼の組織票が生きるので村に不利だと思われる.ってそうも言い切れない部分もあるが)
を想定し,二日目からスタートするものとする(つまり占い判定が一つ出てから吊り→人喰いが行われ,それが1ターン).
augur[V_] := Module[{m, m2, a, n, n2},

{m, m2, a, n, n2} = V;
If[m2 < 0, m += m2; m2 = 0];
If[n2 < 0, n += n2; n2 = 0];
Which[
m < 0, 0,
a + m + m2 <= n + n2, 0,
n + n2 == 0, 1,
a == 0 || m == 0 || n == 0, hang[V],
True, If[m > 1, {m - 1, 1, n}, {m, 0, n}]/(m+n).
{hang[{m-1,m2+1,a,n,n2}],hang[V],hang[{m,m2,a,n-1,n2+1}]}
]
];
hang[V_] := Module[{m, m2, a, n, n2},
{m, m2, a, n, n2} = V;
Which[
m < 0, 0,
m + n == 0, If[m2 + a > n2, 1, 0],
True,
If[n2 > 0, {0, 1}, {m, n}/(m + n)].
{augur[{m - 1, m2 - 1, a, n, n2}],
augur[{m, m2 - 1, a, n, n2 - 1}]}
]
];

(* 村人(灰)m, 村人m2(白), 人狼(灰)n 村の勝率を返す*)
vilwolf[m_, m2_, n_] := augur[{m, m2, 0, n, 0}];
(* 村人(灰)m, 村人m2(白), 占い師1,
人狼(灰)n 村の勝率を返す(占い師は不死身とする) *)
vilwolf2[m_, m2_, n_] := augur[{m - 1, m2, 1, n, 0}];

(* 占い師有りの勝率(横軸:村人の数),色が濃い方から狼1,2,3匹の場合 *)
Show[Table[
ListPlot[Table[{x, vilwolf2[x, 0, w]}, {x, 0, 14}],
PlotJoined -> True, PlotStyle -> {RGBColor[1, 1-1/w, 1-1/w]}],
{w, 1, 3}],
PlotRange -> {{0, 14}, {0, 1}}, Frame -> True];
占い師有りの勝率(横軸:村人の数),色が濃い方から狼1,2,3匹の場合

(* 占い師なしの勝率(横軸:村人の数),色が濃い方から狼1,2,3匹の場合 *)
Show[Table[
ListPlot[Table[{x, vilwolf[x, 0, w]}, {x, 0, 14}],
PlotJoined -> True, PlotStyle -> {RGBColor[1, 1-1/w, 1-1/w]}],
{w, 1, 3}],
PlotRange -> {{0, 14}, {0, 1}}, Frame -> True];
占い師なしの勝率(横軸:村人の数),色が濃い方から狼1,2,3匹の場合
横軸が村人の数(占い師は含む,人狼は含まない),縦軸が村が勝つ確率.
1つ目のグラフは不死身の占い師がいる場合.真占い師を信用し,最後まで守ることができれば勝率は限りなく高いということを示す.
2つ目のグラフは占い師不在の場合.真占い師が居なくなると,圧倒的に人狼が有利であることを示す.
って当たり前のことやんか!

ちなみに真占い師+白確定2人とかになるとほぼ確実に村が勝てるみたい.つまり占い師+共有者二人COがあった場合,人狼は必ず対抗COを出さなくてはなりません.人狼側としては占い師をいかに表に出してきて殺すかが常に重要なので,とりあえず死んでも構わない(霊能者に疑われない)狂人の占い師COは必須のような気がするけどどうでしょ.

不思議なのは村人の人数に対して村の勝利確率が単調増加でない点です.
多分「村人2:人狼1」よりも「村人3:人狼1」の方が勝率が低いということに起因していると思うんだけど,摩訶不思議な感じ.これだと故意に突然死を起こしたほうが有利になる事があるってことだ.てかどっか間違ってるかな?
ちなみに人狼の勝利条件を「村人<=人狼」ではなく「村人<人狼」にすれば(つまり村人が全滅するまでという条件にすれば),村人の数に対して単調増加になるようだ.

とりあえずこのコードが怪しい部分もあるので,ご指摘頂けたら幸いです.
ついでに戦略についていろいろ(具体的な数字を出して)研究しているサイトがあったら教えてー.
何故かプレイ開始してみたんで(暇人だなオイ).

あと,全然麻雀的な内容じゃないですが,こういうゲームの戦略的な話題は面倒なので全て麻雀カテゴリに含めることにしました.合掌.

oldlog 99-00 00-01 01 01-02 02
newlog 2002 2003 2004 2005 2006 2007
category scene | 2ch | 麻雀

Copyright (C) 2003-2004 mitsuman(mnishibe at ertl.jp) All Rights Reserved.

750k+