def assign(self): #print(initiation.Job) for y in range(initiation.job_counter): as_time = PriorityQueue() for x in range(initiation.job_counter): time = initiation.Job[x][3] for t in range(10 * initiation.max_time.astype(int)): if (initiation.Job[x][4] == -1): if (Functions.check_availability( y % initiation.drone_counter, t, t + Functions.g(x, y % initiation.drone_counter) + Functions.r(x, y % initiation.drone_counter) + time.astype(int)) == 1): temp = method.max(self, t, initiation.Job[x][5].astype(int)) as_time.insert( (x, temp, Functions.g(x, y % initiation.drone_counter) + Functions.r(x, y % initiation.drone_counter) + time.astype(int))) break # print(as_time) tem = as_time.delete_dif() #j,t=tem time = initiation.Job[tem[0]][3] method.assign_operation(self, tem[0], y % initiation.drone_counter, tem[1]) #print(y%initiation.drone_counter ,tem[0] ,tem[1],tem[1]+Functions.g(tem[0],y%initiation.drone_counter)+Functions.r(tem[0],y%initiation.drone_counter)+time.astype(int)) total_waiting = 0 for i in range(initiation.job_counter): total_waiting += initiation.Job[i][4] - initiation.Job[i][5] if (initiation.Job[i][4] == -1): total_waiting = 10000000 break print("Result For My New Method", total_waiting / initiation.job_counter) #print(initiation.Job) #print(initiation.result) for i in range(initiation.job_counter): initiation.Job[i][4] = -1 initiation.Drone = np.zeros( (initiation.drone_counter, 20 * initiation.max_time.astype(int))) initiation.result = np.zeros( (initiation.job_counter, initiation.drone_counter)) return 0
def assign_operation(self, job, t): time = initiation.Job[job][3] for y in range(initiation.drone_counter): if (Functions.check_availability( y, t, t + Functions.g(job, y) + Functions.r(job, y) + time.astype(int)) == 1): initiation.result[job][y] = 1 initiation.Job[job][4] = t + Functions.g(job, y) #print(y ,job ,t,Functions.g(job,y),Functions.r(job,y),time.astype(int)) for x in range( time.astype(int) + Functions.g(job, y) + Functions.r(job, y)): initiation.Drone[y][x + t] = 1 return 1 return 0
def assign(self): number_feature = 1 batch_size = initiation.job_counter * initiation.drone_counter * 200 agent = DQN.DQNAgent(initiation.job_counter, number_feature) reward = 0 best = 1000 for m in range(EPISODES): max_time = 0 for i in range(initiation.job_counter): max_time += initiation.Job[i][3] initiation.Drone = np.zeros( (initiation.drone_counter, 20 * max_time.astype(int))) for i in range(initiation.job_counter): initiation.Job[i][4] = -1 initiation.Drone = np.zeros( (initiation.drone_counter, 20 * max_time.astype(int))) initiation.result = np.zeros( (initiation.job_counter, initiation.drone_counter)) done = False total_time = 0 arr = [0] state = np.array(arr * initiation.job_counter) state = [ np.reshape(state[i], ( 1, 1, )) for i in range(initiation.job_counter) ] ## state for jobs 0(wait) or 1(assigned) action_list = [] ## list to predict job total_time = 0 ## total time of waiting time of job and going + returning time of drone avarage_wtime = 0 assigned_job = 0 for i in range( 1000 ): # because of the random assign, there should be more iterations # REVIEW: should find better way action = agent.act(state) # act function decides to the action if (initiation.Job[action][4].astype(int) == -1 ): # if the selected job is not assigned before time = initiation.Job[action][3] work_time = Functions.g( action, i % initiation.drone_counter) + Functions.r( action, i % initiation.drone_counter) + time.astype(int) state[[ action ][0]] = 1 ## assigned the "action" th cell of state as 1 state = [ np.reshape(state[k], ( 1, 1, )) for k in range(initiation.job_counter) ] # reshape state suitable for act function array of arrays for j in range(initiation.Job[action][5].astype(int), 10 * initiation.max_time.astype(int)): if ( Functions.check_availability( i % initiation.drone_counter, j, j + work_time) == 1 ): ##check_availability of the drone to "action"th job at first possible time initiation.Job[action][4] = j break method.assign_operation( self, action, i % initiation.drone_counter, initiation.Job[action][4].astype(int)) ## assign #print(i%initiation.drone_counter ,action ,initiation.Job[action][4].astype(int)-Functions.g(action,i%initiation.drone_counter),initiation.Job[action][4].astype(int)+work_time-Functions.g(action,i%initiation.drone_counter)) total_time = initiation.Job[action][4] - initiation.Job[ action][5] assigned_job = assigned_job + 1 avarage_wtime = (avarage_wtime + total_time) / assigned_job reward = reward + ( avarage_wtime - total_time ) * 500 ## reward if given according to total time; if the current total time is smaller than the previous reward is bigger agent.remember(state, action, reward, state, done) ## save the state to agent action_list.append(action) #append action to list done = True else: reward = reward - 100 # punishment to select already selected job agent.remember(state, action, reward, state, done) ## save the state to agent done = True if len(agent.memory) > batch_size: agent.replay(batch_size) total_waiting = 0 for i in range(initiation.job_counter): if (initiation.Job[i][4] == -1): total_waiting = 1000 break total_waiting += initiation.Job[i][4] - initiation.Job[i][ 5] ## calculate the waiting time / i tried to minimize that #print(initiation.Job) #print(initiation.result) for n in range(initiation.job_counter): initiation.Job[n][4] = -1 initiation.Drone = np.zeros((initiation.drone_counter, 20 * initiation.max_time.astype(int))) initiation.result = np.zeros( (initiation.job_counter, initiation.drone_counter)) flag = 0 test = total_waiting / initiation.job_counter if (best > test): best = test print(test) print(best) return 0