グラフの色数を見つけることはNP困難な問題であるため、理論的には高速なソルバはありません。グラフの正確な色数をすばやく計算できる一般に公開されているソフトウェアはありますか?クロマの高速完全ソルバ
私は、多くのグラフの色数を計算するPythonスクリプトを書いていますが、それは小さなグラフでさえ長すぎます。グラフ私は疎または密であるが通常10,000ノード以下の幅広いグラフを扱っている。私は問題を整数計画として定式化し、それをグロビに渡して解いた。あなたは、ソフトウェア、異なるIP公式、またはこれをスピードアップするための異なるGurobi設定の推奨を持っていますか?私は、彼らがそのような一定の係数近似として合理的な理論的な保証を持っている場合、おおよその色彩の数値を計算するアルゴリズムに興味があるが、正確な色彩の数値を計算するために探しています
import networkx as nx
from gurobipy import *
# create test graph
n = 50
p = 0.5
G = nx.erdos_renyi_graph(n, p)
# compute chromatic number -- ILP solve
m = Model('chrom_num')
# get maximum number of variables necessary
k = max(nx.degree(G).values()) + 1
# create k binary variables, y_0 ... y_{k-1} to indicate whether color k is used
y = []
for j in range(k):
y.append(m.addVar(vtype=GRB.BINARY, name='y_%d' % j, obj=1))
# create n * k binary variables, x_{l,j} that is 1 if node l is colored with j
x = []
for l in range(n):
x.append([])
for j in range(k):
x[-1].append(m.addVar(vtype=GRB.BINARY, name='x_%d_%d' % (l, j), obj=0))
# objective function is minimize colors used --> sum of y_0 ... y_{k-1}
m.setObjective(GRB.MINIMIZE)
m.update()
# add constraint -- each node gets exactly one color (sum of colors used is 1)
for u in range(n):
m.addConstr(quicksum(x[u]) == 1, name='NC_%d' % u)
# add constraint -- keep track of colors used (y_j is set high if any time j is used)
for u in range(n):
for j in range(k):
m.addConstr(x[u][j] <= y[j], name='SH_%d_%d' % (u,j))
# add constraint -- adjacent nodes have different colors
for u in range(n):
for v in G[u]:
if v > u:
for j in range(k):
m.addConstr(x[u][j] + x[v][j] <= 1, name='ADJ_%d_%d_COL_%d' % (u,v,j))
# update model, solve, return the chromatic number
m.update()
m.optimize()
chrom_num = m.objVal
など
こんにちは@tomkot、ここで遅れて返答して申し訳ありません - 私はあなたの助けに感謝します! SATソルバーは良い方法だと思います。しかし、私は多くの人がWalkSATのようなヒューリスティクスを使って極小に詰まり、悲観的な答えを返すことになるのではないかと心配しています。私はそれらをさらに調べて、私が見つけたものをここに報告します。ご協力いただきありがとうございます!これは間違いなく私が考えていなかったエリアでした。 –