グラフ可視化ソフトGRINEditを使ったCollatz角谷問題の可視化その2
Blog/2006-7-17 - Rocco の日記。前回のGRINEditで可視化したFLASH(これ)は一気に全部を実行していたので、慣れない人にはわかりにくかったようです。そこでステップ実行のバージョンを作ってみました。PythonとXML-RPCとグラフ可視化ソフトGRINEditを使ったCollatz角谷問題の可視化。
こうやって「うねうねつながったもの」がリアルワールドにあったとして、「頂点1から一番離れている頂点はどれ?」と聞かれたなら、1を持ってぶら下げて一番下にたれ下がるのがどれか見てみたくなりますよね。でも、無重力だとたれ下がってくれません。そこで重力を追加したわけです。
こうやって可視化することに意味があるのか、と問われるなら「ない」と答えるでしょうねぇ…。あえて言うなら「面白いから」でしょうか。まぁ、「キミならどう書く 2.0」の参加者は、面白いから解いているんであって、意味があるから解いているわけではないと思います。賛否両論あるみたいですけど、お祭りは楽しんだ方がいいのではないかと。
なおときどきの雑記帖 リターンズの「ソートのアルゴリズムの違いによる挙動の差とか、 木構造の構築、とくにAVL-treeとかの回転(rotate)なんかはこういう風に視覚化できると わかりやすいんじゃなかろうか? 」とのご指摘はもっともです。 それを目指してNarVisualizerを作り、去年の夏のプログラミングシンポジウムで発表したのですが、これ自体よりもこれの整形エンジンの方が需要が高そうだったのでこっちは塩漬けにしてGRINEditをやっています。将来的にはGRINEditの応用例としてNarVisualizerを吸収併合する予定です。
# -*- coding: cp932 -*-
import xmlrpclib
server = xmlrpclib.Server("http://localhost:8080/RPC2")
g = server.grinedit
g.initGraph()
existVertex = {
1: g.addVertex("BoxVertex",
{"label": "1", "anchored": (0.0, 0.0)})
}
def addVertex(x):
if not(x in existVertex):
name = g.addVertex("BoxVertex", {"label": str(x)})
existVertex[x] = name
return existVertex[x]
def collatz(x):
raw_input("...")
# 次の数を求める
if x % 2:
y = x * 3 + 1
else:
y = x / 2
print x, "の次は", y, "です"
toReturn = y in existVertex
v1 = addVertex(x)
v2 = addVertex(y)
g.addEdge("LinearEdge", {"v1": v1, "v2": v2, "directed": True})
if toReturn:
print y, "はすでに計算済みなので計算を中断します"
return
collatz(y)
for i in range(2, 11):
if i in existVertex:
print i, "はすでに計算済みなのでスキップします"
continue
print i, "についての計算を始めます"
collatz(i)
raw_input("...")
#g.addLaw("PL_Gravity", {})
フィードバック
解の可視化というのであれば、前回の重力版が確かに分かりやすいのですが、どういう順序で計算されているか (アルゴリズム) という意味では今回のものが非常に分かりやすいです。 次の数の時のポコッ感が面白いです。興味も出るし、見ていると引き込まれますね。