Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
FuraIT #3(2014.8.23)
コンピュータに
「最長しりとり」「最短距離での
JR線全線乗り尽くし」を
解いてもらった方法
H.Hiro
@h_hiro_ / http://hhiro.net/about/
自己紹介
H.Hiro (@h_hiro_)
●
情報系の研究員
※2014年3月まで大学院生でした
●
中学生のときに部活で
プログラミングに触れてから
好きになり、大学の専門も
そちらに進みました
【告知】
Sapporo.cpp(札幌C++勉強会)
●
札幌で勉強会やってます
●
不定期開催
(今年は開催頻度多め)
●
次の活動:8月30日(土)
Ohotech(北見)で4人発表します
よろしく
お願いします
今回の内容
(1)
最長しりとり
与えられた単語リストでしりとりを
するとき、最大の単語数のものを
求める(1単語につき1回まで)
単語リスト
→
最大の単語数の
しりとり
いた いちご
こっぷ たこ
たいこ ふた
(6単語)
いた→たこ→
こっぷ→ふた→
たいこ
(5単語)
今回の内容
(2)
最短距離での
JR線全線
乗り尽くし
JR線全線を乗り尽くして、出発駅
まで戻るための最短ルートを求める
※JR線以外の交通機関は使わず
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新...
これらを
コンピュータに
解かせた話
【補足1】
●
以後で説明する解き方は
私が考案したというわけではありません。
●
ただ、すぐに使えるような
プログラムの実装が見当たらず、
欲しくなったので自分で作ったという
ものです。
【補足2】
●
今回の説明だけで、聴講される皆様が
具体的にプログラムまで書けるように
なるところまでは想定していません。
●
「こうやればコンピュータにとって
解きやすくなるんだ」という感覚をつかんで
いただければ幸いです。
●
プログラムの...
【参考文献・資料】
●
最長しりとり
●
ポケモンでしりとりしたら最長何匹まで続く? 数学の卒論がネットで話題に
http://nlab.itmedia.co.jp/nl/articles/1107/19/news080.html
●
JR線全...
今回用いた
考え方
グラフ理論
いくつかの点と、それらを結ぶ
辺からなるデータ構造を扱う
数学の一分野
「理論」って言うと
難しそうに見えるけど
パズルに近い
分野です
グラフ理論
いくつかの点(「頂点」ともいう)と
それらを結ぶ辺からなる
データ構造を「グラフ」という。
※辺はちょうど2つの点を結ぶとする
例:点が5つ、辺が7つのグラフ
JR線などの鉄道網は、
駅を点、路線を辺とする
グラフ構造とみなせる
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川...
実は、しりとりも
グラフ構造とみなせる
こうすればよい
単語リスト
いた いちご
こっぷ たこ
たいこ ふた
(6単語)
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
しりとりを
グラフ構造にして
何が嬉しいのか?
どんな条件で
「最長しりとり」に
なるのかが
見た目で
はっきりする
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
辺を1か所
辿ること
が
単語を1回
使うこと
を
意味する
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
●
どこかの点から
スタートして
●
辺をなるべく多く
辿り
●
辿れた辺の本数が
最大になるような
ものを見つければ
よい
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
ちなみに、
いまの問題の
答えは
右図の通り
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
ちなみに、
いまの問題の
答えは
右図の通り
(単語数:5)
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
ただ、これを手計算で解くのは
問題が小さくないとまず無理
→ だから
「コンピュータに解いてもらう」
ただ、全部の通り方を
試しつくそうとすると
流石にコンピュータでも
時間がかかりすぎる
ということで、
「一本の経路で
ある」ことを
コンピュータが
扱いやすい形で
表現する
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
●
しりとりの先頭文字:
出る線の数は
入る線の数より1多い
●
しりとりの末尾文字:
出る線の数は
入る線の数より1少ない
●
それ以外:
出る線の数は
入る線の数と同じ
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
●
しりとりの先頭文字:
出る線の数は
入る線の数より1多い
●
しりとりの末尾文字:
出る線の数は
入る線の数より1少ない
●
それ以外:
出る線の数は
入る線の数と同じ
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
●
しりとりの先頭文字:
出る線の数は
入る線の数より1多い
●
しりとりの末尾文字:
出る線の数は
入る線の数より1少ない
●
それ以外:
出る線の数は
入る線の数と同じ
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
まとめると
最長しりとりの要件
●
このグラフを一筆書きで辿れる
経路のうち、
最長(辺の数が最大)のもの
そのために必要な条件
●
しりとりの先頭・末尾を除き、ある文字で
始まる単語と終わる単語の数は等しい
=ある点に入る辺の数と、出る辺の数が等しい
●...
さあ、
コンピュータに
解いてもらおう
世の中には
便利なものが
ある
整数計画
ソルバー
整数変数について、最適化したい式と
条件式を与え最適化するツール
例:Excelのソルバー、GLPK
(https://www.gnu.org/software/glpk/)
[最大化したい式] 2x + y
[条件式] x + y ≦ 10
...
【補足】
●
ツールによって、使える条件式に制限が
あります。
例えば「1次式しか使えない」など。
(= x + 3yなどは可、
 x2
+ yやx2
yなど変数同士の積は不可)
●
今回はGLPKを使ってます。
無料で使え、プログラムの中から...
今回の場合
[最大化したい式]
Σe∈すべての単語
I(e)
I(e)は、単語eを使ったときに1、そうでないときに0を返す
[条件式]
始点の文字(頂点)sは
Σe∈(sで始まる単語)
I(e) - Σe∈(sで終わる単語)
I(e) = 1
...
※注:
実際にはこれ以外に
「二つ以上の独立した(分断された)
しりとりになっていない」ことの
チェックが必要なのですが
割愛します
実際に
作ったので
これを使って
解いてみます
http://chiraura.hhiro.net/shiritori/
http://chiraura.hhiro.net/shiritori/
単語リスト
いた いちご
こっぷ たこ
たいこ ふた
(6単語)
700単語
くらいあっても
結構すぐに
解けます
http://chiraura.hhiro.net/shiritori/
ここまでの
まとめ
グラフ理論
図にすることで
注目すべき点が
見えやすくなる
●
辺を使う回数がなるべく多い
経路を考えればよい
●
単語は「先頭文字・
末尾文字」の
組だけで分類
すればよい
い
た
こ
ふ
いちご
ふた
たいこ
たこ
こっぷいた
ということを
踏まえつつ
次の問題へ
もう一つの問題
最短距離での
JR線全線
乗り尽くし
地図:国土数値情報 鉄道データ N02-08
(2008年現在;JR以外の鉄道も入ってます)
ルール
●
家に帰るまでが乗り尽くしです
※全線を乗り尽くして出発駅に
 戻るまでの距離で考える
●
JR以外の交通機関は使わない
詳しくは、7月12日の私の
勉強会発表資料を
http://www.slideshare.net/maraigue/ch...
解き方
簡単のために
JR北海道だけで
考えます
JR北海道の路線図
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川 新旭川
稚内
富良野
様似
岩見沢
実は「出発駅に
戻らないとならない」と
いう制約が
問題を簡単にしている
(それでも結構
大変ではあるのだが)
例えば、乗り尽くしにおいて
「岩見沢~滝川を1回」かつ
「新夕張~新得を2回」
という乗り方は可能か?
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石...
→答えはNO。
 出発駅に戻れなくなる。
「岩見沢~滝川を1回」かつ「新夕張~新得を2回」
では、例えば富良野から札幌に行くと
最後は戻って来られなくなる。
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張...
例えば、乗り尽くしにおいて
「岩見沢~滝川を1回」
かつ「岩見沢~白石を2回」
かつ「岩見沢~追分を2回」
という乗り方は可能か?
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南...
→答えはNO。同様の理由で、
 岩見沢駅に帰れなくなる。
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川 新旭川
稚...
結論:
1.路線網を分断するような辺は
合計で偶数回通る必要がある
2.各駅に入る回数と出る回数は
必ず同じである必要がある
※なお逆に、「各駅に出入りする辺数が
偶数になっていれば、乗り尽くしが
可能である」ことも数学的に示せます。
ぐぐる用...
最短乗車距離の見つけ方(1):
まず、行き止まりの路線は
絶対に2回通らないとならないので
そこは落としてしまう。
(計算時間を減らす意味もある)
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
...
最短乗車距離の見つけ方(1):
まず、行き止まりの路線は
絶対に2回通らないとならないので
そこは落としてしまう。
(計算時間を減らす意味もある)
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
...
最短乗車距離の見つけ方(1):
まず、行き止まりの路線は
絶対に2回通らないとならないので
そこは落としてしまう。
(計算時間を減らす意味もある)
沼ノ端
追分
新得南千歳
白石
滝川
旭川
富良野
岩見沢
最短乗車距離の見つけ方(2):
路線図のうち、奇数本しか路線が入って
こない駅を集め、そこを2つずつの組にし
距離が最小になるものを求める。
沼ノ端
追分
新得南千歳
白石
滝川
旭川
富良野
岩見沢
最短乗車距離の見つけ方(2):
路線図のうち、奇数本しか路線が入って
こない駅を集め、そこを2つずつの組にし
距離が最小になるものを求める。
赤丸の駅に繋がる辺数が全部偶数になった!
沼ノ端
追分
新得南千歳
白石
滝川
旭川
富良野
岩見沢
最終結果:JR北海道全線
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川 新旭川
稚内
富良野
様似
岩見沢
━━━...
最終結果:JR北海道全線
函館
五稜郭
中小国
大沼
森
長万部
室蘭
東室蘭
苫小牧
沼ノ端
追分
新得
夕張
新夕張
東釧路
根室
南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川 新旭川
稚内
富良野
様似
岩見沢
一筆書...
最短乗車距離の見つけ方(3):
「JR全線」のようにあまりに駅数が多いときは
路線を分断してから解くと
大幅に高速化される(組み合わせ爆発回避)
※詳細は省略
詳細:
http://blog.livedoor.jp/maraigue/archi...
ソルバーに与えてあげる式
[最小化したい式]
Σe∈A
d(e)×I(e)
Aは、入ってくる路線数が奇数本である駅を
2つ選んで取り出したものの集合
I(e)は、単語eを使ったときに1、そうでないときに0を返す
d(e)は駅間距離(定数なので、...
解いてみる
ソースコード:
https://github.com/maraigue/cpp-chinese-postman
おわりに
(1)
グラフ理論という
ツールを駆使して
「コンピュータに解ける
パズル」にする
(2)
グラフ上の最適化は
条件が1次式で
書けるなら
GLPKとかで楽できる
ありがとう
ございました
Upcoming SlideShare
Loading in …5
×

コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法

4,202 views

Published on

FuraIT # 3(2014.8.23)
http://furait.connpass.com/event/7851/
での発表

Published in: Technology
  • Login to see the comments

コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法

  1. 1. FuraIT #3(2014.8.23) コンピュータに 「最長しりとり」「最短距離での JR線全線乗り尽くし」を 解いてもらった方法 H.Hiro @h_hiro_ / http://hhiro.net/about/
  2. 2. 自己紹介
  3. 3. H.Hiro (@h_hiro_) ● 情報系の研究員 ※2014年3月まで大学院生でした ● 中学生のときに部活で プログラミングに触れてから 好きになり、大学の専門も そちらに進みました
  4. 4. 【告知】 Sapporo.cpp(札幌C++勉強会) ● 札幌で勉強会やってます ● 不定期開催 (今年は開催頻度多め) ● 次の活動:8月30日(土) Ohotech(北見)で4人発表します
  5. 5. よろしく お願いします
  6. 6. 今回の内容 (1)
  7. 7. 最長しりとり
  8. 8. 与えられた単語リストでしりとりを するとき、最大の単語数のものを 求める(1単語につき1回まで) 単語リスト → 最大の単語数の しりとり いた いちご こっぷ たこ たいこ ふた (6単語) いた→たこ→ こっぷ→ふた→ たいこ (5単語)
  9. 9. 今回の内容 (2)
  10. 10. 最短距離での JR線全線 乗り尽くし
  11. 11. JR線全線を乗り尽くして、出発駅 まで戻るための最短ルートを求める ※JR線以外の交通機関は使わず 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  12. 12. これらを コンピュータに 解かせた話
  13. 13. 【補足1】 ● 以後で説明する解き方は 私が考案したというわけではありません。 ● ただ、すぐに使えるような プログラムの実装が見当たらず、 欲しくなったので自分で作ったという ものです。
  14. 14. 【補足2】 ● 今回の説明だけで、聴講される皆様が 具体的にプログラムまで書けるように なるところまでは想定していません。 ● 「こうやればコンピュータにとって 解きやすくなるんだ」という感覚をつかんで いただければ幸いです。 ● プログラムのソースコードや参考資料は 適宜示しております。
  15. 15. 【参考文献・資料】 ● 最長しりとり ● ポケモンでしりとりしたら最長何匹まで続く? 数学の卒論がネットで話題に http://nlab.itmedia.co.jp/nl/articles/1107/19/news080.html ● JR線全線乗り尽くし(中国人郵便配達問題) ● Saul I. Gass, Carl M. Harris, 森村英典(監訳), 刀根薫(監訳), 伊理正夫 (監訳)(1999), 経営科学OR用語大事典, 朝倉書店, ISBN 4254121318 ● Bernhard Korte, Jens Vygen, 浅野孝夫(訳), 浅野泰仁(訳), 小野孝男 (訳), 平田富夫(訳) (2005), 組合せ最適化―理論とアルゴリズム, シュプリ ンガー・フェアラーク東京, ISBN 9784431711834 ※Wikipediaに掲載がありますが、それを書いたのは私です
  16. 16. 今回用いた 考え方
  17. 17. グラフ理論 いくつかの点と、それらを結ぶ 辺からなるデータ構造を扱う 数学の一分野
  18. 18. 「理論」って言うと 難しそうに見えるけど
  19. 19. パズルに近い 分野です
  20. 20. グラフ理論
  21. 21. いくつかの点(「頂点」ともいう)と それらを結ぶ辺からなる データ構造を「グラフ」という。 ※辺はちょうど2つの点を結ぶとする 例:点が5つ、辺が7つのグラフ
  22. 22. JR線などの鉄道網は、 駅を点、路線を辺とする グラフ構造とみなせる 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  23. 23. 実は、しりとりも グラフ構造とみなせる
  24. 24. こうすればよい 単語リスト いた いちご こっぷ たこ たいこ ふた (6単語) い た こ ふ いちご ふた たいこ たこ こっぷいた
  25. 25. しりとりを グラフ構造にして 何が嬉しいのか?
  26. 26. どんな条件で 「最長しりとり」に なるのかが 見た目で はっきりする い た こ ふ いちご ふた たいこ たこ こっぷいた
  27. 27. 辺を1か所 辿ること が 単語を1回 使うこと を 意味する い た こ ふ いちご ふた たいこ たこ こっぷいた
  28. 28. ● どこかの点から スタートして ● 辺をなるべく多く 辿り ● 辿れた辺の本数が 最大になるような ものを見つければ よい い た こ ふ いちご ふた たいこ たこ こっぷいた
  29. 29. ちなみに、 いまの問題の 答えは 右図の通り い た こ ふ いちご ふた たいこ たこ こっぷいた
  30. 30. ちなみに、 いまの問題の 答えは 右図の通り (単語数:5) い た こ ふ いちご ふた たいこ たこ こっぷいた
  31. 31. ただ、これを手計算で解くのは 問題が小さくないとまず無理 → だから 「コンピュータに解いてもらう」
  32. 32. ただ、全部の通り方を 試しつくそうとすると 流石にコンピュータでも 時間がかかりすぎる
  33. 33. ということで、 「一本の経路で ある」ことを コンピュータが 扱いやすい形で 表現する い た こ ふ いちご ふた たいこ たこ こっぷいた
  34. 34. ● しりとりの先頭文字: 出る線の数は 入る線の数より1多い ● しりとりの末尾文字: 出る線の数は 入る線の数より1少ない ● それ以外: 出る線の数は 入る線の数と同じ い た こ ふ いちご ふた たいこ たこ こっぷいた
  35. 35. ● しりとりの先頭文字: 出る線の数は 入る線の数より1多い ● しりとりの末尾文字: 出る線の数は 入る線の数より1少ない ● それ以外: 出る線の数は 入る線の数と同じ い た こ ふ いちご ふた たいこ たこ こっぷいた
  36. 36. ● しりとりの先頭文字: 出る線の数は 入る線の数より1多い ● しりとりの末尾文字: 出る線の数は 入る線の数より1少ない ● それ以外: 出る線の数は 入る線の数と同じ い た こ ふ いちご ふた たいこ たこ こっぷいた
  37. 37. まとめると
  38. 38. 最長しりとりの要件 ● このグラフを一筆書きで辿れる 経路のうち、 最長(辺の数が最大)のもの そのために必要な条件 ● しりとりの先頭・末尾を除き、ある文字で 始まる単語と終わる単語の数は等しい =ある点に入る辺の数と、出る辺の数が等しい ● 先頭・末尾については数の差が 1
  39. 39. さあ、 コンピュータに 解いてもらおう
  40. 40. 世の中には 便利なものが ある
  41. 41. 整数計画 ソルバー
  42. 42. 整数変数について、最適化したい式と 条件式を与え最適化するツール 例:Excelのソルバー、GLPK (https://www.gnu.org/software/glpk/) [最大化したい式] 2x + y [条件式] x + y ≦ 10 3x + y ≦ 17 x, yは整数
  43. 43. 【補足】 ● ツールによって、使える条件式に制限が あります。 例えば「1次式しか使えない」など。 (= x + 3yなどは可、  x2 + yやx2 yなど変数同士の積は不可) ● 今回はGLPKを使ってます。 無料で使え、プログラムの中から呼び出して 使う方法も充実しています(基本はC言語だが 別の言語用ラッパーも多数ある)。
  44. 44. 今回の場合 [最大化したい式] Σe∈すべての単語 I(e) I(e)は、単語eを使ったときに1、そうでないときに0を返す [条件式] 始点の文字(頂点)sは Σe∈(sで始まる単語) I(e) - Σe∈(sで終わる単語) I(e) = 1 始点の文字(頂点)gは Σe∈(gで始まる単語) I(e) - Σe∈(gで終わる単語) I(e) = -1 それ以外の文字(頂点)vは Σe∈(vで始まる単語) I(e) - Σe∈(vで終わる単語) I(e) = 0
  45. 45. ※注: 実際にはこれ以外に 「二つ以上の独立した(分断された) しりとりになっていない」ことの チェックが必要なのですが 割愛します
  46. 46. 実際に 作ったので これを使って 解いてみます http://chiraura.hhiro.net/shiritori/
  47. 47. http://chiraura.hhiro.net/shiritori/ 単語リスト いた いちご こっぷ たこ たいこ ふた (6単語)
  48. 48. 700単語 くらいあっても 結構すぐに 解けます http://chiraura.hhiro.net/shiritori/
  49. 49. ここまでの まとめ
  50. 50. グラフ理論
  51. 51. 図にすることで 注目すべき点が 見えやすくなる
  52. 52. ● 辺を使う回数がなるべく多い 経路を考えればよい ● 単語は「先頭文字・ 末尾文字」の 組だけで分類 すればよい い た こ ふ いちご ふた たいこ たこ こっぷいた
  53. 53. ということを 踏まえつつ 次の問題へ
  54. 54. もう一つの問題
  55. 55. 最短距離での JR線全線 乗り尽くし
  56. 56. 地図:国土数値情報 鉄道データ N02-08 (2008年現在;JR以外の鉄道も入ってます)
  57. 57. ルール
  58. 58. ● 家に帰るまでが乗り尽くしです ※全線を乗り尽くして出発駅に  戻るまでの距離で考える ● JR以外の交通機関は使わない 詳しくは、7月12日の私の 勉強会発表資料を http://www.slideshare.net/maraigue/chinese-postman http://blog.livedoor.jp/maraigue/archives/1747895.html
  59. 59. 解き方
  60. 60. 簡単のために JR北海道だけで 考えます
  61. 61. JR北海道の路線図 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  62. 62. 実は「出発駅に 戻らないとならない」と いう制約が 問題を簡単にしている
  63. 63. (それでも結構 大変ではあるのだが)
  64. 64. 例えば、乗り尽くしにおいて 「岩見沢~滝川を1回」かつ 「新夕張~新得を2回」 という乗り方は可能か? 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  65. 65. →答えはNO。  出発駅に戻れなくなる。 「岩見沢~滝川を1回」かつ「新夕張~新得を2回」 では、例えば富良野から札幌に行くと 最後は戻って来られなくなる。 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  66. 66. 例えば、乗り尽くしにおいて 「岩見沢~滝川を1回」 かつ「岩見沢~白石を2回」 かつ「岩見沢~追分を2回」 という乗り方は可能か? 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  67. 67. →答えはNO。同様の理由で、  岩見沢駅に帰れなくなる。 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  68. 68. 結論: 1.路線網を分断するような辺は 合計で偶数回通る必要がある 2.各駅に入る回数と出る回数は 必ず同じである必要がある ※なお逆に、「各駅に出入りする辺数が 偶数になっていれば、乗り尽くしが 可能である」ことも数学的に示せます。 ぐぐる用キーワード:「オイラーグラフ」
  69. 69. 最短乗車距離の見つけ方(1): まず、行き止まりの路線は 絶対に2回通らないとならないので そこは落としてしまう。 (計算時間を減らす意味もある) 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  70. 70. 最短乗車距離の見つけ方(1): まず、行き止まりの路線は 絶対に2回通らないとならないので そこは落としてしまう。 (計算時間を減らす意味もある) 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢
  71. 71. 最短乗車距離の見つけ方(1): まず、行き止まりの路線は 絶対に2回通らないとならないので そこは落としてしまう。 (計算時間を減らす意味もある) 沼ノ端 追分 新得南千歳 白石 滝川 旭川 富良野 岩見沢
  72. 72. 最短乗車距離の見つけ方(2): 路線図のうち、奇数本しか路線が入って こない駅を集め、そこを2つずつの組にし 距離が最小になるものを求める。 沼ノ端 追分 新得南千歳 白石 滝川 旭川 富良野 岩見沢
  73. 73. 最短乗車距離の見つけ方(2): 路線図のうち、奇数本しか路線が入って こない駅を集め、そこを2つずつの組にし 距離が最小になるものを求める。 赤丸の駅に繋がる辺数が全部偶数になった! 沼ノ端 追分 新得南千歳 白石 滝川 旭川 富良野 岩見沢
  74. 74. 最終結果:JR北海道全線 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢 ━━━━:2回通る ━━━━:1回通る JR北海道の総距離 2457.7km(営業キロ) 左図の総乗車距離 3565.0km(同) 総距離の145%
  75. 75. 最終結果:JR北海道全線 函館 五稜郭 中小国 大沼 森 長万部 室蘭 東室蘭 苫小牧 沼ノ端 追分 新得 夕張 新夕張 東釧路 根室 南千歳 新千歳空港 桑園 白石 新十津川 増毛 滝川 深川 旭川 新旭川 稚内 富良野 様似 岩見沢 一筆書き経路の例 白石→桑園→新十津川→桑園 →長万部→森→大沼→五稜郭 →函館→五稜郭→中小国→五稜郭 →大沼→森→長万部→東室蘭 →室蘭→東室蘭→苫小牧→様似 →苫小牧→沼ノ端→追分→岩見沢 →白石→南千歳→沼ノ端→南千歳 →新千歳空港→南千歳→追分 →新夕張→夕張→新夕張→新得 →東釧路→根室→東釧路→新旭川 →稚内→新旭川→旭川→深川 →増毛→深川→滝川→富良野 →新得→富良野→旭川→深川 →滝川→岩見沢→白石
  76. 76. 最短乗車距離の見つけ方(3): 「JR全線」のようにあまりに駅数が多いときは 路線を分断してから解くと 大幅に高速化される(組み合わせ爆発回避) ※詳細は省略 詳細: http://blog.livedoor.jp/maraigue/archives/1747895.html
  77. 77. ソルバーに与えてあげる式 [最小化したい式] Σe∈A d(e)×I(e) Aは、入ってくる路線数が奇数本である駅を 2つ選んで取り出したものの集合 I(e)は、単語eを使ったときに1、そうでないときに0を返す d(e)は駅間距離(定数なので、I(e)と積を取ってよい) [条件式] 入ってくる路線数が奇数本である駅sについて Σe∈A,eの一方はs駅 I(e) = 1
  78. 78. 解いてみる ソースコード: https://github.com/maraigue/cpp-chinese-postman
  79. 79. おわりに
  80. 80. (1) グラフ理論という ツールを駆使して 「コンピュータに解ける パズル」にする
  81. 81. (2) グラフ上の最適化は 条件が1次式で 書けるなら GLPKとかで楽できる
  82. 82. ありがとう ございました

×