Skip to content

Commit 9bb32af

Browse files
committed
Non-delay algorithm - clean code ver.
Non-delay algorithm - clean code ver.
1 parent 06efa58 commit 9bb32af

File tree

2 files changed

+78
-109
lines changed

2 files changed

+78
-109
lines changed

src/Non_delay.py

Lines changed: 77 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
1-
# Implementasi algoritma Non-delay
2-
# 0.1. Impor modul eksternal
3-
from datetime import datetime
4-
import time
5-
import calendar
1+
# Implementasi Algoritma Penjadwalan Non-delay
2+
# 1. Impor modul eksternal
63
import csv
74

8-
# 0.2. Definisi variabel global
5+
# 2. Definisi variabel global
96
ROUTING = []
107
PROCESSING_TIME = []
118
MESIN = []
129
JOB_DONE = []
1310
SCHEDULE = []
1411

15-
# 1. Prosedur untuk melakukan pembacaan data dari file
12+
# 3. Prosedur untuk melakukan pembacaan data dari file
1613
def read_data():
1714
# Menggunakan variabel global
1815
global ROUTING, PROCESSING_TIME, MESIN
1916
print("Sedang membaca data...")
2017

21-
# Pembacaan data mesin dari file
22-
# Exception handling
18+
# Pembacaan data mesin dari file dan exception handling
2319
try:
2420
mesin_file = open(f"test/Mesin.txt", "r")
2521
except:
@@ -79,156 +75,128 @@ def read_data():
7975
ROUTING.append(row)
8076

8177
print("Data time dan routing berhasil dibaca!")
82-
83-
# 2. Defining ID of process
84-
def define_id(i, j, k):
85-
ID = str(i) + str(j) + str(k)
86-
return ID
8778

88-
# 3. Ekekusi time
89-
def state_check(count):
79+
# 4. Prosedur Eksekusi
80+
def state_check():
81+
# xx. Menggunakan variabel global
9082
global MESIN, JOB_DONE, SCHEDULE, CJ, TJ, RJ, ST
91-
print("seconds : ",count)
92-
print("cj",CJ)
93-
print("tj",TJ)
94-
print("rj",RJ)
95-
print("st",ST)
96-
print("MESIN",MESIN)
97-
98-
print("============================")
99-
100-
# e. Menentukan nilai cj terkecil, job dengan cj terkecil akan diproses duluan
83+
84+
# a. Mengambil nilai cj terkecil dari data masukan, job dengan cj terkecil akan diproses duluan
10185
min_c = min(CJ)
10286

103-
temp_list = [] # temporary list
87+
# b. Inisiasi senarai temporari
88+
temp_list = []
10489

105-
# f. Kalo misal ada lebih dari 1 yang punya nilai minimum itu, kita handle
90+
# c. Kalau misal ada lebih dari 1 yang punya nilai minimum, digunakan skema penanganan
10691
if CJ.count(min_c) > 1:
107-
print("adaberapa?",CJ.count(min_c))
108-
# Bikin list yang isinya semua job yang punya nilai min_c
92+
# Inisiasi senarai yang berisi semua job dengan nilai min_c
10993
index_c_in_cj = [i for i in range(len(CJ)) if CJ[i] == min_c]
110-
print("indeiks",index_c_in_cj)
11194

11295
# Cek nilai rj dan pilih yang mempunyai nilai rj terkecil
113-
# Prioritasin yang jumlah operasinya masih banyak
96+
# Prioritaskan yang jumlah operasinya masih banyak
11497
machine_list = [] # machine list
11598

11699
# Isi list dengan semua data yang ada di index_c_in_cj
117100
for i in index_c_in_cj:
101+
# Kalau belum ada di machine list, tambahkan
118102
if len(temp_list) == 0 or ST[i][2] not in machine_list:
119103
temp_list.append(ST[i])
120104
machine_list.append(ST[i][2])
105+
# Kalau sudah ada, lakukan filtering sesuai kriteria diatas
121106
elif ST[i][2] in machine_list:
122-
index_mac = machine_list.index(ST[i][2]) #i
107+
index_mac = machine_list.index(ST[i][2])
108+
# Prioritas nilai rj
123109
if (RJ[i] < RJ[ST.index(temp_list[index_mac])]):
124110
temp_list[index_mac] = ST[i]
111+
# Prioritas jumlah operasi
125112
elif ST[i][1] < temp_list[index_mac][1]:
126113
temp_list[index_mac] = ST[i]
127114

128-
print("cekie",temp_list, machine_list)
129-
# sehkarang temp_list isinya job yang mau dijalankan
115+
# Sekarang temp_list isinya job yang mau dijalankan (dalam sebuah list)
130116
retval = temp_list
131117

