Successfully reported this slideshow.

Alloyによるハミルトン閉路

1,599 views

Published on

みてくだされ~~~

Published in: Technology
  • Be the first to comment

Alloyによるハミルトン閉路

  1. 1. Alloyによるハミルトン閉路Twitter @everysick
  2. 2. -1- ハミルトン閉路の定義1. 無向グラフ内にあるすべての頂点を経由する。2. 頂点を結ぶ辺は高々一回しか通れない。3. どの頂点から開始しても必ず開始した頂点に戻る。4. NP完全問題である。
  3. 3. -2- 具体例たとえば、以下のような三角形・四角形もハミルトン閉路の条件に満たされているのでハミルトン閉路であるといえる。
  4. 4. -3- 今回 n1 n2今回は右図のグラフを検証します! n3 n4 n5 n6 n7
  5. 5. -3- Alloyで実証する方針 Alloyはc言語のように”求める”のではなく条件に合うよう” 探してもらう”ような言語である  ハミルトン閉路の条件を投げて探させる 頂点などの入力はどうするか  初期状態に頂点,辺を与え、その中から必要な辺をピックアップさせると大まかな方針を立てて実装開始。
  6. 6. -4.1- ソースの説明 頂点enum Node{n1,n2,n3,n4,n5,n6,n7} n1~n7が今回の頂点として扱う例図を次に示します
  7. 7. Node• n1• n2 4.1での Node の中身• n3 Nodeの大きなくくりの中に• n4 n1~n7が存在している。• n5• n6• n7
  8. 8. -4.2- ソースの説明 辺 Node n1one sig Links{ link:Node-> set Node, ans{(n1,n2)} link{(n1,n2)} ans:Node-> set Node} Link が初期状態に与えられる辺 Node n2 ans が答えを示す辺 それぞれNode1とNode2を繋ぐ
  9. 9. -4.3- ソースの説明 初期辺 Links.link=Reverse[ (n1->n2)+(n2->n3)+(n1->n3)+ (n2->n4)+(n2->n6)+(n4->n6)+ Reverse? (n4->n3)+(n4->n5)+(n6->n5)+ (n5->n7)+(n6->n7)+(n3->n5)] “n1->n2” で “n1からn2に辺を持たせる” ということを現しているので上のソース では初期の辺をlinkに入れてます。
  10. 10. -4.3- ソースの説明 初期辺 受け取るfun Reverse(n:Node->Node):set Node->Node{ n+~n} 返す funは関数の宣言なのでReverseは関数です。 そして無向グラフなので “Node->Node” を受け取って “n+~n” で現在の方向の辺と方向を逆にした辺と一緒にを返す。
  11. 11. -4.4- ソースの説明 初期グラフ n1 n2 n3 n4 n5 n6 n7
  12. 12. -5.1- 制約を与える 今回与える制約 1. 答えの辺がついている頂点は2つの辺を持つ 2. 辺ansは辺linkに含まれている辺でなければならない 3. 自分から自分への辺は存在しない よく考えるとこれだけでは閉路が複数できてしまう  閉路をひとつだけにするための制約も追加する
  13. 13. -5.2- 制約を与える one n.(ans) and one n[ans] 頂点からは2つしか辺が出ない制約 ans in link ansの辺はlinkの辺の中に含まれているという制約 not n.(ans)=n[ans] 自分から自分への辺は存在しない制約 *link=*ans 閉路に存在する頂点が初期状態に存在する頂点数内に存在する制約
  14. 14. -6- ソースの全貌・初期グラフの作成・制約の追加 総計して30行程度
  15. 15. -7- 実行結果Alloyによって経路の探索ができましたこれを実際にグラフで検証してみます!
  16. 16. -8- 検証Node番号で n11→2→4→6→7→5→3→1… n2 n3 n4 n5 n6 n7
  17. 17. -9- まとめAlloyをつかうことにより実際にやるのが面倒なハミルトン閉路の問題に対して簡単に解を求めることができました。ただAlloyはこのような問題を解くのではなく検証に向いていると思いました。
  18. 18. おわり~~~~~~

×