this repo has no description
fork

Configure Feed

Select the types of activity you want to include in your feed.

at develop 57 lines 1.9 kB view raw
1import minizinc 2 3 4def pareto_front(instance, objectives): 5 front = [] 6 result = None 7 with instance.branch() as instance: 8 failed = False 9 while not failed: 10 result = instance.solve() 11 # print(result) 12 # print("----------------------------------------") 13 if result == None or result.status == minizinc.Status.UNSATISFIABLE: 14 failed = True 15 else: 16 to_remove = [] 17 for i in range(len(front)): 18 if all([result[o] <= front[i][o] for o in objectives]): 19 to_remove.append(i) 20 # print(to_remove[::-1]) 21 for r in to_remove[::-1]: 22 front.pop(r) 23 instance.add_string( 24 "constraint " 25 + " \/ ".join([f"{o} < {result[o]}" for o in objectives]) 26 + ";\n" 27 ) 28 front.append(result) 29 return front 30 31 32if __name__ == "__main__": 33 inst = minizinc.Instance( 34 minizinc.Solver.lookup("gurobi"), minizinc.Model("dlmo.mzn") 35 ) 36 inst.add_file("full.dzn") 37 inst.add_file("sri.dzn") 38 39 front = pareto_front(inst, ["total_samples", "total_not_detected"]) 40 front = sorted(front, key=lambda sol: sol["num_samples"]) 41 42 for sol in front: 43 print( 44 ",".join( 45 [ 46 str(sol["first_sample"]), 47 str(sol["num_samples"]), 48 str(sol["total_samples"]), 49 str(sol["num_patients"] - sol["total_not_detected"]), 50 str(sol["num_before"]), 51 str(sol["num_after"]), 52 ] 53 ) 54 ) 55 print("----------------------------------------------------") 56 for sol in front: 57 print(sol)