118+
# Kalau tidak, kembalikan saja nilai st dari cj tersebut dalam sebuah list
132119
else:
133120
retval = [ST[CJ.index(min_c)]]
134121

135-
print("retval",retval)
136-
# Index job value (?)
122+
# d. Melakukan indexing terhadap jadwal yang ada dan telah selesai
137123
for value in retval:
138124
i = ST.index(value)
139125
SCHEDULE.append([value[0], value[1], value[2], CJ[i], RJ[i]])
140126
if value[1] == 3:
141127
JOB_DONE.append([value[0], RJ[i]])
142128

129+
# e. Lanjutan pemrosesan indexing untuk dikemas dalam senarai job dan machine
143130
index_job = [ST.index(i) for i in retval]
144131
index_mac = [i[2] - 1 for i in retval]
145132

146-
print("idx_job, idx_mach",index_job, index_mac)
147-
133+
# f. Melakukan penyalinan nilai st dan cj untuk digunakan lebih lanjut pada bagian bawah
148134
COPY_OF_ST = [i for i in ST]
149135
COPY_OF_CJ = [i for i in CJ]
150136

137+
# g. Melakukan perubahan terhadap nilai isi mesin, tj dan st
138+
# bias untuk membantu skema penghapusan berdasar indeks
151139
bias = 0
152-
153-
print("older cj, st",CJ, ST)
154-
print("len borth", len(CJ), len(COPY_OF_CJ))
155-
156140
for i, j in zip(index_job, index_mac):
157-
# Updating MESIN
141+
# Memperbaharui nilai MESIN
158142
MESIN[0][j] = RJ[i]
159143
try:
160-
# Updating cj
161-
# CJ[i] = RJ[i]
162-
# Updating tj
144+
# Memperbaharui nilai tj
163145
TJ[i] = PROCESSING_TIME[ST[i][0] - 1][ST[i][1]]
164-
# Updating st
146+
# Memperbaharui nilai st
165147
ST[i] = [ST[i][0], ST[i][1] + 1, ROUTING[ST[i][0] - 1][ST[i][1]]]
166148
except:
149+
# Exception handling jika tidak ada, maka saatnya dihapus
167150
TJ.pop(i - bias)
168151
ST.pop(i - bias)
169152
CJ.pop(i - bias)
170153
bias += 1
171-
172-
# index_job1 = [ST.index(i) for i in COPY_OF_ST]
173-
""" index_job1 = []
174-
for i in COPY_OF_ST:
175-
try :
176-
index_job1.append(ST.index(i))
177-
except :
178-
continue """
179-
180-
print("old cj, st",CJ, ST)
181-
# Updating the cj
154+
155+
# h. Memperbaharui nilai cj pada COPY_OF_CJ (salinan cj)
182156
for i in range(len(COPY_OF_ST)):
183157
try:
158+
# Jika nilai iterator berada pada index_job,
159+
# maka update dengan nilai data proses selanjutnya, lakukan perbandingan dengan
160+
# nilai proses pada mesin
184161
if i in index_job:
185162
ready_time = MESIN[0][ST[i][2] - 1]
186163
recent_rjx = RJ[i]
187-
# print("rd, rcnt",ready_time, recent_rjx)
188164
if COPY_OF_ST[i][1] != len(COPY_OF_ST[0]):
189165
if ready_time > recent_rjx:
190166
COPY_OF_CJ[i] = ready_time
191167
else :
192168
COPY_OF_CJ[i] = recent_rjx
169+
# Jika tidak ada, lakukan pembaharuan dengan nilai yang ada di mesin
170+
# Mengingat tidak ada job yang saling overlap
193171
else :
194-
print(i)
195-
print("mesin", MESIN[0][COPY_OF_ST[i][2] - 1])
196172
if (COPY_OF_CJ[i] <= MESIN[0][COPY_OF_ST[i][2] - 1]):
197173
COPY_OF_CJ[i] = MESIN[0][COPY_OF_ST[i][2] - 1]
198174
except:
175+
# Exception handling, skip jika tidak memenuhi kondisi diatas
199176
continue
200177

