def simulacion(tmax, smax, dt, lambd, params, paramsInho): ids = 0 numt = np.arange(0, tmax, dt).size + 1 nums = np.ceil(smax/(params[0] + params[4])) Nmax = int(np.ceil(tmax*lambd)) #Nº máximo de posibles llegadas arrivaltimes = getLlegadas(Nmax, dt, lambd) llegadas = np.zeros((numt)) stv_gt = np.zeros((numt*nums*lambd,5)) A = np.array([[-1, 1000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) j = 0 k = 0 account = 0 ta = arrivaltimes[account] complete = False times = np.linspace(0,tmax,numt) for t in times: #Llegadas Poissonianas, parámetro lambda if ta <= t and (not complete): account += 1 if account <= (len(arrivaltimes) - 1): #Nuevo tiempo de acceso ta += arrivaltimes[account] else: complete = True if (np.size(A,0) == 1): #Primer Vehículo A = np.vstack((np.array([[ids, 0, t, params[5], 0, A[0,1], 0, params[0], params[1], params[5], params[2], params[3], params[4]]]), A)) llegadas[k] = 1 elif (A[0,1] > (params[0] + params[4])): # Resto de vehículos ids += 1 v_temp = vin(A[0,3],A[0,1]-params[4], params) A = np.vstack((np.array([[ids, 0, t, v_temp, 0, A[0,1]- params[4], v_temp-A[0,3], params[0], params[1], params[5], params[2], params[3], params[4]]]), A)) llegadas[k] = 1 k += 1 #Paso de simulación A = TM.idm(A, dt) # print A #Inhomogeneidad Timehead (T) I1 = A[:,1] > paramsInho[2]; A[I1,8] = np.minimum(Tin(A[I1,1], paramsInho),paramsInho[3]) #Elimina coches de la carretera cuando alcanzan el final A = A[np.logical_or(A[:,1] <= smax, A[:,0] < 0),:] #Guarda en el campo stv_gt[j:j+np.size(A,0)-1,:] = A[0:-1,0:5] j = j+np.size(A,0) - 1 return stv_gt
def getFitness(self, overallSignalProgramms,vehcleInputs,HGVInputs): #x = self.bin2int(self.bits) #print 'x', x #exec(expr) #self.fitness = y #print 'y', y weightFactorForWaitingTime = 0 weightFactorForStops = 1 self.decode(overallSignalProgramms) #print 'call Traffic Models>>' (overallWaitingTime, overallStops) = TrafficModels.maintest(self.tobeEvaluatedSps,vehcleInputs,HGVInputs) self.fitness = -overallWaitingTime*weightFactorForWaitingTime - weightFactorForStops*overallStops
def simulacion(tmax, smax, dt, lambd, params, paramsInho): numt = int(mt.ceil(tmax/dt + 1)) #Nº máximo de iteracciones Nmax = int(mt.ceil(tmax*lambd)) #Nº máximo de posibles llegadas #Obtener las llegadas Poissonianas arrivaltimes = getLlegadas(Nmax, dt, lambd) llegadas = [] # Para tener un registro de las llegadas a la vía stv_gt = [] #lista de listas, contiene toda los estados de los vehículos mientras están circulando por el tramo de la vía, ordenada en tiempo A = {} #Hash, estructura de datos de la simulación, Key(id) -> últimos valores del vehículo #A [id, s, t, v, a, Dx, Dv, s0, T, v0, a, ab, l] A[-1] = [-1, 1000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ids = -1 deletes = 0 account = 0 ta = arrivaltimes[account] #Tiempo de llegada del primer vehículo complete = False la = 0 #Contador de vehículos eliminados for n in range(numt): t = dt * n #Añadir un nuevo vehículo if ta <= t and (not complete): account += 1 if account <= (len(arrivaltimes) - 1): #Nuevo tiempo de acceso ta += arrivaltimes[account] else: complete = True if (len(A) == 1): #Primer Vehículo ids += 1 A[ids] = [ids, 0, t, params[5], 0, A[-1][1], 0, params[0], params[1], params[5], params[2], params[3], params[4]] llegadas.append(1) elif A[ids][1] > (params[0] + params[4]): # Resto de vehículos ids += 1 v_temp = vin(A[ids - 1][3],A[ids - 1][1]-params[4], params) A[ids] = [ids, 0, t, v_temp, 0, A[ids - 1][1]- params[4], v_temp-A[ids - 1][3], params[0], params[1], params[5], params[2], params[3], params[4]] #mantiene el id para que en la impresión podamos identificarlo llegadas.append(1) else: llegadas.append(0) la += 1 else: llegadas.append(0) #Paso de simulacion A = TM.idm(A, dt, deletes) for i in range(len(A) -1 + deletes): #-1 por el vector dummies #Inhomogeneidad Timehead (T) if (i >= deletes): if ((A[i][1] > paramsInho[2]) and (A[i][8] < paramsInho[3])): #Para evitar que tras haber pasado sih +lih siga haciendo esta comparacion ya que es constante A[i][8] = min(Tin(A[i][1], paramsInho),paramsInho[3]) #Elimina coches de la carretera cuando alcanzan el final if (A[i][1] >= smax): del A[i] deletes = i+1 #Guarda en el campo if (i >= deletes): #Necesario para que no se sobreesbriba el valor en la función idm ya que modificamos el valor al que apunta, por tanto se modifica también el valor de stv_gt p = [A[i][0],A[i][1],A[i][2],A[i][3], A[i][4]] stv_gt.append(p) return stv_gt