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))
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)
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
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
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')
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))
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