Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マインスイーパーSolverの話
Search
gott
February 08, 2019
Technology
0
2.7k
マインスイーパーSolverの話
UTMC(
http://www.komaba.utmc.or.jp/
)で話した内容です。
gott
February 08, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
What happened to RubyGems and what can we learn?
mikemcquaid
0
280
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.8k
20260208_第66回 コンピュータビジョン勉強会
keiichiito1978
0
130
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
AI駆動PjMの理想像 と現在地 -実践例を添えて-
masahiro_okamura
1
110
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.4k
AWS Network Firewall Proxyを触ってみた
nagisa53
1
220
仕様書駆動AI開発の実践: Issue→Skill→PRテンプレで 再現性を作る
knishioka
2
640
日本の85%が使う公共SaaSは、どう育ったのか
taketakekaho
1
150
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
13k
AIと新時代を切り拓く。これからのSREとメルカリIBISの挑戦
0gm
0
890
OpenShiftでllm-dを動かそう!
jpishikawa
0
100
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
RailsConf 2023
tenderlove
30
1.3k
Into the Great Unknown - MozCon
thekraken
40
2.3k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
300
My Coaching Mixtape
mlcsv
0
48
Are puppies a ranking factor?
jonoalderson
1
2.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
Building the Perfect Custom Keyboard
takai
2
680
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
250
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
110
Skip the Path - Find Your Career Trail
mkilby
0
54
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
160
Transcript
マインスイーパー Solverの話 gott
自己紹介 • ‘16入学 • システム創成学科 システムデザイン&マネジメントコース • ‘13-’16 GNEX Inc.
• ‘16- UNIPRO Inc. • Web屋 PHP / JavaScript • 趣味を書いたりする
マインスイーパーとは 初級:9×9のマスに10個の地雷 中級:16×16のマスに40個の地雷 上級:30×16のマスに99個の地雷
課題 http://save.sys.t.u-tokyo.ac.jp/~fujii/lecture/pgmkiso/
制約 • マインスイーパーのライブラリが用意されている • Java使う
結果
自明な確定マス・安全マス 旗の立っているマスは,中心の 1マスの情報だけで爆弾があると分かる。 →自明な確定マス 右下のマスは自明な確定マスの情報だけで安全だと分かる →自明な安全マス
非自明な安全マス 右下のマスは自明な安全マスではないが,矛盾しない全ての 爆弾配置パターンにおいて安全 →非自明な安全マス
どうやって探すの
自明な安全マス すぐに思いつくように,全てのマスについて周囲 8マスを探索して確定マスを探し続ければよい
非自明な安全マス 全探索! 周囲の爆弾の個数がわかっているから,それまで考えたパターンと無矛盾なものを全列挙
定義 NumEdge 周囲8マスの中に,確定マスでない未オープンのマスがあるような数字マスの集合。 BoxEdge 周囲8マスの中に数字マスがあるような,確定マスでない未オープンのマスの集合。 関連する relates :: NumEdge ->
BoxEdge -> Bool relates a b = a `next_to` b -- next_to: 斜めに隣接
非自明な安全マス (0, 1)はすでに爆弾が確定したマス。 a = (1, 1), b = (2,
1), c = (3, 1) d = (1, 2), e = (2, 2), f = (3, 2) cから出発したとする。 cの周りの爆弾配置は右の 2通り。 relates(c, f) ∧ relates(b, f)なので, b,続いてaについて調べる。 aについて調べると,左は矛盾する。
それでも見つからなかったら 運ゲーをやるしかないが,場所によって爆弾のありそうな確率は異なる →事前確率(なにも情報がないマスに爆弾がある確率 )より有意に小さければ開ける価値あり
変な工夫 double default_probability = (double)countNotFixedBombs() / board.count( (i) -> !i.isOpen()
& !i.isFixed() && !i.isSafe() , this); // なにも情報がないマスに爆弾がある確率 if (min_prob < default_probability - BIAS) { min_cell.setSafe(); return true; } BIAS = 0.014で一番勝率が高くなった
書き方の話: 素の制御構文をたくさん書くな 例えばこんなfor文をたくさん書くとする。 for (int i = n - 1;
i >= 0; i--) { /*...*/ } 一箇所でも赤が抜けると黙ってバグる。 こうしよう。 this.board.numEdge.forEach((i) -> { i.relatedEdges = new BoardCellSet(); i.getIterator(this).apply_around((j) -> j.isBoxEdge() && i.relatedEdges.add(j.getCell())); });
書き方の話: 抽象化 public class ProbPlayer extends Player このクラスのmainメソッドがエントリポイント。 Playerはコンパイル済みのライブラリ内にある。 player.open(int
x, int y) を呼ぶと親クラスであるPlayerの public final boolean open(int x, int y) が呼ばれ,実際に(x, y)マスを開ける処理が走る。 →何が問題か?
書き方の話: 抽象化 答え: モジュールが密結合していてテストが難しい 関連ワード: テスタビリティ,依存性注入 (DI) Playerはあくまでinterfaceであるべき。その上で,ランダムに盤面を生成するようなロジックを implements Playerなるクラスに実装するべき。そうすれば,ユニットテストに都合のいい盤面を与えてやり,自分で書いたロ
ジックがそれにきちんと対応できているか自動で調べることができるようになる。
書き方の話: 適切なクラスを使う public class GameClear extends RuntimeException おばけ。ゲームクリアは異常事態なのか? これのせいでtry-catchがうまくいかなくて詰まってた https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
Fin.