def __init__(self, args): #super(Tranfer_One_Plan, self).__init__() #self.dest_sta_name = dest_sta_name #self.if_city_same = if_city_same #if it is True,transit_sta is tuple(a,b).if it's false,transit_sta is one sta. self.first_direct = args[0] self.second_direct = args[1] self.third_direct = args[2] self.transit_time = connect_time(args[0].end_time, args[1].start_time) + connect_time(args[1].end_time, args[2].start_time) self.transit_sta = [args[1].start_station_name, args[1].end_station_name]#transit_stas #same city has two transit_sta self.distance = self.first_direct.distance + self.second_direct.distance + self.third_direct.distance self.start_time = self.first_direct.start_time self.end_time = self.third_direct.end_time self.travel_time = self.first_direct.travel_time + self.second_direct.travel_time +\ self.third_direct.travel_time + self.transit_time
def save_tranfer_one_plans(start_trains, end_trains): """save one tranfer plans """ tranfer_one_plans = [] #save tranfer result trains = lambda train:[(t,train[t.train_no]) for t in Train.objects(__raw__={"train_no":{"$in":train.keys()}})] start_train_seqs = trains(start_trains) start_sta_info =lambda d: dict([(s.sta_name, s) for s in d[0].edges if s.seq_no > d[1]]) #s.arrive_time,s.city_same start_trains_stas_v = map(start_sta_info, start_train_seqs) end_train_seqs = trains(end_trains) end_sta_info =lambda d: dict([(s.sta_name, s) for s in d[0].edges if s.seq_no < d[1]])#s.depart_time,s.city_same end_trains_stas_ev = map(end_sta_info, end_train_seqs) for i,sl in enumerate(start_trains_stas_v): set_one = set(sl.keys()) train_one = start_train_seqs[i] for j,el in enumerate(end_trains_stas_ev): train_two = end_train_seqs[j] if len(train_one[0].cross_bureaus) == 1 and len(train_two[0].cross_bureaus) == 1: break #tranfer is not taking place in two bureau trains set_two = set(el.keys()) set_union = set_one & set_two same_city_sta = [(st1,st2) for st1 in set_one - set_union for st2 in set_two - set_union \ if sl[st1].city_same and sl[st1].city_same==el[st2].city_same] union_sets_sta = [] union_sets_sta = list(set_union) union_sets_sta.extend(same_city_sta) if union_sets_sta: try: #union_sets_sta_dict = [] #union_sets_sta_dict = zip(union_sets_sta, union_sets_sta) #union_sets_sta_dict.extend(same_city_sta) union_sets_connct_time = [] union_sets_connct_time = [connect_time(sl[t].arrive_time, el[t].depart_time) for t in set_union] union_sets_connct_time.extend([connect_time(sl[t1].arrive_time, el[t2].depart_time) for (t1,t2) in same_city_sta]) except TypeError, e: print "type error" except Exception, ex: print "other error" #union_sets_all = dict(zip(union_sets_sta,union_sets_connct_time)) #union_sets_filter = sorted(union_sets_all.items(), key=lambda x: x[1]) transit_time = max(union_sets_connct_time) for i,x in enumerate(union_sets_connct_time): if x == transit_time and i<len(set_union): transit_sta = union_sets_sta[i] transit_sta_seqs = (sl[transit_sta].seq_no, el[transit_sta].seq_no) tranfer_one = Tranfer_One_Plan(train_one[0],train_one[1], train_two[0],train_two[1], transit_sta_seqs, transit_sta,transit_time) tranfer_one_plans.append(tranfer_one) break elif x == transit_time and i>=len(set_union): if_city_same = True transit_stas = union_sets_sta[i] transit_sta_seqs = (sl[transit_stas[0]].seq_no, el[transit_stas[1]].seq_no) tranfer_one = Tranfer_One_Plan(train_one[0],train_one[1], train_two[0],train_two[1], transit_sta_seqs, transit_stas,transit_time,if_city_same) tranfer_one_plans.append(tranfer_one) break else: continue