Dateien nach "ILP" hochladen
Now ILP solver picks optimal combination of two different similarities and similarity can also be calcuated using the mean of similarity instead of the comparitive value
This commit is contained in:
+67
-25
@@ -33,6 +33,10 @@ VERTICES1 = {
|
||||
8: ([0, 0], ['Caffeine']),
|
||||
}
|
||||
|
||||
#25014CX3
|
||||
|
||||
#03
|
||||
|
||||
VERTICES2 = {
|
||||
1: ([0], ['Xanthine']),
|
||||
2: ([0], ['p_{0,0}']),
|
||||
@@ -47,69 +51,107 @@ VERTICES2 = {
|
||||
VERTICES = ['Xanthine', 'p_{0,0}', 'p_{0,1}', 'p_{0,2}', 'p_{0,3}', 'p_{0,4}', 'p_{0,5}', 'Caffeine']
|
||||
|
||||
NMRLIKELYHOODS = [0.0, 0.2, 0.7, 0.1, 0.1, 0.2, 0.7, 0.0]
|
||||
NMRLIKELYHOODS1 = [0.75, 0.59, 0.36, 0.89, 0.59, 0.86, 0.78, 0.65]
|
||||
NMRLIKELYHOODS2 = [0.56, 0.75, 0.45, 0.79, 0.75, 0.76, 0.84, 0.74]
|
||||
NMRLIKELYHOODS3 = [0.54, 0.53, 0.7, 0.77, 0.53, 0.85, 0.94, 0.79]
|
||||
NMRLIKELYHOODS1 = [0.54, 0.52, 0.43, 0.62, 0.52, 0.56, 0.48, 0.5]
|
||||
NMRLIKELYHOODS2 = [0.52, 0.52, 0.52, 0.61, 0.52, 0.56, 0.61, 0.59]
|
||||
NMRLIKELYHOODS3 = [0.5, 0.53, 0.59, 0.59, 0.53, 0.56, 0.68, 0.62]
|
||||
|
||||
FIXED_FLOWS = {
|
||||
1: 1,
|
||||
14: 1,
|
||||
}
|
||||
|
||||
def build_model(name, hyperedges, vertices, nmrlikelihoods, excluded_support=None):
|
||||
def build_model(name, hyperedges, vertices, nmrlikelihoods1, nmrlikelihoods2, nmrlikelihoods3, excluded_support=None):
|
||||
model = Model(name)
|
||||
|
||||
x = {e_id: model.addVar(vtype=GRB.INTEGER, lb=0, name=f"x_{e_id}") for e_id in hyperedges}
|
||||
b = {e_id: model.addVar(vtype=GRB.BINARY, name=f"b_{e_id}") for e_id in hyperedges}
|
||||
n = model.addVars(vertices, vtype=GRB.CONTINUOUS, lb=0.0, ub=1.0, name="nmr")
|
||||
x = {e_id: model.addVar(vtype=GRB.INTEGER, lb = 0, name = f"x_{e_id}") for e_id in hyperedges}
|
||||
b = {e_id: model.addVar(vtype=GRB.BINARY, name = f"b_{e_id}") for e_id in hyperedges}
|
||||
n1 = model.addVars(vertices, vtype=GRB.CONTINUOUS, lb = 0.0, ub = 1.0, name = "nmr1")
|
||||
n2 = model.addVars(vertices, vtype=GRB.CONTINUOUS, lb = 0.0, ub = 1.0, name = "nmr2")
|
||||
n3 = model.addVars(vertices, vtype=GRB.CONTINUOUS, lb = 0.0, ub = 1.0, name = "nmr3")
|
||||
c1 = model.addVars(vertices, vtype = GRB.BINARY, name = "n1_choice")
|
||||
c2 = model.addVars(vertices, vtype = GRB.BINARY, name = "n2_choice")
|
||||
c3 = model.addVars(vertices, vtype = GRB.BINARY, name = "n3_choice")
|
||||
|
||||
|
||||
for v, nmr in zip(vertices, nmrlikelihoods):
|
||||
n[v] = nmr
|
||||
print(f'Vertice: {v}, Similarity: {n[v]}')
|
||||
for v, nmr in zip(vertices, nmrlikelihoods1):
|
||||
n1[v] = nmr
|
||||
#print(f'Vertice: {v}, Similarity: {n1[v]}')
|
||||
for v, nmr in zip(vertices, nmrlikelihoods2):
|
||||
n2[v] = nmr
|
||||
|
||||
for v, nmr in zip(vertices, nmrlikelihoods3):
|
||||
n3[v] = nmr
|
||||
|
||||
vertices = set(v for tails, heads in hyperedges.values() for v in tails + heads)
|
||||
|
||||
for v in vertices:
|
||||
inflow = quicksum(x[e_id] for e_id, (_, heads) in hyperedges.items() if v in heads)
|
||||
outflow = quicksum(x[e_id] for e_id, (tails, _) in hyperedges.items() if v in tails)
|
||||
model.addConstr(inflow == outflow, name=f"flow_conservation_{v}")
|
||||
model.addConstr(inflow == outflow, name = f"flow_conservation_{v}")
|
||||
|
||||
for e_id, value in FIXED_FLOWS.items():
|
||||
model.addConstr(x[e_id] == value, name=f"fixed_flow_{e_id}")
|
||||
model.addConstr(x[e_id] == value, name = f"fixed_flow_{e_id}")
|
||||
|
||||
for e_id in hyperedges:
|
||||
model.addGenConstrIndicator(b[e_id], 0, x[e_id] == 0, name=f"unused_implies_zero_{e_id}")
|
||||
model.addConstr(x[e_id] >= b[e_id], name=f"used_implies_positive_flow_{e_id}")
|
||||
model.addGenConstrIndicator(b[e_id], 0, x[e_id] == 0, name = f"unused_implies_zero_{e_id}")
|
||||
model.addConstr(x[e_id] >= b[e_id], name = f"used_implies_positive_flow_{e_id}")
|
||||
|
||||
reaction_path = {}
|
||||
|
||||
#for v_id in vertices:
|
||||
#model.addConstr()
|
||||
|
||||
if excluded_support:
|
||||
model.addConstr(quicksum(b[e_id] for e_id in excluded_support) <= len(excluded_support) - 1, name="different_hyperedges",)
|
||||
model.addConstr(quicksum(b[e_id] for e_id in excluded_support) <= len(excluded_support) - 1, name = "different_hyperedges",)
|
||||
|
||||
#Multiplizier den node Wert mit infow + outflow
|
||||
|
||||
#model.setObjective(quicksum(n[v_id] for v_id in vertices), GRB.MINIMIZE) #Maximize Similarity of Nodes
|
||||
model.ModelSense = GRB.MAXIMIZE
|
||||
#Multiply with a list of binarys where only one value is one and the rest zero and not both the same position
|
||||
'''
|
||||
model.setObjectiveN(
|
||||
quicksum(n[t_id[0]] * x[e_id] for e_id, (_, t_id) in hyperedges.items() if t_id != []),
|
||||
index=0,
|
||||
priority=2,
|
||||
name="maximize_nmr_similarity",
|
||||
quicksum(n1[v_id] * c1[v_id] for v_id in vertices if v_id != [])
|
||||
+ quicksum(n3[v_id] * c3[v_id] for v_id in vertices if v_id != []),
|
||||
index = 0,
|
||||
priority = 2,
|
||||
name = "maximize_nmr_similarity",
|
||||
)
|
||||
'''
|
||||
|
||||
#Multiply node value with infow or outflow
|
||||
'''
|
||||
model.setObjectiveN(
|
||||
quicksum(n1[t_id[0]] * c1[t_id[0]] * x[e_id] for e_id, (_, t_id) in hyperedges.items() if t_id != [])
|
||||
+quicksum(n3[t_id[0]] * c3[t_id[0]] * x[e_id] for e_id, (_, t_id) in hyperedges.items() if t_id != []),
|
||||
index = 0,
|
||||
priority = 2,
|
||||
name = "maximize_nmr_similarity",
|
||||
)
|
||||
'''
|
||||
|
||||
#Hybrid of both above
|
||||
model.setObjective(
|
||||
quicksum(n1[t_id[0]] * c1[t_id[0]] * x[e_id] for e_id, (_, t_id) in hyperedges.items() if t_id != [])
|
||||
+quicksum(n3[t_id[0]] * c3[t_id[0]] * x[e_id] for e_id, (_, t_id) in hyperedges.items() if t_id != []),
|
||||
sense = GRB.MAXIMIZE,
|
||||
)
|
||||
|
||||
|
||||
model.addConstr(gp.quicksum(c1[v_id] for v_id in vertices) == 1)
|
||||
model.addConstr(gp.quicksum(c3[v_id] for v_id in vertices) == 1)
|
||||
for v_id in vertices:
|
||||
model.addConstr(c1[v_id] + c3[v_id] <= 1)
|
||||
|
||||
model.addConstr(gp.quicksum(x[e_id] for e_id, (_, t_id) in hyperedges.items()) == 5)
|
||||
''''
|
||||
model.setObjectiveN(
|
||||
quicksum(-1 *b[e_id] for e_id in hyperedges),
|
||||
index=1,
|
||||
priority=1,
|
||||
name="minimize_used_hyperedges",
|
||||
)
|
||||
'''
|
||||
|
||||
return model, x, b
|
||||
|
||||
def positive_entries(variable_dict, threshold=0.5):
|
||||
def positive_entries(variable_dict, threshold = 0.5):
|
||||
return {e_id: var.X for e_id, var in variable_dict.items() if var.X > threshold}
|
||||
|
||||
def print_solution(title, flow_solution, binary_solution, hyperedges):
|
||||
@@ -126,7 +168,7 @@ def print_solution(title, flow_solution, binary_solution, hyperedges):
|
||||
print(f"Number of used hyperedges: {len(binary_solution)}")
|
||||
|
||||
def main():
|
||||
model, x, b = build_model("HypergraphFlow", HYPEREDGES, VERTICES, NMRLIKELYHOODS)
|
||||
model, x, b = build_model("HypergraphFlow", HYPEREDGES, VERTICES, NMRLIKELYHOODS1, NMRLIKELYHOODS2, NMRLIKELYHOODS3)
|
||||
model.optimize()
|
||||
if model.status != GRB.Status.OPTIMAL:
|
||||
print("No optimal solution found for the first model.")
|
||||
|
||||
Reference in New Issue
Block a user