1+ # Implementasi algoritma Non-delay
2+ # 0.1. Impor modul eksternal
3+ from datetime import datetime
4+ import time
5+ import calendar
6+ import csv
7+
8+ # 0.2. Definisi variabel global
9+ ROUTING = []
10+ PROCESSING_TIME = []
11+ MESIN = []
12+ JOB_DONE = []
13+ SCHEDULE = []
14+
15+ # 1. Prosedur untuk melakukan pembacaan data dari file
16+ def read_data ():
17+ # Menggunakan variabel global
18+ global ROUTING , PROCESSING_TIME , MESIN
19+ print ("Sedang membaca data..." )
20+
21+ # Pembacaan data mesin dari file
22+ # Exception handling
23+ try :
24+ mesin_file = open (f"test/Mesin.txt" , "r" )
25+ except :
26+ print (f"File Mesin.txt tidak ditemukan!" )
27+ exit ()
28+
29+ # Konversi ke tabel
30+ mesin_data = csv .reader (mesin_file )
31+
32+ # Pengolahan isi tabel
33+ for row in mesin_data :
34+ for i in range (len (row )):
35+ row [i ] = float (row [i ])
36+ if row [i ] % 1.0 == 0 :
37+ row [i ] = int (row [i ])
38+ MESIN .append (row )
39+
40+ print ("Data mesin berhasil dibaca!" )
41+
42+ # Pembacaan data job dari file
43+ n_jobs = int (input ("Masukkan jumlah job: " ))
44+ for j in range (n_jobs ):
45+ # Exception handling
46+ try :
47+ time_file = open (f"test/Job{ j + 1 } _Time.txt" , "r" )
48+ except :
49+ print (f"File Job{ j + 1 } _Time.txt tidak ditemukan!" )
50+ exit ()
51+
52+ # Konversi ke tabel
53+ time_data = csv .reader (time_file )
54+
55+ # Pengolahan isi tabel
56+ for row in time_data :
57+ for i in range (len (row )):
58+ row [i ] = float (row [i ])
59+ if row [i ] % 1.0 == 0 :
60+ row [i ] = int (row [i ])
61+ PROCESSING_TIME .append (row )
62+
63+ # Exception handling
64+ try :
65+ routing_file = open (f"test/Job{ j + 1 } _Routing.txt" , "r" )
66+ except :
67+ print (f"File Job{ j + 1 } _Routing.txt tidak ditemukan!" )
68+ exit ()
69+
70+ # Konversi ke tabel
71+ routing_data = csv .reader (routing_file )
72+
73+ # Pengolahan isi tabel
74+ for row in routing_data :
75+ for i in range (len (row )):
76+ row [i ] = float (row [i ])
77+ if row [i ] % 1.0 == 0 :
78+ row [i ] = int (row [i ])
79+ ROUTING .append (row )
80+
81+ 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
87+
88+ # 3. Ekekusi time
89+ def state_check ():
90+ global MESIN , JOB_DONE , SCHEDULE , CJ , TJ , RJ , ST
91+ print ("cj" ,CJ )
92+ print ("tj" ,TJ )
93+ print ("rj" ,RJ )
94+ print ("st" ,ST )
95+
96+ # e. Menentukan nilai cj terkecil, job dengan cj terkecil akan diproses duluan
97+ min_c = min (CJ )
98+
99+ # f. Kalo misal ada lebih dari 1 yang punya nilai minimum itu, kita handle
100+ if CJ .count (min_c ) > 1 :
101+ # Bikin list yang isinya semua job yang punya nilai min_c
102+ index_c_in_cj = [i for i in range (len (CJ )) if CJ [i ] == min_c ]
103+
104+ # Cek nilai rj dan pilih yang mempunyai nilai rj terkecil
105+ # Prioritasin yang jumlah operasinya masih banyak
106+ temp_list = [] # temporary list
107+ machine_list = [] # machine list
108+
109+ # Isi list dengan semua data yang ada di index_c_in_cj
110+ for i in index_c_in_cj :
111+ if len (temp_list ) == 0 or ST [i ][2 ] not in machine_list :
112+ temp_list .append (ST [i ])
113+ machine_list .append (ST [i ][2 ])
114+ elif ST [i ][2 ] in machine_list :
115+ index_mac = machine_list .index (ST [i ][2 ]) #i
116+ if (RJ [i ] < RJ [ST .index (temp_list [index_mac ])]):
117+ temp_list [index_mac ] = ST [i ]
118+ elif ST [i ][1 ] < temp_list [index_mac ][1 ]:
119+ temp_list [index_mac ] = ST [i ]
120+
121+ # sehkarang temp_list isinya job yang mau dijalankan
122+ retval = temp_list
123+
124+ else :
125+ retval = [ST [CJ .index (min_c )]]
126+
127+ print ("retval" ,retval )
128+ # Index job value (?)
129+ for value in retval :
130+ i = ST .index (value )
131+ SCHEDULE .append ([value [0 ], value [1 ], value [2 ], CJ [i ], RJ [i ]])
132+ if value [1 ] == 3 :
133+ JOB_DONE .append ([value [0 ], RJ [i ]])
134+
135+ index_job = [ST .index (i ) for i in retval ]
136+ index_mac = [i [2 ] - 1 for i in retval ]
137+
138+ print (index_job , index_mac )
139+
140+ COPY_OF_ST = [i for i in ST ]
141+
142+ bias = 0
143+
144+ for i , j in zip (index_job , index_mac ):
145+ # Updating MESIN
146+ MESIN [0 ][j ] = RJ [i ]
147+ try :
148+ # Updating tj
149+ TJ [i ] = PROCESSING_TIME [ST [i ][0 ] - 1 ][ST [i ][1 ]]
150+ # Updating st
151+ ST [i ] = [ST [i ][0 ], ST [i ][1 ] + 1 , ROUTING [ST [i ][0 ] - 1 ][ST [i ][1 ]]]
152+ except :
153+ TJ .pop (i - bias )
154+ ST .pop (i - bias )
155+ CJ .pop (i - bias )
156+ bias += 1
157+
158+ # Updating cj
159+ # retval = [3, 1, 3] mewakili job3, yang1, mesin3
160+ CJ [retval [0 ][0 ] - 1 ] += RJ [retval [0 ][0 ] - 1 ]
161+ TJ [retval [0 ][0 ] - 1 ] = PROCESSING_TIME [retval [0 ][0 ] - 1 ][ST [retval [0 ][0 ] - 1 ][1 ] - 1 ]
162+ # ST[retval[0][0] - 1][1] += 1
163+ RJ = [0 for i in range (len (ROUTING ))]
164+ for i in range (len (ROUTING )):
165+ RJ [i ] = CJ [i ] + TJ [i ]
166+
167+ return retval
168+
169+ # Print makeform and schedule to string form in the console
170+ def print_schedule (schedule = SCHEDULE , lateness = None ):
171+ global PROCESSING_TIME
172+ makespan = max (schedule , key = lambda x : x [4 ])[4 ]
173+ for i in range (len (PROCESSING_TIME )):
174+ j = max (filter (lambda a : a [0 ] == i + 1 , schedule ), key = lambda x : x [4 ])[4 ]
175+ print (f'Job { i + 1 } telah selesai dengan waktu selesai { round (j ,2 )} ' )
176+ for s in sorted (schedule , key = lambda x : x [0 ]):
177+ if s [0 ] == i + 1 :
178+ print (f'{ s [0 ]} { s [1 ]} { s [2 ]} : Start { round (s [3 ],2 )} End { round (s [4 ],2 )} ' )
179+ if lateness is not None :
180+ print (f"Earliness: { round (lateness [i ],2 ) * - 1 } " if lateness [i ] <= 0 else f"Tardiness: { round (lateness [i ],2 )} " )
181+ print (f'---\n makespan: { round (makespan ,2 )} ' )
182+
183+ read_data ()
184+ # a. Mendefinisikan posisi melalui routing
185+ CJ = [MESIN [0 ][ROUTING [i ][0 ] - 1 ] for i in range (len (ROUTING ))]
186+ # b. Mendefinisikan waktu pemrosesan
187+ TJ = [PROCESSING_TIME [i ][0 ] for i in range (len (ROUTING ))]
188+ # c. Mendefinisikan waktu berakhir
189+ RJ = [0 for i in range (len (ROUTING ))]
190+ for i in range (len (ROUTING )):
191+ RJ [i ] = CJ [i ] + TJ [i ]
192+ # d. Mendefinisikan id st (job, operasi, mesin)
193+ ST = [[i + 1 , 1 , ROUTING [i ][0 ]] for i in range (len (ROUTING ))]
194+ print ("pt" ,PROCESSING_TIME )
195+ print ("r" ,ROUTING )
196+ print ("m" ,MESIN )
197+ # state_check()
198+ while state_check () != None :
199+ pass
200+ print ('---- Semua job telah selesai ----' )
201+ # print_schedule()
202+ # cj, tj, rj, st = state_check()
203+ """ print("Hasil state check")
204+ print("cj", cj)
205+ print("tj", tj)
206+ print("rj", rj)
207+ print("st", st) """
208+ print (SCHEDULE )
209+ print (JOB_DONE )
0 commit comments