89、二部图匹配问题

数据集

Assignment problem

整数规划建模

import pyscipopt
import re
import time

#记录每个函数执行的时间
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, n, M):
        self.n = n
        self.M = M
        self.X = None
        self.valueMin = None

    def __repr__(self):
        return str([self.n, len(self.M)])

def dataRead():
    data_paths1 = [r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign100.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign200.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign300.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign400.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign500.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign600.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign700.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assign800.txt"]
    data_paths2 = [r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assignp800.txt",
                   r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assignp1500.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assignp3000.txt",
                  r"/Users/zhangchaoyu/PycharmProjects/pythonProject/OR_base/OR_Library/AssignmentProblem/data/assignp5000.txt"]

    cases = []
    for path in data_paths1:
        f = open(path)
        n = int(f.readline())
        L = []
        row = f.readline().replace('\n', '').strip()
        while row != "":
            L += [int(w) for w in re.split(" ", row)]
            row = f.readline().replace('\n', '').strip()
        M = {(i+1,j+1):L[n*i+j] for i in range(n) for j in range(n)}
        cases.append(Case(n, M))

    for path in data_paths2:
        f = open(path)
        n = int(f.readline())
        M = {}
        row = f.readline().replace('\n', '').strip()
        while row != "":
            row = [int(w) for w in re.split(" ", row)]
            M[row[0], row[1]] = row[2]
            row = f.readline().replace('\n', '').strip()
        cases.append(Case(n, M))
    return cases

def IPAssignmentProblem(case, time_limit = 1000):

    n = case.n
    M = case.M

    model = pyscipopt.Model("IPAssignmentProblem")

    X = {k:model.addVar(vtype="B", name="X[%s,%s]" % (k[0], k[1])) for k in M}
    model.setObjective(pyscipopt.quicksum(M[k] * X[k] for k in M), "minimize")
    # model.setObjective(pyscipopt.quicksum(M[k] * X[k] for k in M), "maximize")

    for i in range(1, n+1):
        model.addCons(pyscipopt.quicksum(X[k] for k in M if k[0] == i) == 1)
        model.addCons(pyscipopt.quicksum(X[k] for k in M if k[1] == i) == 1)

    # 设置求解时间
    model.setRealParam("limits/time", time_limit)
    model.hideOutput()
    model.optimize()
    print("\ngap:", model.getGap())

    # 拿结果
    X1 = {k:round(model.getVal(X[k])) for k in M}
    valueMin = sum([M[k]*X1[k] for k in M])

    #存下来
    case.X = X1
    case.valueMin = valueMin

if __name__ == '__main__':
    cases = dataRead()
    for case in cases:
        IPAssignmentProblem(case, time_limit = 1000)

你可能感兴趣的:(python,算法)