def test_multi_constraintsp(self) -> None:
        # we want to schedule one task in slot [1,5] and one task into slot [7, 12]
        pb = ps.SchedulingProblem(
            "ScheduleNTasksInTimeIntervalsMultipleConstraints", horizon=20
        )
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=1, list_of_time_intervals=[[1, 5]]
        )
        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=1, list_of_time_intervals=[[7, 12]]
        )

        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        # check the solution
        task1_start = solution.tasks[task_1.name].start
        task1_end = solution.tasks[task_1.name].end
        task2_start = solution.tasks[task_2.name].start
        task2_end = solution.tasks[task_2.name].end

        task1_in_interval_1 = task1_start >= 1 and task1_end <= 5
        task2_in_interval_1 = task2_start >= 1 and task2_end <= 5
        self.assertTrue(task1_in_interval_1 != task2_in_interval_1)  # xor

        task1_in_interval_2 = task1_start >= 7 and task1_end <= 12
        task2_in_interval_2 = task2_start >= 7 and task2_end <= 12
        self.assertTrue(task1_in_interval_2 != task2_in_interval_2)  # xor

        self.assertTrue(task1_in_interval_1 != task2_in_interval_1)  # xor
        self.assertTrue(task1_in_interval_2 != task2_in_interval_2)  # xor
Ejemplo n.º 2
0
 def test_schedule_n_task_raise_exception(self) -> None:
     new_problem_or_clear()
     with self.assertRaises(TypeError):
         ps.ScheduleNTasksInTimeIntervals("list_of_tasks", 1,
                                          "list_of_time_intervals")
     with self.assertRaises(TypeError):
         ps.ScheduleNTasksInTimeIntervals([], 1, "list_of_time_intervals")
    def test_single_interval_too_small(self) -> None:
        # no way to schedule tasks with duration 3 in a slot with range 2
        pb = ps.SchedulingProblem("ScheduleNTasksInTimeIntervalsTooSmall", horizon=20)
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=2, list_of_time_intervals=[[10, 12]]
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertFalse(solution)
    def test_single_interval_no_solution(self) -> None:
        pb = ps.SchedulingProblem("ScheduleNTasksInTimeIntervalsNoSolution", horizon=20)
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2],
            nb_tasks_to_schedule=3,  # impossible!!
            list_of_time_intervals=[[10, 20]],
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertFalse(solution)
    def test_double_interval_1(self) -> None:
        pb = ps.SchedulingProblem(
            "ScheduleNTasksInTimeIntervalsDoubleInterval1", horizon=20
        )
        task_1 = ps.FixedDurationTask("task1", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1], nb_tasks_to_schedule=1, list_of_time_intervals=[[5, 7], [15, 18]]
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        self.assertEqual(solution.tasks[task_1.name].start, 15)
        self.assertEqual(solution.tasks[task_1.name].end, 18)
    def test_single_interval_2(self) -> None:
        pb = ps.SchedulingProblem("ScheduleNTasksInTimeIntervals2", horizon=20)
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=0, list_of_time_intervals=[[10, 20]]
        )

        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        # both tasks are necessarily scheduled before 10
        self.assertTrue(solution.tasks[task_1.name].end <= 10)
        self.assertTrue(solution.tasks[task_2.name].end <= 10)
    def test_triple_interval_that_overlap(self) -> None:
        pb = ps.SchedulingProblem(
            "ScheduleNTasksInTimeIntervalsTripleIntervalOverlap", horizon=20
        )
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2],
            nb_tasks_to_schedule=2,
            list_of_time_intervals=[[5, 7], [6, 8], [15, 17]],
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertFalse(solution)
    def test_double_interval_2(self) -> None:
        pb = ps.SchedulingProblem(
            "ScheduleNTasksInTimeIntervalsDoubleInterval2", horizon=20
        )
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2],
            nb_tasks_to_schedule=2,
            list_of_time_intervals=[[5, 7], [15, 18]],
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
    def test_single_interval_1(self) -> None:
        pb = ps.SchedulingProblem("ScheduleNTasksInTimeIntervals1", horizon=20)
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=2, list_of_time_intervals=[[10, 13]]
        )

        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        # both tasks start and ends at the same time
        self.assertTrue(solution.tasks[task_1.name].start == 10)
        self.assertTrue(solution.tasks[task_1.name].end == 13)
        self.assertTrue(solution.tasks[task_2.name].start == 10)
        self.assertTrue(solution.tasks[task_2.name].end == 13)
    def test_single_interval_3(self) -> None:
        pb = ps.SchedulingProblem("ScheduleNTasksInTimeIntervals3", horizon=20)
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2], nb_tasks_to_schedule=1, list_of_time_intervals=[[10, 20]]
        )
        # force task_1 to be shceduled after 10. So the only solution is that task 2 is scheduled
        # before 10
        ps.TaskStartAfterLax(task_1, 10)

        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        # both tasks are necessarily scheduled before 10
        self.assertTrue(solution.tasks[task_1.name].start >= 10)
        self.assertTrue(solution.tasks[task_2.name].end <= 10)
    def test_triple_interval_1(self) -> None:
        pb = ps.SchedulingProblem(
            "ScheduleNTasksInTimeIntervalsTripleInterval1", horizon=20
        )
        task_1 = ps.FixedDurationTask("task1", duration=3)
        task_2 = ps.FixedDurationTask("task2", duration=3)

        ps.ScheduleNTasksInTimeIntervals(
            [task_1, task_2],
            nb_tasks_to_schedule=2,
            list_of_time_intervals=[[5, 7], [11, 14], [15, 17]],
        )
        solver = ps.SchedulingSolver(pb)
        solution = solver.solve()
        self.assertTrue(solution)
        self.assertEqual(solution.tasks[task_1.name].start, 11)
        self.assertEqual(solution.tasks[task_1.name].end, 14)
        self.assertEqual(solution.tasks[task_2.name].start, 11)
        self.assertEqual(solution.tasks[task_2.name].end, 14)