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
63import csv
74
8- # 0. 2. Definisi variabel global
5+ # 2. Definisi variabel global
96ROUTING = []
107PROCESSING_TIME = []
118MESIN = []
129JOB_DONE = []
1310SCHEDULE = []
1411
15- # 1 . Prosedur untuk melakukan pembacaan data dari file
12+ # 3 . Prosedur untuk melakukan pembacaan data dari file
1613def 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
232200def 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'---\n makespan: { 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 ("\n Press Enter to Exit" )
0 commit comments