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 773a1aa commit a9351fe
Show file tree
Hide file tree
Showing 13 changed files with 237 additions and 110 deletions.
95 changes: 0 additions & 95 deletions examples/basic_aps.py

This file was deleted.

129 changes: 129 additions & 0 deletions examples/data/k1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
{
"itineraries": [
{
"itineraryName": "Itinerary 1",
"tasksList": [
{
"taskName": "Task 1",
"taskMachine": {
"machineName": "M1"
},
"taskDuration": 10.0
},
{
"taskName": "Task 2",
"taskMachine": {
"machineName": "M2"
},
"taskDuration": 5.0
},
{
"taskName": "Task 3",
"taskMachine": {
"machineName": "M3"
},
"taskDuration": 35.0
}
]
},
{
"itineraryName": "Itinerary 2",
"tasksList": [
{
"taskName": "Task 1",
"taskMachine": {
"machineName": "M2"
},
"taskDuration": 25.0
},
{
"taskName": "Task 2",
"taskMachine": {
"machineName": "M1"
},
"taskDuration": 5.0
},
{
"taskName": "Task 3",
"taskMachine": {
"machineName": "M3"
},
"taskDuration": 30.0
},
{
"taskName": "Task 4",
"taskMachine": {
"machineName": "M4"
},
"taskDuration": 15.0
}
]
},
{
"itineraryName": "Itinerary 3",
"tasksList": [
{
"taskName": "Task 1",
"taskMachine": {
"machineName": "M2"
},
"taskDuration": 5.0
},
{
"taskName": "Task 2",
"taskMachine": {
"machineName": "M4"
},
"taskDuration": 10.0
}
]
},
{
"itineraryName": "Itinerary 4",
"tasksList": [
{
"taskName": "Task 1",
"taskMachine": {
"machineName": "M2"
},
"taskDuration": 15.0
},
{
"taskName": "Task 2",
"taskMachine": {
"machineName": "M3"
},
"taskDuration": 10.0
},
{
"taskName": "Task 3",
"taskMachine": {
"machineName": "M4"
},
"taskDuration": 20.0
},
{
"taskName": "Task 4",
"taskMachine": {
"machineName": "M1"
},
"taskDuration": 10.0
}
]
}
],
"machines": [
{
"machineName": "M1"
},
{
"machineName": "M2"
},
{
"machineName": "M3"
},
{
"machineName": "M4"
}
]
}
90 changes: 90 additions & 0 deletions examples/rule_example1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import json

from lekin.dashboard.gantt import plot_gantt_chart
from lekin.lekin_struct import (
Job,
JobCollector,
Operation,
OperationCollector,
Resource,
ResourceCollector,
Route,
RouteCollector,
)
from lekin.solver.construction_heuristics import LPSTScheduler, SPTScheduler


def prepare_data(file_path="./data/k1.json"):
with open(file_path, "r", encoding="utf8") as file: # read file from path
data = json.loads(file.read())

job_collector = JobCollector()
# operation_collector = OperationCollector()
route_collector = RouteCollector()
resource_collector = ResourceCollector()

if list(data.keys()) == ["itineraries", "machines"]:
resources = data["machines"] # is first level structure is correct, then split
routes = data["itineraries"]

# parse the resource
for re in resources:
re_name = re["machineName"]
re_id = int(re_name.replace("M", ""))
resource = Resource(resource_id=re_id, resource_name=re_name)
resource_collector.add_resource_dict({re_id: resource})
print([i.resource_id for i in resource_collector.get_all_resources()])

# parse the job and route
for ro in routes:
# ro_name = ro["itineraryName"]
ro_id = int(ro["itineraryName"].replace("Itinerary ", ""))
route = Route(route_id=ro_id)
operations_sequence = []
for ta in ro["tasksList"]:
op_name = ta["taskName"]
op_id = ta["taskName"].replace("Task ", "")