201-
print("latestcopy",COPY_OF_CJ)
202-
178+
# i. Pembahruan terhadap nilai cj berdasar pemrosesan COPY_OF_CJ dan COPY_OF_ST
179+
# dilakukan hanya jika panjang keduanya sudah beda (akibat proses penghapusan)
203180
if (len(CJ) < len(COPY_OF_CJ)):
204181
for i in range(len(COPY_OF_CJ) - 1, -1, -1):
182+
# Proses penyesuaian dengan cj yang sudah baru dengan menghapus
205183
if i in index_job and COPY_OF_ST[i][1] == len(COPY_OF_ST[0]):
206-
print(i)
207184
COPY_OF_CJ.pop(i)
208185
else :
209186
continue
210-
187+
188+
# Penyalinan kembali nilai cj yang telah diperbaharui
211189
CJ = COPY_OF_CJ
212-
213-
print("cj, st", CJ, ST)
214-
215-
# Updating cj kalo overdua
216-
# retval = [3, 1, 3] mewakili job3, yang1, mesin3
217-
""" print("strv2",retval,TEMP_ST)
218-
for i in range (len(retval)):
219-
if retval[i] != TEMP_ST and count + 1 == CJ[ST.index(value)]:
220-
CJ[i] += 1 """
221190

222-
# Updating rj
191+
# j. Pembaharuan terhadap nilai rj
223192
RJ = [0 for i in range(len(ST))]
224193
for i in range (len(ST)):
225194
RJ[i] = CJ[i] + TJ[i]
226-
227-
print("----------------------------")
228195

196+
# k. Pengembalian nilai ST apakah sudah kosong (semua job sudah diproses)
229197
return ST
230198

231-
# Print makeform and schedule to string form in the console
199+
# 5. Melakukan pencetakan form hasil pemrosesan ke terminal
232200
def print_schedule(schedule=SCHEDULE, lateness=None):
233201
global PROCESSING_TIME
234202
makespan = max(schedule, key=lambda x: x[4])[4]
@@ -241,33 +209,34 @@ def print_schedule(schedule=SCHEDULE, lateness=None):
241209
if lateness is not None:
242210
print(f"Earliness: {round(lateness[i],2) * -1}" if lateness[i] <= 0 else f"Tardiness: {round(lateness[i],2)}")
243211
print(f'---\nmakespan: {round(makespan,2)}')
212+
213+
# 6. Program utama
214+
if __name__ == '__main__':
215+
# xx. Membaca data
216+
read_data()
217+
218+
# a. Mendefinisikan posisi melalui routing
219+
CJ = [MESIN[0][ROUTING[i][0] - 1] for i in range(len(ROUTING))]
244220

245-
read_data()
246-
# a. Mendefinisikan posisi melalui routing
247-
CJ = [MESIN[0][ROUTING[i][0] - 1] for i in range(len(ROUTING))]
248-
# b. Mendefinisikan waktu pemrosesan
249-
TJ = [PROCESSING_TIME[i][0] for i in range(len(ROUTING))]
250-
# c. Mendefinisikan waktu berakhir
251-
RJ = [0 for i in range(len(ROUTING))]
252-
for i in range (len(ROUTING)):
253-
RJ[i] = CJ[i] + TJ[i]
254-
# d. Mendefinisikan id st (job, operasi, mesin)
255-
ST = [[i + 1, 1, ROUTING[i][0]] for i in range(len(ROUTING))]
256-
print("pt",PROCESSING_TIME)
257-
print("r",ROUTING)
258-
print("m",MESIN)
259-
# state_check()
260-
count = 0
261-
while state_check(count) != []:
262-
count += 1
263-
pass
264-
print('---- Semua job telah selesai ----')
265-
print_schedule()
266-
# cj, tj, rj, st = state_check()
267-
""" print("Hasil state check")
268-
print("cj", cj)
269-
print("tj", tj)
270-
print("rj", rj)
271-
print("st", st) """
272-
print(SCHEDULE)
273-
print(JOB_DONE)
221+
# b. Mendefinisikan waktu pemrosesan
222+
TJ = [PROCESSING_TIME[i][0] for i in range(len(ROUTING))]
223+
224+
# c. Mendefinisikan waktu berakhir
225+
RJ = [0 for i in range(len(ROUTING))]
226+
for i in range (len(ROUTING)):
227+
RJ[i] = CJ[i] + TJ[i]
228+
229+
# d. Mendefinisikan id st (job, operasi, mesin)
230+
ST = [[i + 1, 1, ROUTING[i][0]] for i in range(len(ROUTING))]
231+
232+
# e. Melakukan pemrosesan pembuatan jadwal
233+
# Proses selesai dilaksanakan jika semua job selesai terjadwal
234+
print("Pemrosesan sedang dilakukan...")
235+
while state_check() != []:
236+
pass
237+
238+
# f. Semua job seledai dan hasil dicetak pada terminal
239+
print('\n---- Semua job telah selesai ----')
240+
print_schedule()
241+
242+
input("\nPress Enter to Exit")

test/Mesin.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0, 0, 0
1+
3, 1, 0

0 commit comments

Comments
 (0)