コード例 #1
0
def choose_best_meca_task(tasks, mecanic):
    # Task that can be done
    filtered_tasks = list(filter(lambda t: t.block.module.can_work(
        end_date_calc(max(t.meca_start, mecanic.next_freeTime), datetime.timedelta(minutes=Task.kitting)),
        end_date_calc(
            max(t.meca_start, mecanic.next_freeTime),
            datetime.timedelta(minutes=t.meca + Task.kitting)), State.meca), tasks))
    filtered_tasks.sort(key=lambda t: max(t.meca_start, mecanic.next_freeTime))
    if len(filtered_tasks) == 0:
        return None
        # raise Exception
    # Order by starttime
    return filtered_tasks[0]
コード例 #2
0
ファイル: task.py プロジェクト: paulEtse/planificateur
 def do_meca(self, resource):
     self.kitting_start = max(resource.next_freeTime, self.meca_start)
     self.state = State.oc
     self.kitting_end = end_date_calc(
         self.kitting_start, datetime.timedelta(minutes=Task.kitting))
     self.meca_start = self.kitting_end
     endTime = end_date_calc(self.meca_start,
                             datetime.timedelta(minutes=self.meca))
     self.oc_start = endTime
     self.meca_end = endTime
     self.block.module.inc(self.meca_start, self.meca_end)
     self.meca_resource = resource
     resource.next_freeTime = endTime
コード例 #3
0
ファイル: module.py プロジェクト: paulEtse/planificateur
 def best_start(self, start_, duration):
     start = start_
     index_1 = int((start - self.start).total_seconds() / 60)
     end = end_date_calc(start, duration=duration)
     index_2 = int((end - self.start).total_seconds() / 60)
     i = index_1
     while i < index_2:
         if self.nb_op[i] == 2:
             start = self.start + datetime.timedelta(minutes=i)
             end = end_date_calc(start, duration=duration)
             #index_1 = int((start - self.start).total_seconds() / 60)
             index_2 = int((end - self.start).total_seconds() / 60)
         i = i + 1
     return start
コード例 #4
0
ファイル: task.py プロジェクト: paulEtse/planificateur
 def do_oc(self, resource):
     self.oc_start = max(resource.next_freeTime, self.oc_start)
     self.state = State.finished
     endTime = end_date_calc(self.oc_start,
                             datetime.timedelta(minutes=self.oc))
     self.oc_end = endTime
     resource.next_freeTime = endTime
     self.block.module.inc(self.oc_start, endTime)
     for t in self.next:
         t.pending_prec = t.pending_prec - 1
コード例 #5
0
def choose_best_oc_task(tasks, control):
    # Task that can be done
    filtered_tasks = list(filter(lambda t: t.block.module.can_work(max(t.oc_start, control.next_freeTime),
                                                                   end_date_calc(max(t.oc_start, control.next_freeTime),
                                                                                 datetime.timedelta(
                                                                                     minutes=t.oc)), State.oc),
                                 tasks))
    filtered_tasks.sort(key=lambda t: max(t.oc_start, control.next_freeTime))
    if len(filtered_tasks) == 0:
        return None
        # raise Exception
    # Order by starttime
    return filtered_tasks[0]
