barakplasma commited on
Commit
c3bdb1f
·
1 Parent(s): 04c48ca
Files changed (2) hide show
  1. .gitignore +1 -0
  2. main.py +0 -69
.gitignore CHANGED
@@ -8,3 +8,4 @@ wheels/
8
 
9
  # Virtual environments
10
  .venv
 
 
8
 
9
  # Virtual environments
10
  .venv
11
+ .ruff_cache
main.py DELETED
@@ -1,69 +0,0 @@
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)