98、图染色问题

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,常规的初始解可以参考点的度数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值