https://github.com/python-constraint/python-constraint
https://github.com/timnon/pyschedule
Note: install the most recent fork, (e.g. pip3.10 install "pyschedule"@git+"https://github.com/ppoile/pyschedule/#subdirectory=src")
#Adam has one hour time on Monday and Wednesday, three hours time on Thursday and fours hours time on each weekend day, Eve has two hours on Tuesday, three hours on Friday and four hours on each weekend day. Define pyschedule resources with correctly defined periods and horizons. #Monday: Adam x 1 #Tuesday: Eva x 2 #Wednesday: Adam x 1 #Thursday: Adam x 4 #Friday: Eva x 3 #Saturday: Both x 4 #Sunday : Both x 4 from pyschedule import Scenario, solvers, plotters, alt # Define the scenario S = Scenario('household_chores', horizon=15) # Two weeks # Define the resources, resource costs are not obligatory but it's more fun with them adam = S.Resource('Adam',periods=[0,3,4,5,6,7,11,12,13,14]) eve = S.Resource('Eve',periods=[1,2,8,9,10,11,12,13,14]) kitchen=S.Resource('kitchen') # Define the tasks and their durations task_costs = { "meal1": {"length":1,"delay_cost":1}, # 1 hour, schedule towards beginning of the week "meal2": {"length":1,"delay_cost":1}, "meal3": {"length":1,"delay_cost":-1}, "meal4": {"length":1,"delay_cost":-1}, # 1 hour, schedule towards end of the week "bake": {"length":2,"delay_cost":0}, # 2 hours (1 cake) "sleeping_room": {"length":2,"delay_cost":0}, # it seems there is a bug for tasks longer >1 #"CSR1": {"length":1,"delay_cost":0}, # one way how to address the bug is to split long tasks into sub-tasks coupled by tight preference constraints #"CSR2": {"length":1,"delay_cost":0}, # "bathroom": {"length":2,"delay_cost":0}, # 2 hours "living_room": {"length":3,"delay_cost":0}, # 3 hours "clean_kitchen": {"length":3,"delay_cost":0} # 3 hours } tasks={} # Define alternative resources for each task for task,costs in task_costs.items(): print(task,costs) tasks[task] = S.Task(task,length=costs['length'],delay_cost=costs["delay_cost"]) #create new task tasks[task] += adam | eve #assign resources to newly created task #additional task-resource attributions tasks["clean_kitchen"]+=kitchen tasks["meal1"]+=kitchen tasks["meal2"]+=kitchen tasks["meal3"]+=kitchen tasks["meal4"]+=kitchen tasks["bake"]+=kitchen #tight precedence constraints #S += tasks['CSR1'] <= tasks['CSR2'] #optional tasks #tasks['playground'] = S.Task('playground',length=2,schedule_cost=-1) #tasks['playground'] += alt(adam,eve) #additional constraints S += tasks['meal1'] < tasks['clean_kitchen'] S += tasks['meal2'] < tasks['clean_kitchen'] S += tasks['meal3'] < tasks['clean_kitchen'] S += tasks['meal4'] < tasks['clean_kitchen'] S += tasks['bake'] < tasks['clean_kitchen'] # Solve the scenario solvers.mip.solve(S,msg=1,kind='GUROBI') print(S) print(S.solution()) print(adam.periods) # Plot the schedule plotters.matplotlib.plot(S)
eight queen problems
map coloring problem