Skip to content

Commit e75a688

Browse files
Create Job_scheduling.py
1 parent 52aa97a commit e75a688

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

Job_scheduling.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#!/usr/bin/env python3
2+
3+
"""
4+
Author : Mohit Kumar
5+
Job Sequencing Problem implemented in python
6+
"""
7+
from collections import namedtuple
8+
from typing import List
9+
10+
11+
class Scheduling:
12+
def __init__(self, jobs: List[int]) -> None:
13+
"""
14+
Assign jobs as instance of class Scheduling
15+
"""
16+
self.jobs = jobs
17+
18+
def schedule(self, total_jobs: int, deadline: List[int]) -> List[int]:
19+
"""
20+
Parameteres : total_jobs and list of deadline of jobs
21+
Returns : List of jobs_id which are profitable and can be done before
22+
deadline
23+
>>> a = Scheduling([(0, 13, 10),(1, 2, 20),(2, 33, 30),(3, 16, 40)])
24+
>>> a.schedule( 3, [3, 4, 5])
25+
[(1, 2, 20), (2, 33, 30)]
26+
>>> a = Scheduling([(0, 13, 10),(1, 2, 20),(2, 33, 30),(3, 16, 40)])
27+
>>> a.schedule( 4, [13, 2, 33, 16])
28+
[(1, 2, 20), (2, 33, 30), (3, 16, 40)]
29+
"""
30+
self.j = [self.jobs[1]]
31+
self.x = 2
32+
while self.x < total_jobs:
33+
self.k = self.j.copy()
34+
self.k.append(self.jobs[self.x])
35+
self.x += 1
36+
if self.feasible(self.k, deadline):
37+
self.j = self.k.copy()
38+
39+
return self.j
40+
41+
def feasible(self, profit_jobs: List[int], deadline: List[int]) -> bool:
42+
"""
43+
Parameters : list of current profitable jobs within deadline
44+
list of deadline of jobs
45+
Returns : true if k[-1] job is profitable to us else false
46+
>>> a = Scheduling([(0, 13, 10),(1, 2, 20),(2, 33, 30),(3, 16, 40)])
47+
>>> a.feasible( [0], [2, 13, 16, 33] )
48+
True
49+
>>> a = Scheduling([(0, 13, 10),(1, 2, 20),(2, 33, 30),(3, 16, 40)])
50+
>>> a.feasible([0], [2, 13, 16, 33] )
51+
True
52+
"""
53+
54+
self.tmp = profit_jobs
55+
self.is_feasible = True
56+
57+
i = 0
58+
j = 1
59+
k = 0
60+
61+
while i < len(self.tmp):
62+
while j < len(self.tmp):
63+
self.index1 = self.jobs.index(self.tmp[i])
64+
self.index2 = self.jobs.index(self.tmp[j])
65+
j += 1
66+
if deadline[self.index1] > deadline[self.index2]:
67+
(self.tmp[i], self.tmp[j]) = (
68+
self.tmp[j],
69+
self.tmp[i],
70+
)
71+
i += 1
72+
73+
while k < len(self.tmp):
74+
self.job = self.tmp[k]
75+
if self.job in self.jobs:
76+
self.jobindex = self.jobs.index(self.job)
77+
else:
78+
self.jobindex = 0
79+
self.dlineval = deadline[self.jobindex]
80+
self.ftest = k + 1
81+
k += 1
82+
if self.dlineval < self.ftest:
83+
self.is_feasible = False
84+
break
85+
return self.is_feasible
86+
87+
88+
def main():
89+
job = namedtuple("job", "job_id deadline profit")
90+
jobs = [
91+
job(0, 0, 0),
92+
job(1, 2, 46),
93+
job(2, 4, 52),
94+
job(3, 3, 30),
95+
job(4, 3, 36),
96+
job(5, 2, 56),
97+
job(6, 1, 40),
98+
]
99+
# midresult stores jobs in sorting order of deadline
100+
midresult = []
101+
for i in range(len(jobs)):
102+
current_job = []
103+
current_job.extend((jobs[i].deadline, jobs[i].profit, jobs[i].job_id))
104+
midresult.append(current_job)
105+
midresult.sort(key=lambda k: (k[0], -k[1]))
106+
(deadline, profit, jobs) = map(list, zip(*midresult))
107+
108+
scheduling_jobs = Scheduling(jobs)
109+
scheduled_jobs = scheduling_jobs.schedule(len(jobs), deadline)
110+
print(f"\n Jobs {scheduled_jobs}")
111+
112+
finalprofit = []
113+
finaldl = []
114+
115+
for i, item in enumerate(scheduled_jobs):
116+
jobsindex = jobs.index(item)
117+
finalprofit.append(profit[jobsindex])
118+
finaldl.append(deadline[jobsindex])
119+
120+
print(f"\n Profit {finalprofit}")
121+
print(f"\n Deadline {finaldl}")
122+
123+
124+
if __name__ == "__main__":
125+
main()

0 commit comments

Comments
 (0)