ChatGPTを信じすぎていた
あるグラフGに対して、部分グラフSを用意し、この部分グラフと同型な部分グラフがGに含まれているかを判定するプログラムを書きたかったのだが、なにはともあれChatGPT先生は優秀なので、もちろん投げた。
その結果が以下である。
import networkx as nx
from networkx.algorithms.isomorphism import GraphMatcher
# メイングラフ G
G = nx.Graph()
G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (0, 2)])
# サブグラフ S
S = nx.Graph()
S.add_edges_from([(0, 1), (1, 2), (2, 0)])
# GraphMatcher の使用
GM = GraphMatcher(G, S)
# 同型性の確認
if GM.subgraph_is_isomorphic():
print("同型部分グラフが存在します。")
# 同型部分のノードマッピングを取得
isomorphisms = list(GM.isomorphisms_iter())
print("ノードマッピング:", isomorphisms)
ここで一つ問題が起きた。同型な部分グラフが存在するというのはちゃんと返ってくるのだが、ノードのマッピングがすべて空の状態であった。
なんで、同型な部分グラフは存在するのにマッピングが返ってこないねん!!ってことで、ChatGPTに何度も訪ねたがかえってきたのは、ノードやエッジに属性が指定されているとなんかおかしなことになるねんだとか、サブグラフはちゃんとしてますか?表示プログラム書いてあげますよ?とかの回答ばかりだった。
解決への道
そんなこんなで、悪戦苦闘すること2時間。
いろんなグラフをいれてみたときに、たまにマッピングが表示されることに気が付いた。そして、よく考えてみると、まったく同じ頂点数、辺の数の場合にマッピングが返ってきていることに気が付いた!
もしかして、部分グラフの同型性のマッピングじゃなくて、同型性のマッピングになってないか?と思った。なぜなら、GM.subgraph_is_isomorphic()
はsubgraphとついているのに対して, GM.isomorphism_iter()
はsubgraphがついていない。
これは来たかも!っと思って、ChatGPTに尋ねたけど、同じ解答ばかり。そこで、仕方ないので、公式ドキュメントにいった。
そこの関数一覧を調べると、なんと!!
GM.subgraph_isomophism_iter()
という関数があるではないですか!!
はい、ということで、あるグラフGに対する部分グラフSのマッピングを表示したい場合は、GM.isomorphism_iter()
ではなく、GM.subgraph_is_isomorphic()
を使いましょうということです。
そして、ChatGPTを信じすぎてしまったことで2時間も費やしてしまった自分に反省していますが、やっぱりChatGPTを信じたいという気持ちはあります。
はい、これからは気を付けたいと思います。