pro = """
Graph colouring
There are 30 test problems.
These test problems are the test problems involving 100 and 300 nodes as in Table 6 of the paper Fleurent C. and Ferland J.A. (1996) Genetic and hybrid algorithms for graph coloring, Annals of Opns Res. 63, 437-461.
These test problems are gcol1, gcol2, ..., gcol30
These test problems are in DIMACS format (e.g. see here for a link to a description of that format) and have been contributed by Dr Bill Dowsland (w.b.dowsland@btconnect.com)
"""
import re
import time
import pyscipopt
#记录每个函数执行的时间
loop = 1
def timeLog(f):
def wrapper(*args, **kw):
global loop
now = time.perf_counter()
res = f(*args, **kw)
print("%s-%s:"%(loop, f.__name__), time.perf_counter()-now)
loop += 1
return res
return wrapper
class Case:
def __init__(self, name, nodes, edges):
self.name = name
self.nodes = nodes
self.edges = edges
def __repr__(self):
return str([self.name, len(self.nodes), len(self.edges)])
def dataRead():
dataPaths = [r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_Library/GraphColoring/data/gcol{}.txt".format(i) for i in range(1,31)]
cases = []
name = 0
for dataPath in dataPaths:
name += 1
f = open(dataPath)
#读name
row = f.readline().replace('\n', '').strip()
row = [w for w in re.split(" ", row)]
numNodes = int(row[2])
numEdges = int(row[3])
nodes = {i for i in range(1, numNodes+1)}
edges = set()
for _ in range(numEdges):
row = f.readline().replace('\n', '').strip()
row = [w for w in re.split(" ", row)]
edges.add((int(row[1]), int(row[2])))
cases.append(Case(name, nodes, edges))
return cases
#假设有m个任务,n个机器,ail表示第i个任务在第l个任务上的作业时间
def IP(case, time_limit, printLog=False):
model = pyscipopt.Model("IP")
nodes, edges = case.nodes, case.edges
n = len(nodes)
m = n
#第i个节点是否分配第k种颜色
X = {(i,k):model.addVar(vtype="B", name="X[%s,%s]" % (i, k)) for i in nodes for k in range(m)}
Y = {k:model.addVar(vtype="B", name="Y[%s]" % k) for k in range(m)}
#用的颜色最少
model.setObjective(pyscipopt.quicksum(Y[k] for k in range(m)), "minimize")
#每个点用一个颜色
for i in nodes:
model.addCons(pyscipopt.quicksum(X[i,k] for k in range(m)) == 1)
#颜色启用后才能使用
for i in nodes:
for k in range(m):
model.addCons(X[i,k] <= Y[k])
#如果相邻则不能用同一种颜色
for (i,j) in edges:
for k in range(m):
model.addCons(X[i, k] + X[j, k] <= 1)
# 设置求解时间
model.setRealParam("limits/time", time_limit)
if not printLog:
model.hideOutput()
model.optimize()
print("\ngap:", model.getGap())
# 拿结果
X1 = {(i,k):round(model.getVal(X[i,k])) for i in nodes for k in range(m)}
Y1 = {k:round(model.getVal(Y[k])) for k in range(m)}
return X1, Y1
def runOne(case):
X1, Y1 = IP(case, 100, True)
#
return X1, Y1
if __name__ == '__main__':
#1-读数据
cases = dataRead()
#2-runOne
X, Y = runOne(cases[0])
#3-runMore
#todo:尝试用启发式方法优化,将待染色的点做成序列,用2opt,常规的初始解可以参考点的度数
98、图染色问题
最新推荐文章于 2025-08-26 17:52:52 发布