barakplasma commited on
Commit
134aec6
·
1 Parent(s): a20ac66
Files changed (1) hide show
  1. main.py +69 -0
main.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from ortools.sat.python import cp_model
3
+
4
+
5
+ def solve_task_order(constraints_json):
6
+ # Parse input
7
+ prerequisites = []
8
+ all_tasks = set()
9
+ for req in constraints_json:
10
+ # e.g., "Sleep requires dinner"
11
+ before, _, after = req.partition(" requires ")
12
+ before = before.strip()
13
+ after = after.strip()
14
+ prerequisites.append((before, after))
15
+ all_tasks |= {before, after}
16
+ task_list = sorted(all_tasks)
17
+ task_to_idx = {task: i for i, task in enumerate(task_list)}
18
+ n_tasks = len(task_list)
19
+
20
+ # Model
21
+ model = cp_model.CpModel()
22
+
23
+ # Decision variables: order[t] = position in the sequence of task t
24
+ order = [model.NewIntVar(0, n_tasks - 1, f"order_{task}") for task in task_list]
25
+ # All tasks must have distinct positions
26
+ model.AddAllDifferent(order)
27
+
28
+ # We'll maximize the number of prerequisites that are satisfied
29
+ constraints_satisfied = []
30
+ for before, after in prerequisites:
31
+ bidx = task_to_idx[before]
32
+ aidx = task_to_idx[after]
33
+ # Boolean variable: is_constraint_ok = (order[a] < order[b])
34
+ ok = model.NewBoolVar(f"prereq_{before}_after_{after}")
35
+ model.Add(order[aidx] < order[bidx]).OnlyEnforceIf(ok)
36
+ model.Add(order[aidx] >= order[bidx]).OnlyEnforceIf(ok.Not())
37
+ constraints_satisfied.append(ok)
38
+
39
+ model.Maximize(sum(constraints_satisfied))
40
+
41
+ # Solve
42
+ solver = cp_model.CpSolver()
43
+ status = solver.Solve(model)
44
+ result = []
45
+ if status in (cp_model.OPTIMAL, cp_model.FEASIBLE):
46
+ # Build final scheduled order
47
+ # order[t] = position index, so invert the mapping
48
+ idx_to_task = {solver.Value(o): task for o, task in zip(order, task_list)}
49
+ result = [idx_to_task[i] for i in range(n_tasks)]
50
+ return json.dumps(result)
51
+
52
+
53
+ # Example usage:
54
+ if __name__ == "__main__":
55
+ input_json = [
56
+ "pizza requires ordering",
57
+ "sleep requires dinner",
58
+ "sleep requires toothbrushing",
59
+ "dinner requires prep",
60
+ "dinner requires clean_dining_room",
61
+ "prep requires shopping",
62
+ "shopping requires money",
63
+ "ordering requires money",
64
+ "money requires work",
65
+ "work requires waking_up",
66
+ "clean_dining_room requires cleaning_time",
67
+ ]
68
+ output_json = solve_task_order(input_json)
69
+ print(output_json)