diff --git a/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py b/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py index 5e12bc1a12e6deef15054e41905f8156818d9fd4..2d84cf7d0527d162c82b0f5b00bd9f76d4e84c8d 100755 --- a/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py +++ b/python/conda package/k_hop_dominating_set_gurobi/k_hop_dominating_set_gurobi/k_hop_dom_set.py @@ -11,7 +11,7 @@ from gurobipy import GRB import datetime import sys import matplotlib.pyplot as plt -#import lp_to_nx_graph +import lp_to_nx_graph from itertools import combinations from enum import Enum @@ -37,9 +37,10 @@ class KHopDominatingSet(): def solve(self): # TODO: refactor, maybe use self.nodes directly - ds = {i for i,x_i in enumerate(self.m.getVars()) if x_i.x == 1} + self.m.optimize() + ds = {v for v in self.G.nodes if self.nodes[v].x > 0.5} return ds - + def solve_and_draw(self): starttime = datetime.datetime.now() ds = self.solve() @@ -68,6 +69,7 @@ class ConnectedKHopDominatingSet(KHopDominatingSet): def __init__(self, G, k, name = "CkDS", exclude = {}, constraints = ConnectivityConstraint.SEPARATORS): self.G = G super().__init__(G, k, name) + self.m._rooted = False self.constraints = constraints @@ -154,15 +156,13 @@ class ConnectedKHopDominatingSet(KHopDominatingSet): self.m._G = self.G self.m.Params.lazyConstraints = 1 self.m.optimize(ConnectedKHopDominatingSet.elim_unconnectivity) - - elif ConnectivityConstraint.INDEGREE == self.constraints: - self.m.optimize() + # self.m.optimize() elif ConnectivityConstraint.MILLER_TUCKER_ZEMLIN == self.constraints: self.m.optimize() elif ConnectivityConstraint.MARTIN == self.constraints: self.m.optimize() - ds = {i for i,x_i in enumerate(self.m.getVars()) if x_i.x > 0.5} + ds = {v for v in self.G.nodes if self.nodes[v].x > 0.5} return ds # Probably uncorrect version @@ -203,25 +203,72 @@ class ConnectedKHopDominatingSet(KHopDominatingSet): # model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[h] + model._vars[l] - 1) # V2 - def elim_unconnectivity(model, where): - if where == GRB.Callback.MIPSOL: - vals = model.cbGetSolution(model._vars) - ds = {i for i in model._vars.keys() if vals[i] > 0.5} + # def elim_unconnectivity(model, where): + # if where == GRB.Callback.MIPSOL: + # vals = model.cbGetSolution(model._vars) + # ds = {i for i in model._vars.keys() if vals[i] > 0.5} - G_prime_prime = model._G.subgraph(ds) - if(not nx.is_connected(G_prime_prime)): - C = [c for c in nx.algorithms.components.connected_components(G_prime_prime)] - for i in range(len(C)): - C_i = C[i] - for j in range(len(C)): - C_j = C[j] - h = next(iter(C_i)) - l = next(iter(C_j)) - min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(model._G, h, l, C_i) - if min_ij_sep: - for w in C_i: - model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[w] + model._vars[l] - 1) + # G_prime_prime = model._G.subgraph(ds) + # if(not nx.is_connected(G_prime_prime)): + # C = [c for c in nx.algorithms.components.connected_components(G_prime_prime)] + # for i in range(len(C)): + # C_i = C[i] + # for j in range(len(C)): + # C_j = C[j] + # h = next(iter(C_i)) + # l = next(iter(C_j)) + # min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(model._G, h, l, C_i) + # if min_ij_sep: + # for w in C_i: + # model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[w] + model._vars[l] - 1) + # V3 + def elim_unconnectivity(model, where): + if where == GRB.Callback.MIPSOL: + if model._rooted: + vals = model.cbGetSolution(model._vars) + ds = {i for i in model._vars.keys() if vals[i] > 0.5} + + G_prime_prime = model._G.subgraph(ds) + if(not nx.is_connected(G_prime_prime)): + C = [c for c in nx.algorithms.components.connected_components(G_prime_prime)] + C_root = [c for c in C if model._root in c].pop() # this is really awkward. Try to find something better! + for i in range(len(C)): + C_i = C[i] + if C_i != C_root: + h = next(iter(C_i)) + l = model._root + min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(model._G, h, l, C_i) + if min_ij_sep: + for w in C_i: + model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[w] + model._vars[l] - 1) + else: + for j in range(len(C)): + C_j = C[j] + h = model._root + l = next(iter(C_j)) + min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(model._G, h, l, C_i) + if min_ij_sep: + for w in C_i: + model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[w] + model._vars[l] - 1) + else: + vals = model.cbGetSolution(model._vars) + ds = {i for i in model._vars.keys() if vals[i] > 0.5} + + G_prime_prime = model._G.subgraph(ds) + if(not nx.is_connected(G_prime_prime)): + C = [c for c in nx.algorithms.components.connected_components(G_prime_prime)] + for i in range(len(C)): + C_i = C[i] + for j in range(len(C)): + C_j = C[j] + h = next(iter(C_i)) + l = next(iter(C_j)) + min_ij_sep = ConnectedKHopDominatingSet.min_ij_separator(model._G, h, l, C_i) + if min_ij_sep: + for w in C_i: + model.cbLazy(gp.quicksum(model._vars[s] for s in min_ij_sep) >= model._vars[w] + model._vars[l] - 1) + class RootedConnectecKHopDominatingSet(ConnectedKHopDominatingSet): def __init__(self, G, k, root = 0, name = "RCkDS", constraints = ConnectivityConstraint.SEPARATORS): @@ -230,12 +277,20 @@ class RootedConnectecKHopDominatingSet(ConnectedKHopDominatingSet): self.m.addConstr(self.nodes[root] >= 1) + # self.m.addConstr(gp.quicksum(self.nodes) >= 12) + # self.add_all_combinations_root_separators() # print("neighborhood separators:") # self.add_all_neighborhood_root_separators() # print("single node separators:") # self.add_single_root_separators() + + def solve(self): + self.m._root = self.root + self.m._rooted = True + return super().solve() + def add_single_root_separators(self): number_of_found_separators = 0 for i in self.G.nodes: @@ -297,9 +352,11 @@ class RootedConnectecKHopDominatingSet(ConnectedKHopDominatingSet): if __name__ == '__main__': - G = lp_to_nx_graph.read(sys.argv[1]) - G = G.to_undirected() - + filename = sys.argv[1] + if filename.endswith(".lp"): + G = lp_to_nx_graph.read(sys.argv[1]) + else: + G = nx.read_graphml(sys.argv[1]) if(len(sys.argv) > 2): k = int(sys.argv[2]) else: @@ -308,5 +365,7 @@ if __name__ == '__main__': # G = lp_to_nx_graph.read("/home/mario/Dokumente/Uni/Bachelorarbeit/git_repo/bachelor-mario-surlemont/python/lp graphs/small-leaf.lp") # k = 1 - dsProb = RootedConnectecKHopDominatingSet(G, k, 0, constraints = ConnectivityConstraint.SEPARATORS) + dsProb = RootedConnectecKHopDominatingSet(G, k, next(iter(G.nodes)), constraints = ConnectivityConstraint.SEPARATORS) dsProb.solve_and_draw() + # ds = KHopDominatingSet(G,k) + # ds.solve_and_draw()