그래프의 반음계 수를 찾는 것은 NP 하드 문제이므로 '이론적으로는'빠른 솔버가 없습니다. 그래프의 정확한 반음계 수를 신속하게 계산할 수있는 공개적으로 사용 가능한 소프트웨어가 있습니까?색도에 대한 빠른 정확도 해석기
많은 그래프의 반음계를 계산하는 Python 스크립트를 작성하고 있지만 작은 그래프의 경우에도 너무 오래 걸립니다. 그래프 나는 스파 스 또는 밀도가 있지만 일반적으로 10,000 개 미만의 노드 일 수있는 광범위한 그래프로 작업하고 있습니다. 나는 문제를 정수형 프로그램으로 공식화하고 해결하기 위해 구로 비 (Gurobi)에 전달했다. 소프트웨어, 다른 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와 같은 휴리스틱을 사용하여 로컬 미니 마에서 벗어나 비관적 인 답변을 얻을 수 있다고 생각합니다. 나는 그들을 더 자세히 살펴보고 내가 찾은 것을 여기에 다시보고 할 것이다. 당신의 도움을 주셔서 감사합니다! 이것은 확실히 내가 생각하고 있지 않은 영역이었습니다. –