1. 程式人生 > >webster(韋伯斯特)算法實現

webster(韋伯斯特)算法實現

pil data zip 新的 最小 nbsp flow 記錄 lines

import pandas as pd
import re
data = pd.read_csv("D:\data\yonghelu.csv")

y_m_d = list((data[time]))[0].split()[0] #提取年月日

#從ip_lane列中提取車道信息如(‘172.18.53.140:1‘-->‘1‘),並創建新的列lane保存
lane = []
a = data["ip_lane"].tolist()
for x in a:
    x = x.split(":")
    lane.append(x[1])
data["lane
"] = lane #從zhuanxiang列中提取方向信息如(‘望江西路與永和路_6017_由東向南‘-->‘由東向南‘),並創建新的列zx保存 reg = re.compile(r由.*) zx = [] for x in data["zhuanxiang"].tolist(): x = reg.search(x).group() zx.append(x) data["zx"] = zx #將time列改為Timedelta類型 data1 = data data1[time] = pd.to_datetime(data1[time
]) L = [] #存放相位信息 #讀取txt文件中的相位信息存放到L列表中 with open(D:\\data\\phase.txt,"r",encoding="utf-8") as f: for line in f.readlines(): line = re.sub("[0-9\:]", "", line).strip().split(",") L.append(line) #將time列表中的數據進行處理(只保留 時-分-秒) data1[time] =data1[time] - pd.to_datetime(y_m_d)
#提取出t0~t1時間段的數據 t0 = pd.Timedelta(07:30:00) t1 = pd.Timedelta(09:30:00) #t0~t1時間段數據 data_earlypeak = data1[(data1[time]< t1) & (data1[time]>t0)] data_earlypeak.head() #t0~t1時間段間隔 T = (t1 - t0).seconds/3600 #按時間順序重新排序表格 data2 = data1.sort_values(by = time) data2.head() #提取出表格中總共有哪些車道,存放入lane_列表 lane_ = data2[lane].unique() #計算每個車道的飽和流量 deta = [] #存放每條車道相鄰兩條數據的時間差 Time_deta = [] #存放由小到大排序的deta列表 for i in range(len(lane_)): data2_ = data2[data2[lane] == lane_[i]] time_ = list(data2_[time]) for i in range((len(time_) - 1)): x = time_[i+1] - time_[i] deta.append(x) deta.sort() Time_deta.append(deta) deta = [] sum_deta = [] #存放 每條車道算出來的最小10個相鄰時間差,進行求和 for i in range(len(Time_deta)): d = Time_deta[i][0] for j in range(1,10): #取10個最小相鄰時間差值求和 d = d + Time_deta[i][j] sum_deta.append(d) #計算每條車道飽和流量 for i in range(len(sum_deta)): sum_deta[i] = 3600/((sum_deta[i].seconds)/10) #10個最小相鄰時間差值求和後要 /10 求平均 #用字典hs每條車道對應的飽和流量,即"車道":"飽和流量" 如{‘1‘: 3600.0,‘10‘: 3527.0,‘11‘: 3600.0} hs = {key : value for key, value in list(zip(lane_,sum_deta))} y = [] #用來存儲每個相位的每個方向的每條車道的流量比 Y = [] #用來存儲各相位的所有車道流量比,如Y[0]存儲的是第一個相位的每個方向各個車道的流量比,取max(Y[0]) #即為第一相位的流量比 for k in range(len(L)): for i in range(len(L[k])): #查找第K個相位的第i方向的所有記錄 df = data_earlypeak[data_earlypeak["zx"] == L[k][i]] #如果某個方向沒有記錄就幾記為0 if len(df) == 0: y.append(0) continue #查看該方向的所有車道,如:‘由東向西‘對應由車道[‘2‘, ‘3‘, ‘4‘, ‘5‘] vehiclelane = list(df["lane"].unique()) #計算該方向的各個車道的流量比 for j in range(len(vehiclelane)): # 統計每個方向的每條車道流量數 x = sum(data_earlypeak[data_earlypeak["lane"] == vehiclelane[j]][flow]) # t0~t1時間段單位時間的流量(小時為單位) x = x/T #計算流量比(實際流量/飽和流量) x = x/hs[vehiclelane[j]] #存儲該方向的各車道流量比 y.append(x) #存儲該相位的各個方向的每條車道的流量比 Y.append(y) #更新y為空,計算下一個相位的各個方向的每條車道的流量比 y = [] #記錄每個相位的流量比(該相位的每個方向的每條車道的流量比的最大值) yi = [max(Y[0]),max(Y[1]),max(Y[2]),max(Y[3])] print(yi) # 總流量比 Y_ = sum(yi) print(Y_) #總損失時間 L = n*Li+AR sumL = 3*4+0 #由公式計算周期 C = round((1.5*sumL+5)/(1-Y_)) print("周期為: {}秒".format(C)) #有效綠燈時間 Ge = C - sumL print("------------------------------------------------------") #第i個相位的有效綠燈時間 ge = [0]*len(L) for i in range(0,len(L)): ge[i] = round(Ge*(yi[i]/Y_)) print("第 %d 個相位的綠燈有效時間為 %d:" % (i+1,ge[i])) print("------------------------------------------------------") #綠燈顯示時間 G = [0]*len(L) for i in range(0,len(L)): G[i] = round(ge[i] - 0 +3) #0為全紅時間即AR的值;3為每個相位啟動損失時間 print("第 %d 個相位的綠燈顯示時間為 %d:" % (i+1,G[i]))

webster(韋伯斯特)算法實現