def calc_schedule_delay(self, timeslice): if not self.is_madatory: return 0.0 lower = self.pref_timing - conf.DELTA - slice2min(timeslice) upper = slice2min(timeslice) - conf.DELTA - self.pref_timing if lower > 0.0: early_cost = lower * conf.ALPHA_early return early_cost if upper > 0.0: late_cost = upper * conf.ALPHA_late return late_cost return 0.0
def get_movements(self, timeslice): ''' Return the list of movements at timeslice or generate the list if neccessary. The travel time and travel cost is calculated at the same time. ''' if timeslice in self.moves_on_path: return self.moves_on_path[timeslice] # first calculate transfer cost total_travel_cost = self.num_transfer * conf.ALPHA_tran # then generate memoization for movements on path, and calculate other travel costs self.moves_on_path[timeslice] = [] self.path_travel_time[timeslice] = 0.0 timeline = timeslice for each_edge in self.edges_on_path: if isinstance(each_edge.related_vector, TransitLine): # if the edge is a transit line line = each_edge.related_vector (arrival_time, wait_time) = line.calc_arrival_time(slice2min(timeline), each_edge.head_node, each_edge.tail_node) # when there is no public transport service at timeslice, return infinite travel time/cost if arrival_time == float('inf') or wait_time == float('inf'): self.path_travel_timeslice[timeslice] = float('inf') self.path_travel_cost[timeslice] = float('inf') return [] in_vehicle_time = arrival_time - slice2min( timeline) - wait_time # create transit line move line_move = Move(timeline + min2slice(wait_time), each_edge) self.moves_on_path[timeslice].append(line_move) timeline = min2slice(arrival_time) # calculate travel cost wait_cost = wait_time * conf.ALPHA_wait move_flow = get_move_flow(line_move) in_vehicle_cost = line.calc_travel_cost( in_vehicle_time, move_flow) total_travel_cost = total_travel_cost + in_vehicle_cost + wait_cost else: # if the edge is NOT a transit line each_vector = each_edge.related_vector next_move = Move(timeline, each_edge) self.moves_on_path[timeslice].append(next_move) move_flow = get_move_flow(next_move) travel_time = each_vector.calc_travel_time(move_flow) travel_cost = each_vector.calc_travel_cost(travel_time) timeline = timeline + min2slice(travel_time) total_travel_cost = total_travel_cost + travel_cost self.path_travel_time[timeslice] += travel_time self.path_travel_timeslice[timeslice] = timeline - timeslice self.path_travel_cost[timeslice] = total_travel_cost return self.moves_on_path[timeslice]
def get_movements(self, timeslice): ''' Return the list of movements at timeslice or generate the list if neccessary. The travel time and travel cost is calculated at the same time. ''' if timeslice in self.moves_on_path: return self.moves_on_path[timeslice] # first calculate transfer cost total_travel_cost = self.num_transfer * conf.ALPHA_tran # then generate memoization for movements on path, and calculate other travel costs self.moves_on_path[timeslice] = [] self.path_travel_time[timeslice] = 0.0 timeline = timeslice for each_edge in self.edges_on_path: if isinstance(each_edge.related_vector, TransitLine): # if the edge is a transit line line = each_edge.related_vector (arrival_time, wait_time) = line.calc_arrival_time( slice2min(timeline), each_edge.head_node, each_edge.tail_node) # when there is no public transport service at timeslice, return infinite travel time/cost if arrival_time == float('inf') or wait_time == float('inf'): self.path_travel_timeslice[timeslice] = float('inf') self.path_travel_cost[timeslice] = float('inf') return [] in_vehicle_time = arrival_time - slice2min(timeline) - wait_time # create transit line move line_move = Move(timeline + min2slice(wait_time), each_edge) self.moves_on_path[timeslice].append(line_move) timeline = min2slice(arrival_time) # calculate travel cost wait_cost = wait_time * conf.ALPHA_wait move_flow = get_move_flow(line_move) in_vehicle_cost = line.calc_travel_cost(in_vehicle_time, move_flow) total_travel_cost = total_travel_cost + in_vehicle_cost + wait_cost else: # if the edge is NOT a transit line each_vector = each_edge.related_vector next_move = Move(timeline, each_edge) self.moves_on_path[timeslice].append(next_move) move_flow = get_move_flow(next_move) travel_time = each_vector.calc_travel_time(move_flow) travel_cost = each_vector.calc_travel_cost(travel_time) timeline = timeline + min2slice(travel_time) total_travel_cost = total_travel_cost + travel_cost self.path_travel_time[timeslice] += travel_time self.path_travel_timeslice[timeslice] = timeline - timeslice self.path_travel_cost[timeslice] = total_travel_cost return self.moves_on_path[timeslice]
def discrete_util(self, timeslice): lower = slice2min(timeslice) - conf.TICK/2.0 upper = lower + conf.TICK if timeslice == 0: ans = quad(self.marginal_util, [0.0, conf.TICK/2.0]) + \ quad(self.marginal_util, [conf.DAY-conf.TICK/2.0, conf.DAY]) else: ans = quad(self.marginal_util, [lower, upper]) return ans
def discrete_util(self, timeslice): lower = slice2min(timeslice) - conf.TICK / 2.0 upper = lower + conf.TICK if timeslice == 0: ans = quad(self.marginal_util, [0.0, conf.TICK/2.0]) + \ quad(self.marginal_util, [conf.DAY-conf.TICK/2.0, conf.DAY]) else: ans = quad(self.marginal_util, [lower, upper]) return ans