コード例 #6
0
def solve():
    timeOUEST, req_matOUEST, req_taskOUEST = extract_tasks_from_excel(pathOUEST)
    timeEST, req_matEST, req_taskEST = extract_tasks_from_excel(pathEST)
    add_next2req_task(req_taskEST)
    add_next2req_task(req_taskOUEST)

    est = Module("EST")
    ouest = Module("OUEST")

    ms1 = Bloc("MS1")
    ms2 = Bloc("MS2")
    ms3 = Bloc("MS3")
    ms4 = Bloc("MS4")
    fov = Bloc("FOV")
    gtw = Bloc("GTW")
    ouest.addBloc(ms1)
    ouest.addBloc(ms4)
    ouest.addBloc(gtw)
    est.addBloc(ms2)
    est.addBloc(ms3)
    est.addBloc(fov)
    addTask2bloc(timeEST, req_matEST, req_taskEST, ms1, ms2, ms3, ms4, fov, gtw)
    addTask2bloc(timeOUEST, req_matOUEST, req_taskOUEST, ms1, ms2, ms3, ms4, fov, gtw)
    # for t in gtw.tasks:
    #    print(t.name, [a.name for a in t.next], [a.name for a in t.previous], t.pending_prec)
    # get max_date
    max_date = datetime.datetime(year=2018, month=1, day=1)
    for i in ms1.tasks + ms2.tasks + ms3.tasks + ms4.tasks + fov.tasks + gtw.tasks:
        if i.min_start > max_date:
            max_date = i.min_start
    max_date = start1_of_date(max_date)
    est.start = max_date
    ouest.start = max_date

    # Init ressources
    mecanics = [Resource("r1", Rtype.meca), Resource("r2", Rtype.meca), Resource('r3', Rtype.meca)]
    control = Resource("r1", Rtype.oc)
    for operator in mecanics:
        operator.next_freeTime = max_date
    control.next_freeTime = max_date
    #
    #
    # # la liste des tâche à faire
    ready_to_do = [ms1.tasks.pop(0), ms2.tasks.pop(0), ms3.tasks.pop(0), ms4.tasks.pop(0),
                   fov.tasks.pop(0), gtw.tasks.pop(0)]
    for t in ready_to_do:
        t.meca_start = max(max_date, t.min_start)
        t.state = State.meca
    i = 0
    meca_w = 0
    oc_w = 0
    solution = []
    while len(ready_to_do) != 0:
        i = i + 1
        # print(i)
        # Filter meca resource by next_free_time
        mecanics.sort(key=lambda x: x.next_freeTime)
        # Try to find a meca task to do
        task_found = False
        iter = 0
        task = None
        remaining_meca_tasks = list(filter(lambda x: x.state == State.meca, ready_to_do))
        if len(remaining_meca_tasks) > 0:
            # print("remaining_meca_tasks " + str(len(remaining_meca_tasks)))
            while task is None and iter < len(mecanics):
                mecanic = mecanics[iter]
                iter = iter + 1
                task = choose_best_meca_task(remaining_meca_tasks, mecanic)

            # Do meca task found
            if task is not None:
                task.do_meca(mecanic)

            if iter == len(mecanics) and task is None:
                # Todo
                # print("case except")
                for t in remaining_meca_tasks:
                    t.meca_start = t.block.module.best_start(
                        end_date_calc(t.meca_start, datetime.timedelta(minutes=Task.kitting)),
                        datetime.timedelta(minutes=t.meca))

        # Try to find an oc task to do
        remaining_oc_tasks = list(filter(lambda x: x.state == State.oc, ready_to_do))
        if len(remaining_oc_tasks) > 0:
            # print("remaining_oc_tasks " + str(len(remaining_oc_tasks)))
            task = choose_best_oc_task(remaining_oc_tasks, control)
            if task is not None:
                task.do_oc(control)
                # Ajout des prochaines tâche mais attention 1 tâche peuvent avoir plusieurs précédents
                # Dans ce cas ça marche plus
                for t in task.next:
                    if t.pending_prec == 0:
                        t.meca_start = max(task.oc_end, t.min_start)
                        ready_to_do.append(t)
                        t.state = State.meca
                # Remove the task done
                ready_to_do.remove(task)
                solution.append(task)
            else:
                # print("case except oc")
                for t in remaining_oc_tasks:
                    t.oc_start = t.block.module.best_start(t.oc_start, datetime.timedelta(minutes=t.oc))

    for sol in solution:
        print(sol)
    print("makespan: " + str(makespan(solution)))
    print("nb task done : {0}".format(len(solution)))
    # Check
    est.check()
    ouest.check()
    return convert_solution_to_df(solution)