op_pt = ta["taskDuration"]

op_tm = []
if isinstance(ta["taskMachine"], list):
for re in ta["taskMachine"]:
re_name = re["machineName"]
re_id = int(re_name.replace("M", ""))
op_tm.append(Resource(resource_id=re_id, resource_name=re_name))
else:
re_name = ta["taskMachine"]["machineName"]
re_id = int(re_name.replace("M", ""))
op_tm.append(Resource(resource_id=re_id, resource_name=re_name))

operations_sequence.append(
Operation(
operation_id=op_id,
operation_name=op_name,
quantity=1,
processing_time=op_pt,
parent_job_id=ro_id, # route defines job here
available_resource=op_tm,
)
)

route.operations_sequence = operations_sequence
route_collector.add_route(route)

job_collector.add_job(Job(job_id=ro_id, assigned_route_id=ro_id))

# print(resources)
print(routes)
pass
return job_collector, route_collector, resource_collector


def run_scheduling(job_collector, route_list, resource_collector):
scheduler = SPTScheduler()
scheduler.solve(job_collector, resource_collector, route_list)
return


if __name__ == "__main__":
prepare_data(file_path="./data/k1.json")
8 changes: 4 additions & 4 deletions lekin/lekin_struct/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ class Job(object):
def __init__(
self,
job_id,
priority,
quantity,
demand_date,
priority=None,
quantity=None,
demand_date=None,
job_type=None,
earliest_start_time=None,
assigned_route_id=None,
Expand All @@ -102,7 +102,7 @@ def assign_operation(self, operation):

@property
def operation(self):
return self.operations
return self.assigned_operations

def __eq__(self, other):
return
Expand Down
2 changes: 1 addition & 1 deletion lekin/lekin_struct/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class ResourceCollector:
def __init__(self):
self.resources = {}

def add_resource(self, resource):
def add_resource_dict(self, resource):
self.resources.update(resource)

def get_resource_by_id(self, resource_id):
Expand Down
2 changes: 1 addition & 1 deletion lekin/lekin_struct/route.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def get_route_by_id(self, route_id):


class Route:
def __init__(self, route_id, operations_sequence, available_resources=None):
def __init__(self, route_id, operations_sequence=None, available_resources=None):
self.route_id = route_id
self.operations_sequence = operations_sequence # List of Operation objects
self.available_resources = available_resources # List of Resource objects representing available machines,
Expand Down
4 changes: 4 additions & 0 deletions lekin/solver/construction_heuristics/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
"""Dispatching rules"""

from lekin.solver.construction_heuristics.atcs import ATCScheduler
from lekin.solver.construction_heuristics.lpst import LPSTScheduler
from lekin.solver.construction_heuristics.spt import SPTScheduler
2 changes: 1 addition & 1 deletion lekin/solver/construction_heuristics/atcs.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Apparent Tardiness Cost"""


class ATCScheduler:
class ATCScheduler(object):
def __init__(self, jobs, routes):
self.jobs = jobs
self.routes = routes
Expand Down
2 changes: 1 addition & 1 deletion lekin/solver/construction_heuristics/cr.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Critical ratio rule"""


class CRScheduler:
class CRScheduler(object):
def __init__(self, jobs, routes):
self.jobs = jobs
self.routes = routes
Expand Down
2 changes: 1 addition & 1 deletion lekin/solver/construction_heuristics/edd.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Earliest Due Date"""


class EDDScheduler:
class EDDScheduler(object):
def __init__(self, jobs, routes):
self.jobs = jobs
self.routes = routes
Expand Down
2 changes: 1 addition & 1 deletion lekin/solver/construction_heuristics/lpst.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
倒排"""


class LPSTScheduler:
class LPSTScheduler(object):
def __init__(self, jobs, routes):
self.jobs = jobs
self.routes = routes
Expand Down
Loading

0 comments on commit a9351fe

Please sign in to comment.