複数サンタクロースの巡回問題
五反田で技術情報協会の「デジタルハーフトーニングの最適化と評価手法」阿部氏の4時間にわたる講習の資料は255枚。FFhで「すべてがFになって」終わるという辺りが実に凝っていた。4時間の講習というような場合には、本番で初めて「最初から最後まで喋る」とならざるをえないから、結構時間調整に不安を感じたりすると思うが、その状態でFFh枚に調整できる辺りがスゴイ。
巡回セールスマン問題の解説では借力氏の「超東京地図」が例に出されており、思わず笑ってしまった。エッシャーのDay and Nightスクリーンや純愛スクリーンや…と、とても楽しめた。気に入ったスライドの内の一枚は「最適解を探すためのやり方」を示した次のようなスライド。(ちょっと変えてあるけれど)
集中化と多様化・集中化 ・「良い解に近いところには、良い解が存在する」 という性質を信じ、良い解の周りで集中的に探索・多様化 ・「悪い解の周りで彷徨い、良い解に出会えない」 ことを避けるため、今までと違う場所を強制的に探索
夜は、きっと最初で最後の武道館アリーナ最前列。アンコール最後「
私が見てきた全てのこと 無駄じゃないよって君に言って欲しい」の"
ハローグッバイ"まで二時間半。




まだまだ、「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Playerの組み合わせ技」にハマっています。素晴らしく楽しく使うことができる言語環境Mathematicaと、やはり素晴らしく便利なRubyと、そして(多分便利な).NETを一緒に用いることができるというのは、とてもエキサイティングな体験だからです。
今日は、まずは「Mathematicaの使い方」を眺めながら、クラスタ分析をIronRuby+Mathematica Playerでなぞってみました。
include System
require 'Wolfram.NETLink'
include Wolfram::NETLink
kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
result=kernelLink.EvaluateToOutputForm(
'datarecords = {
{"Joe", "Smith", 158, 64.4},
{"Mary", "Davis", 137, 64.4},
{"Bob", "Lewis", 141, 62.8},
{"John", "Thompson", 235, 71.1},
{"Lewis", "Black", 225, 71.4},
{"Sally", "Jones", 168, 62.},
{"Tom", "Smith", 243, 70.9},
{"Jane", "Doe", 225, 71.4}};', 0)
result=kernelLink.EvaluateToOutputForm(
'FindClusters[Drop[datarecords, None,
{1, 2}] -> datarecords]', 0)
puts result
kernelLink.close
こうコードを書くと、各人の身長と体重のデータを用いて、それらの人を何グループかにクラスタリングを行うことが簡単にできます。たとえば、こんな結果が返ってきます。
{{{Joe, Smith, 158, 64.4}, {Mary,Davis, 137, 64.4}, {Bob, Lewis, 141, 62.8},{Sally, Jones, 168, 62.}}, {{John,Thompson, 235, 71.1}, {Lewis, Black, 225, 71.4}, {Tom, Smith, 243,70.9}, {Jane, Doe, 225, 71.4}}}
見事にクラスタリングされています。もちろん、これは、Mathematicaのマニュアルそのままのコードです。けれどそんな処理をRubyで行うことができて、その結果をRubyでさらに使うことができるのはとても便利です。
あるいは、
include System
require 'Wolfram.NETLink'
include Wolfram::NETLink
kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
result=kernelLink.EvaluateToOutputForm(
'FindShortestTour[
{{4, 3}, {1, 1}, {2, 3}, {3, -5},
{-1, 2}, {3, 4}}]', 0)
puts result
kernelLink.close
なんていうコードを書けば、二次元座標群を「どうすれば最短時間(距離)で巡ることができるか?」という巡回セールスマン問題を解くことができます。もちろん、答えはすぐ返ってきて、
{11 + Sqrt[2] + Sqrt[5] + 3 Sqrt[10],
{1, 3, 5, 2, 4, 6}}
というように、「最短距離」と「どのように点(都市)を廻れば良いか」がたちどころにわかります。
クラスタ分析、巡回セールスマン問題・・・ありとあらゆる問題を、IronRubyとMathematica Playerのタッグは解いてくれます。「IronRuby」+「Mathematica Player」を使っていると、「∞の可能性」を実現できるような「錯覚」を覚えます