Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
LongxingTan committed Aug 9, 2023
1 parent a397670 commit 773a1aa
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 60 deletions.
2 changes: 2 additions & 0 deletions docs/source/application.rst
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ BOM: Bill Of Materials
·更新当前任务后续节点的最早开工时间,若当前任务为产品的最后一个工序则无须更新
8、判断所有任务是否均已完工,是则结束,否则返回步骤四。

解决冲突的过程,即是一个顺排的过程。把所有分布在该资源上的任务根据顺序进行顺排


可视化
------------
Expand Down
2 changes: 1 addition & 1 deletion docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ subject to:
Finite Capacity Planning

.. toctree::
:maxdepth: 5
:maxdepth: 2
:caption: Contents:

rules
Expand Down
2 changes: 1 addition & 1 deletion lekin/lekin_struct/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,4 @@ def __hash__(self):
return

def __str__(self):
return
return f"{self.job_id}"
2 changes: 1 addition & 1 deletion lekin/lekin_struct/material.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""
物料
Material
- 物料可以锁定,可以占用,可以空闲
"""
9 changes: 2 additions & 7 deletions lekin/lekin_struct/operation.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
"""
Struct Operation/工序
property
method
Operation Struct
"""

from typing import Any, Callable, Dict, List, Optional, Tuple, Union
Expand Down Expand Up @@ -110,4 +105,4 @@ def calculate_granularity_metric(self, available_time_slot):
pass

def __str__(self):
pass
return f"{self.operation_id}-{self.operation_name}"
20 changes: 8 additions & 12 deletions lekin/lekin_struct/resource.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
"""
Struct Machine/机器
property
method
Resource/Machine Struct
# Assume we have a list of resource IDs
resource_ids = [1, 2, 3]
Expand Down Expand Up @@ -40,7 +36,6 @@ def add_time_slots_to_resource(resource, start_times, processing_times):
add_time_slots_to_resource(resource1, resource1_start_times, resource1_processing_times)
add_time_slots_to_resource(resource2, resource2_start_times, resource2_processing_times)
add_time_slots_to_resource(resource3, resource3_start_times, resource3_processing_times)
"""

import math
Expand Down Expand Up @@ -94,8 +89,6 @@ def get_task_at_time_slot(self, time_slot):
def get_available_time_slots_within_time(self, start=None, end=None, periods=None, freq="1H", forward=True):
available_hours = []

print(end, periods)

# check_periods = pd.date_range(start=start, end=end, periods=periods, freq=freq)
# if not forward:
# check_periods = check_periods[::-1]
Expand Down Expand Up @@ -197,11 +190,14 @@ def merge_schedules(self):

self.timeslots = merged_slots

def __eq__(self, other):
return

def __hash__(self):
return hash(str(self))

def __str__(self):
return
return f"{self.resource_id}"

def __eq__(self, other):
return self.resource_id == other.resource_id

def __lt__(self, other):
return self.resource_id < other.resource_id
20 changes: 10 additions & 10 deletions lekin/lekin_struct/route.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
Struct Route/工艺流程/工艺路线
Route map Struct
"""

from typing import Any, Callable, Dict, List, Optional, Tuple
Expand Down Expand Up @@ -27,19 +27,19 @@ def __init__(self, route_id, operations_sequence, available_resources=None):
self.available_time_slots = [] # List of time slots when machines are available

def add_operation(self, operation: Operation):
self.operations.append(operation)
self.operations_sequence.append(operation)

def get_operations(self) -> List[Operation]:
return self.operations
return self.operations_sequence

def add_machine(self, machine):
self.available_machines.append(machine)
def add_resource(self, resource):
self.available_resources.append(resource)

def add_time_slot(self, time_slot):
self.available_time_slots.append(time_slot)

# def __repr__(self):
# return (
# f"Route(route_id={self.route_id}, operation_ids={self.operation_ids},"
# f" resources_available={self.resources_available})"
# )
def __repr__(self):
return (
f"Route(route_id={self.route_id}, operation_ids={self.operations_sequence},"
f" resources_available={self.available_resources})"
)
17 changes: 10 additions & 7 deletions lekin/lekin_struct/timeslot.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
"""
资源日历
Calendar for resource Struct
"""

from datetime import datetime, timedelta

import pandas as pd


class TimeSlot:
class TimeSlot(object):
def __init__(self, start_time, end_time):
self.start_time = start_time
self.end_time = end_time
Expand All @@ -29,9 +29,12 @@ def hours(self):
def duration_of_hours(self):
return len(pd.date_range(start=self.start_time, end=self.end_time, freq="1H")) - 1

def overlaps_with(self, timeslot):
overlap_start = max(self.start_time, timeslot.start_time)
overlap_end = min(self.end_time, timeslot.end_time)

# class TimeSlot:
# def __init__(self, resource_id, start_time, end_time):
# self.resource_id = resource_id
# self.start_time = start_time
# self.end_time = end_time
if overlap_start < overlap_end:
overlap_hours = (overlap_end - overlap_start).total_seconds() / 3600
return overlap_hours
else:
return 0
41 changes: 20 additions & 21 deletions tests/test_solver/test_meta_heuristics/test_branch_and_bound.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,23 @@
from lekin.lekin_struct import Job, Operation, Resource, Route, TimeSlot
from lekin.solver.meta_heuristics.branch_and_bound import BranchAndBoundScheduler


class BranchAndBoundSchedulerTest(unittest.TestCase):
def test_schedule(self):
job1 = Job(1, datetime(2023, 1, 10), 2, 1)
job2 = Job(2, datetime(2023, 1, 20), 1, 1)

op1 = Operation(1, timedelta(hours=2), 2, None, [1])
op2 = Operation(2, timedelta(hours=3), None, 1, [1])

route1 = Route(1, [op1, op2])
print(route1)

resource1 = Resource(1, [TimeSlot(datetime(2023, 1, 1), datetime(2023, 1, 3))])

job_list = [job1, job2]
resource_list = [resource1]

scheduler = BranchAndBoundScheduler(job_list, resource_list)
schedule = scheduler.get_schedule()
for idx, slot in enumerate(schedule):
print(f"Job {idx + 1} will start at {slot.start_time} and end at {slot.end_time}")
# class BranchAndBoundSchedulerTest(unittest.TestCase):
# def test_schedule(self):
# job1 = Job(1, datetime(2023, 1, 10), 2, 1)
# job2 = Job(2, datetime(2023, 1, 20), 1, 1)
#
# op1 = Operation(1, timedelta(hours=2), 2, None, [1])
# op2 = Operation(2, timedelta(hours=3), None, 1, [1])
#
# route1 = Route(1, [op1, op2])
# print(route1)
#
# resource1 = Resource(1, [TimeSlot(datetime(2023, 1, 1), datetime(2023, 1, 3))])
#
# job_list = [job1, job2]
# resource_list = [resource1]
#
# scheduler = BranchAndBoundScheduler(job_list, resource_list)
# schedule = scheduler.get_schedule()
# for idx, slot in enumerate(schedule):
# print(f"Job {idx + 1} will start at {slot.start_time} and end at {slot.end_time}")

0 comments on commit 773a1aa

Please sign in to comment.