ゲーム開発におけるバックトラック法
2015年 1月 30日 第一回数学勉強会
はじめに
はじめに
自分が一番イラッ☆とくるのが、そもそも論。
「そもそもダメじゃね?」「いや、そうゆうの最初
から調べるでしょ??」を座標の中心で叫んでおり
ます。
はじめに
そんな自分のコーディングスタイルですが、「まず
何を除外するべきか?」これが体にしみ込んでいま
した。
そこからプログラミングを掘り下げた時に、面白い
アルゴリズムに出会いました。
バックトラック法
はじめに
「そもそもダメならハイ次ー」
「そこから始るならダメだねー」
って感じです。
なので、実は「バックトラック法だー!」って仰々しく
語る事ではないのですが、アルゴリズムとして成立して
いるものなのであれば、しっかり身に付けておこうと考
えた次第です。
はじめに
しかしながら、自分の中のルール決めだけで終わる
ような事をせず、本来どういったものであるかの認
識が必要だと考えました。
今回はその「認識」の部分をお話ししたいと思いま
す。
Unityのおはなし
Unityのお話
本日は「Unity3D」という、ゲーム開発エンジンを使
用してプレゼンテーションしてみたいと思います。
開発言語はC#です。
基本オブジェクト指向ですが、GUIを使用して誰でも
3Dゲームの開発が出来る、とても便利なミドルウェ
アです。
Unityのお話
デバックコンソールがみずらいので、一部実行ファイ
ルとして検証用に使用します。
具体的な動作としては、クラス単位でコーディング
→オブジェクトに配置→実行 となります。
バックトラック法とは
バックトラック法とは
バックトラッキング(backtracking)は、制約充足問
題の解を探索する戦略の一種で、力まかせ探索を改
良したもの。「バックトラック」という用語は、ア
メリカの数学者デリック・ヘンリー・リーマー
(Derrick Henry Lehmer)が1950年代に作った造語で
ある。
バックトラック法とは
制約充足問題は完全な解の存在する問題であり、要
素の順序は問題とはならない。一連の変数が与えら
れ、指定された制約を満足するようにそれらに値を
設定しなければならない。バックトラッキングでは、
変数の値の組み合わせを試行錯誤して解を探す。バッ
クトラッキングの効果は部分的組み合わせを排除す
る実装にあり、それによって実行時間を短縮する。
バックトラックアルゴリズム
探査の木
木やグラフを探索するためのアルゴリズムである。
アルゴリズムは根から(グラフの場合はどのノードを
根にするか決定する)始まり、バックトラックするま
で可能な限り探索を行う。「縦型探索」とも呼ばれ
る
NQueen
チェスのクイーンの動作をベースに、
N個のクイーンを置いて、どのクイー
ンからも、一手で詰められない場所
に配置をさせるアルゴリズム
その配置パターンがいくつあるかも
検出可能
基本思想
基本思想
今回は、条件に合わせて何かアクションを起こす事
を前提に、その条件の効率化を図りたいと思います。
あまり大きなコードになると余計な説明で混乱して
しまうので、完結にいきたいと思います!
世界のナベアツ算
Nの倍数でアホになるアレですw
基本ロジック
提示された整数を3で割ったものから、同じく3で
割り、小数点以下を切り捨てた数字をひいて、0で
あればTrue。
そもそも3で0にならない数字は演算終了。
例題:世界のナベアツ算
40までかぞえます
3の倍数でアホになります
サンプルコード( Qiita )
Nabeatsu.cs参照
判定用プロパティ m_nabeatsu (初期値 floart 0)
カウント用プロパティ m_maxCount (初期値 int 40)
サンプルコード( Qiita )
14行目で3で割った浮動小数点型の値から、3で割っ
て、小数点以下を切り捨てた値を引きます。
あまりがなく、ちょうど0になればTrueが返ってき
て、「Aho」がコンソールに表示されます。
例題:世界のナベアツ算2
40までかぞえます
3の倍数でアホになります
3がつく数字はアホアホになります
3がついて3の倍数もアホアホになります
サンプルコード( Qiita )
Nabeatsu_SanTsuku.cs参照
判定用プロパティ m_nabeatsu (初期値 floart 0)
カウント用プロパティ m_maxCount (初期値 int 40)
サンプルコード( Qiita )
14行目で整数の中に3が含まれているか、C#の
IndexOfメソッドで確認します。ここで一度、検索の
ために整数から、String型に変換を行います。
Trueが返ってきたらその数字は「AhoAho」として出
力されます。
サンプルコード( Qiita )
15行目で3で割った浮動小数点型の値から、3で割っ
て、小数点以下を切り捨てた値を引きます。
あまりがなく、ちょうど0になればTrueが返ってき
て、「Aho」がコンソールに表示されます。
…これらをふまえて
FizzBuzz式
FizzBuzz式とは?
入社試験とかで(…コイツ本当にプログラマーかぁ
…?)と、いらぬ疑いをかけられた時に試されるプロ
グラミング
普通に書ける人達は、どこまで効率よく書かれてい
るかを議論する良い問題
基本ナベアツ算です(笑)
FizzBuzz式とは
そもそも3の倍数、5の倍数でなければ次の数字
ひとつの数字で、3の倍数であるか?5の倍数であ
るか?3と5の倍数であるか?を全て調べる必要は
無く、そもそも3でも5でもどちらにも倍数として
当てはまらなければ、次の数字と言ったロジック。
FizzBuzz式
40までかぞえます
3の倍数ではFizzといいます
5の倍数ではBuzzといいます
3と5の倍数ではFizzBuzzといいます
サンプルコード( Qiita )
FizzBuzz.cs参照
判定用プロパティ m_count (初期値 floart 0)
カウント用プロパティ m_maxCount (初期値 int 40)
サンプルコード( Qiita )
14行目で、そもそも3の倍数でも5の倍数でもない
数字の演算を終了させます。
そこから、3の倍数の処理、5の倍数の処理、3の
倍数で、5の倍数も含む数字の処理を行ないます。
実演
バックトラック法の使い方
NQueen
本日はこちらで解説したかったのですが、時間が足
りないのでまたの機会に。
ちなみにこれが出来ると、キャンディークラッシュ
のような3マッチパズルゲームでの駒の配置が、自動
でコントロールできる。( ←これに関連づけて話した
かった…orz)
その他の使い方
探索などの振る舞いが得意
ダンジョンのルート検索にとても有用
ノベルゲームのデバック
ご清聴
有り難うございました!

ゲーム開発におけるバックトラック法