Beispiel #1
0
def solveone(colnum, filename):
    graph = dimacs.loadGraph("all-instaces/" + filename)
    edgelist = dimacs.edgeList(graph)
    sat = graphcoloringtosat(graph, colnum)
    # print(sat)
    sol = pycosat.solve(sat)

    # print("\n", sol)
    if sol != u'UNSAT':
        print(checkcolouring(sol, edgelist, colnum))
Beispiel #2
0
def remove_edges(graph, u, v):
    for neigh_u in graph[u].copy():
        graph[u].remove(neigh_u)
        graph[neigh_u].remove(u)

    for neigh_v in graph[v].copy():
        graph[v]. remove(neigh_v)
        graph[neigh_v].remove(v)

    return dim.edgeList(graph)
Beispiel #3
0
def find_coverage(graph, vertices, valid_graph):
    graph_list = dim.edgeList(graph)
    solution = set()

    while len(solution) < vertices - 1 and graph_list:
        u, v = graph_list.pop()
        graph_list = remove_edges(graph, u, v)
        solution.add(u)
        solution.add(v)
        if solution is not None and dim.isVC(valid_graph, solution):
            return solution
Beispiel #4
0
def graphcoloringtosat(graph, k):
    edgeList = dimacs.edgeList(graph)
    satclause = []
    vertexclauses = []
    for i, j in edgeList:
        if i not in vertexclauses:
            satclause += preparevertexclause(i, k)
            vertexclauses += [i]
        if j not in vertexclauses:
            satclause += preparevertexclause(j, k)
            vertexclauses += [j]
        satclause += prepareedgeclause(i, j, k)
    return satclause
Beispiel #5
0
def coverage_2approx(name):
    # load graph
    path = 'graph\\' + name
    graph = dim.loadGraph(path)
    solution_path = path + '.sol'

    # find coverage
    graph_list = dim.edgeList(graph)
    vertices = len(graph)

    graph_copy = copy.deepcopy(graph)
    solution = find_coverage(graph_copy, vertices, graph_list)
    dim.saveSolution(solution_path, solution)
    print('Solution for: ' + name + ' saved')
Beispiel #6
0
def solveall():
    directory = os.fsencode("all-instaces")
    for file in os.listdir(directory):
        filename = os.fsdecode(file)
        if filename.endswith(".col"):
            print(filename)
            graph = dimacs.loadGraph("all-instaces/" + filename)
            edgelist = dimacs.edgeList(graph)
            g = copy.deepcopy(graph)
            k = 2
            sol = pycosat.solve(graphcoloringtosat(g, k))
            while sol == u'UNSAT' and k < 1000:
                print(k)
                k += 1
                g = copy.deepcopy(graph)
                sol = pycosat.solve(graphcoloringtosat(g, k))

            print(filename, k, checkcolouring(sol, edgelist, k))
Beispiel #7
0
def check_coverage(name):
    path = 'graph\\' + name
    solution_filename = 'graph\\' + name + '.sol'
    graph = dim.loadGraph(path)
    graph_list = dim.edgeList(graph)
    vertices = len(graph)
    solution = set()
    size = 0

    for k in range(1, vertices):
        if not graph[k]:
            solution.add(k)
            size += 1

    solution_copy = copy(solution)
    for k in range(size, vertices):
        solution = find_coverage(graph_list, solution_copy, k)
        if solution is not None and dim.isVC(graph_list, solution):
            dim.saveSolution(solution_filename, solution)
            break