国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Frank Wolfe算法,求解交通分配UE模型(Python & NetWorkX)

這篇具有很好參考價(jià)值的文章主要介紹了基于Frank Wolfe算法,求解交通分配UE模型(Python & NetWorkX)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、用戶均衡模型簡(jiǎn)略介紹? ?? ??

1.1 Wardrop第一原理

1.2 用戶均衡模型

1.3 BPR函數(shù)?

1.4 用戶均衡模型的積分項(xiàng)

?二、Frank Wolfe算法求解步驟

三、代碼

3.1?導(dǎo)入必要的庫(kù)

?3.2?構(gòu)建交通網(wǎng)絡(luò)

3.3 繪制交通路網(wǎng)圖

3.4?定義BPR函數(shù)

3.5?初始化路網(wǎng)流量

3.6 獲取?flow_temp

3.7?獲取下降方向descent

3.8? 定義目標(biāo)函數(shù)

3.9?一維搜索最優(yōu)步長(zhǎng),并更新流量

3.10?主函數(shù)

四、所用文件


?文章來源地址http://www.zghlxwxcb.cn/news/detail-848461.html

一、用戶均衡模型簡(jiǎn)略介紹? ?? ??

1.1 Wardrop第一原理

  • ?道路的利用者,都確切知道網(wǎng)絡(luò)的交通狀態(tài),并試圖選擇最短路徑
  • 當(dāng)網(wǎng)絡(luò)達(dá)到平衡狀態(tài)時(shí),每個(gè)OD對(duì)的各條被使用的路徑,行駛時(shí)間相等,且行駛時(shí)間最短
  • 沒有被使用的路徑的行駛時(shí)間大于或等于最小行駛時(shí)間

1.2 用戶均衡模型

????????滿足Wardrop第一原理的交通分配模型,稱為用戶均衡模型。

????????1956年Beckmann提出了一種滿足Wardrop第一原理的數(shù)學(xué)規(guī)劃模型。模型核心是,交通網(wǎng)絡(luò)中的用戶,都試圖選擇最短路徑,而最終使得被選擇的路徑的阻抗最小且相等。該數(shù)學(xué)規(guī)劃模型為:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

1.3 BPR函數(shù)?

????????在用戶均衡模型中,為路阻函數(shù),我們一般采用BPR函數(shù),即:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

  • ,表示最快通過路段a的時(shí)間;
  • α常取0.15,β常取4.0?;
  • ,表示路段a的通行能力;
  • ,表示路段a的流量

1.4 用戶均衡模型的積分項(xiàng)

????????為便于后續(xù)求解,我們將BPR函數(shù)代入,進(jìn)行積分計(jì)算,過程如下:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

????????因此,我們的目標(biāo)函數(shù)為:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

?

?二、Frank Wolfe算法求解步驟

????????友情提醒:后面若對(duì)代碼主體邏輯有疑惑,返回看看這部分。

? ? ? ? 步驟1:初始化?;诹懔鲌D的路阻,依次搜索每一個(gè)OD對(duì) r,s 所對(duì)應(yīng)的最短路徑,并將 r,s 間的OD流量,全部分配到對(duì)應(yīng)的最短路徑上,得到初始路段流量,并令迭代次數(shù)n=1。

????????步驟2:更新路阻。根據(jù)BPR函數(shù),分別代入每個(gè)路段的初始流量,求得阻抗

? ? ? ? 步驟3:下降方向。基于阻抗,按照步驟1中的方法(最短路全有全無分配),將流量重新分配到對(duì)應(yīng)路徑上,得到臨時(shí)路段流量,進(jìn)而得到

????????步驟4:搜索最優(yōu)步長(zhǎng),并更新流量。采用二分法,搜索最優(yōu)步長(zhǎng),并令eq?X_%7B2%7D%3DX_%7B1%7D+step%5E%7B*%7D*%28%7BX_%7B1%7D%7D%5E%7B*%7D-X_%7B1%7D%29。其中,最優(yōu)步長(zhǎng)滿足:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

????????步驟5:結(jié)束條件。如果%5Csum_a%7Bx_%7Ba%7D%5E%7Bn%7D%7D%5Cleqslant%20e,則算法結(jié)束;否則n=n+1,轉(zhuǎn)至步驟2。此處的e 表示誤差閾值,在代碼部分用max_err表示。

?

三、代碼

????????代碼基于Python的NetWorkX庫(kù)編寫,這樣將大大減少我們代碼編寫的工作量,并且更易于閱讀。我們以SiouxFalls交通網(wǎng)絡(luò)為例,進(jìn)行交通網(wǎng)絡(luò)構(gòu)建與流量分配。

3.1?導(dǎo)入必要的庫(kù)

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from scipy.optimize import minimize_scalar
  • pandas,用于讀取文件;
  • numpy在計(jì)算誤差時(shí)使用;
  • networkx貫穿整個(gè)代碼;
  • matplotlib用于繪制交通網(wǎng)絡(luò)圖
  • scipy在搜索最優(yōu)步長(zhǎng)時(shí)用到。

?3.2?構(gòu)建交通網(wǎng)絡(luò)

def build_network(Link_path, Node_path):
    # 讀取點(diǎn)數(shù)據(jù)、邊數(shù)據(jù)
    links_df = pd.read_csv(Link_path)
    # 需要注意使用from_pandas_edge,其讀取的邊的順序和csv中邊的順序有差異
    G = nx.from_pandas_edgelist(links_df, source='O', target='D', edge_attr=['FFT', 'Capacity'], create_using=nx.DiGraph())
    nx.set_edge_attributes(G, 0, 'flow_temp')
    nx.set_edge_attributes(G, 0, 'flow_real')
    nx.set_edge_attributes(G, 0, 'descent')
    nx.set_edge_attributes(G, nx.get_edge_attributes(G, "FFT"), 'weight')

    # 獲取節(jié)點(diǎn)位置信息
    nodes_df = pd.read_csv(Node_path)
    node_positions = {}
    for index, row in nodes_df.iterrows():
        node_positions[row['id']] = (row['pos_x'], row['pos_y'])
    # 更新圖中節(jié)點(diǎn)的位置屬性
    nx.set_node_attributes(G, node_positions, 'pos')
    return G
  • Link_path,表示路網(wǎng)文件路徑。下載鏈接見文末,數(shù)據(jù)示例如下:
O D FFT Capacity
1 2 6 25900.20064
1 3 4 23403.47319
2 1 6 25900.20064
2 6 5 4958.180928
3 1 4 23403.47319
  • Node_path,表示節(jié)點(diǎn)文件路徑。下載鏈接見文末,數(shù)據(jù)示例如下:
id pos_x pos_y
1 2 2
2 13 2
3 2 5
4 5 5
5 9 5
  • flow_real,表示每次迭代更新后的路段流量或初始化流量,所有路段的flow_real組成
  • flow_temp,?所有路段的flow_temp組成
  • descent,表示flow_temp與flow_real的差值,所有路段的descent組成
  • weight,表示路阻。初始的路阻,由于路段流量都是0,所以直接用FFT。后續(xù)將用BPR函數(shù)計(jì)算

3.3 繪制交通路網(wǎng)圖

def draw_network(G):
    pos = nx.get_node_attributes(G, "pos")
    nx.draw(G, pos, with_labels=True, node_size=200, node_color='lightblue', font_size=10, font_weight='bold')
    plt.show()

?????????構(gòu)建交通網(wǎng)絡(luò)后,我們來看一看這個(gè)SiouxFalls網(wǎng)絡(luò)長(zhǎng)什么樣子吧

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

3.4?定義BPR函數(shù)

def BPR(FFT, flow, capacity, alpha=0.15, beta=4.0):
    return FFT * (1 + alpha * (flow / capacity) ** beta)
  • FTT,表示最快通過時(shí)間;
  • flow,表示路段流量;
  • capacity,表示路段通行能力;
  • alpha和beta,是BPR函數(shù)的參數(shù),在此取默認(rèn)值。

3.5?初始化路網(wǎng)流量

def all_none_initialize(G, od_df):
    # 這個(gè)函數(shù)僅使用一次,用于初始化
    # 在零流圖上,按最短路全有全無分配,用于更新flow_real
    for _, od_data in od_df.iterrows():
        source = od_data["o"]
        target = od_data["d"]
        demand = od_data["demand"]
        # 計(jì)算最短路徑
        shortest_path = nx.shortest_path(G, source=source, target=target, weight="weight")
        # 更新路徑上的流量
        for i in range(len(shortest_path) - 1):
            u = shortest_path[i]
            v = shortest_path[i + 1]
            G[u][v]['flow_real'] += demand
    # 初始化流量后,更新阻抗
    for _, _, data in G.edges(data=True):
        data['weight'] = BPR(data['FFT'], data['flow_real'], data['Capacity'])

????????這個(gè)函數(shù)僅使用一次,用于初始化。在零流圖上,按最短路全有全無分配,用于得到。

  • od_df表示pd.Dataframe數(shù)據(jù)格式的OD流量信息。ODParis.csv示例數(shù)據(jù)如下:
o d demand
1 2 100
1 3 100
1 4 500
1 5 200
1 6 300
1 7 500

3.6 獲取?flow_temp

????????flow_temp,即

def all_none_temp(G, od_df):
    # 這個(gè)是虛擬分配,用于得到flow_temp
    # 每次按最短路分配前,需要先將flow_temp歸零
    nx.set_edge_attributes(G, 0, 'flow_temp')
    for _, od_data in od_df.iterrows():
        # 每次更新都得讀OD,后面嘗試優(yōu)化這個(gè)
        source = od_data["o"]
        target = od_data["d"]
        demand = od_data["demand"]
        # 計(jì)算最短路徑
        shortest_path = nx.shortest_path(G, source=source, target=target, weight="weight")
        # 更新路徑上的流量
        for i in range(len(shortest_path) - 1):
            u = shortest_path[i]
            v = shortest_path[i + 1]
            # 更新流量
            G[u][v]['flow_temp'] += demand

3.7?獲取下降方向descent

????????descent,即

def get_descent(G):
    for _, _, data in G.edges(data=True):
        data['descent'] = data['flow_temp'] - data['flow_real']

3.8? 定義目標(biāo)函數(shù)

def objective_function(temp_step, G):
    s, alpha, beta = 0, 0.15, 4.0
    for _, _, data in G.edges(data=True):
        x = data['flow_real'] + temp_step * data['descent']
        s += data["FFT"] * (x + alpha * data["Capacity"] / (beta + 1) * (x / data["Capacity"]) ** (beta + 1))
    return s

????????該部分代碼,對(duì)應(yīng)本文1.4部分的目標(biāo)函數(shù),即:

beckmann 提出的ue狀態(tài)下的優(yōu)化模型,交通網(wǎng)絡(luò),python,交通物流

3.9?一維搜索最優(yōu)步長(zhǎng),并更新流量

def update_flow_real(G):
    # 這個(gè)函數(shù)用于調(diào)整流量,即flow_real,并更新weight
    best_step = get_best_step(G)  # 獲取最優(yōu)步長(zhǎng)
    for _, _, data in G.edges(data=True):
        # 調(diào)整流量,更新路阻
        data['flow_real'] += best_step * data["descent"]
        data['weight'] = BPR(data['FFT'], data['flow_real'], data['Capacity'])


def get_best_step(G, tolerance=1e-4):
    result = minimize_scalar(objective_function, args=(G,), bounds=(0, 1), method='bounded', tol=tolerance)
    return result.x

3.10?主函數(shù)

def main():
    G = build_network("Link.csv", "Node.csv")  # 構(gòu)建路網(wǎng)
    draw_network(G)  # 繪制交通路網(wǎng)圖
    od_df = pd.read_csv("ODPairs.csv")  # 獲取OD需求情況
    all_none_initialize(G, od_df)  # 初始化路網(wǎng)流量
    print("初始化流量", list(nx.get_edge_attributes(G, 'flow_real').values()))

    epoch = 0  # 記錄迭代次數(shù)
    err, max_err = 1, 1e-4  # 分別代表初始值、最大容許誤差
    f_list_old = np.array(list(nx.get_edge_attributes(G, 'flow_real').values()))
    while err > max_err:
        epoch += 1
        all_none_temp(G, od_df)  # 全有全無分配,得到flow_temp
        get_descent(G)  # 計(jì)算梯度,即flow_temp-flow_real
        update_flow_real(G)  # 先是一維搜索獲取最優(yōu)步長(zhǎng),再調(diào)整流量,更新路阻

        # 計(jì)算并更新誤差err
        f_list_new = np.array(list(nx.get_edge_attributes(G, 'flow_real').values()))  # 這個(gè)變量是新的路網(wǎng)流量列表
        d = np.sum((f_list_new - f_list_old) ** 2)
        err = np.sqrt(d) / np.sum(f_list_old)
        f_list_old = f_list_new

    print("均衡流量", list(nx.get_edge_attributes(G, 'flow_real').values()))
    print("迭代次數(shù)", epoch)
    # 導(dǎo)出網(wǎng)絡(luò)均衡流量
    df = nx.to_pandas_edgelist(G)
    df = df[["source", "target", "flow_real"]].sort_values(by=["source", "target"])
    df.to_csv("網(wǎng)絡(luò)均衡結(jié)果.csv", index=False)


if __name__ == '__main__':
    main()
  • epoch,表示迭代次數(shù)
  • err,表示誤差初始值
  • max_err,表示最大容許誤差
  • ?f_list_new, f_list_old分別表示和,用于計(jì)算誤差

四、所用文件

? ? ? ? 下載鏈接:交通分配(UE模型)

?

到了這里,關(guān)于基于Frank Wolfe算法,求解交通分配UE模型(Python & NetWorkX)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 2015年亞太杯APMCM數(shù)學(xué)建模大賽B題城市公共交通服務(wù)水平動(dòng)態(tài)評(píng)價(jià)模型求解全過程文檔及程序

    2015年亞太杯APMCM數(shù)學(xué)建模大賽B題城市公共交通服務(wù)水平動(dòng)態(tài)評(píng)價(jià)模型求解全過程文檔及程序

    原題再現(xiàn) ?? 城市公共交通服務(wù)評(píng)價(jià)是城市公共交通系統(tǒng)建設(shè)和提高公共交通運(yùn)營(yíng)效率的重要組成部分。對(duì)于公交企業(yè),管理和規(guī)劃部門,傳統(tǒng)公交車站、線路和換乘樞紐的規(guī)劃數(shù)據(jù)只是基于主管部門收集的統(tǒng)計(jì)數(shù)據(jù)和人工盤點(diǎn)。 ?? 在自動(dòng)采集技術(shù)日益發(fā)展的今天,如果

    2024年02月07日
    瀏覽(83)
  • 機(jī)器學(xué)習(xí)筆記之優(yōu)化算法(七)線搜索方法(步長(zhǎng)角度;非精確搜索;Wolfe Condition)

    機(jī)器學(xué)習(xí)筆記之優(yōu)化算法(七)線搜索方法(步長(zhǎng)角度;非精確搜索;Wolfe Condition)

    上一節(jié)介紹了 Glodstein text{Glodstein} Glodstein 準(zhǔn)則 ( Glodstein?Condition ) (text{Glodstein Condition}) ( Glodstein?Condition ) 及其弊端。本節(jié)將針對(duì)該弊端,介紹 Wolfe text{Wolfe} Wolfe 準(zhǔn)則 ( Wolfe?Condition ) (text{Wolfe Condition}) ( Wolfe?Condition ) 。 Armijo text{Armijo} Armijo 準(zhǔn)則及其弊端 在當(dāng)前迭代步驟

    2024年02月14日
    瀏覽(15)
  • 交通物流模型 | 基于交通圖卷積長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的網(wǎng)絡(luò)級(jí)交通流預(yù)測(cè)

    交通物流模型 | 基于交通圖卷積長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的網(wǎng)絡(luò)級(jí)交通流預(yù)測(cè) 由于道路網(wǎng)絡(luò)時(shí)變的交通模式和復(fù)雜的空間依賴性,交通流預(yù)測(cè)是一個(gè)具有挑戰(zhàn)性的時(shí)空預(yù)測(cè)問題。為了克服該挑戰(zhàn),作者將交通網(wǎng)絡(luò)看為一張圖,并提出一個(gè)新的深度學(xué)習(xí)預(yù)測(cè)模型,交通圖卷積長(zhǎng)短時(shí)記憶

    2024年02月07日
    瀏覽(19)
  • 武器目標(biāo)分配問題研究進(jìn)展: 模型、算法與應(yīng)用

    武器目標(biāo)分配問題研究進(jìn)展: 模型、算法與應(yīng)用

    源自:系統(tǒng)公正與電子技術(shù) 作者:李夢(mèng)杰? 常雪凝? 石建邁? 陳超? 黃金才? 劉忠 武器目標(biāo)分配問題是指揮控制與任務(wù)規(guī)劃領(lǐng)域的關(guān)鍵難點(diǎn)之一, 也是軍事運(yùn)籌領(lǐng)域的基礎(chǔ)研究課題。經(jīng)過多年研究, 武器目標(biāo)分配問題在陸??仗祀姷阮I(lǐng)域都得到了廣泛研究, 涌現(xiàn)出了大量模型

    2024年02月10日
    瀏覽(17)
  • 【特別篇】基于動(dòng)態(tài)規(guī)劃的武器指揮系統(tǒng)火力分配模型

    【特別篇】基于動(dòng)態(tài)規(guī)劃的武器指揮系統(tǒng)火力分配模型

    本文 仍然只是 B站相關(guān)視頻的 代碼復(fù)現(xiàn) ,感興趣的朋友可以進(jìn)一步了解 武器指揮分類決策火力問題 的更多內(nèi)容。 筆者簡(jiǎn)介:CCNU計(jì)科,喜歡看日漫唱歌看球和彈鋼琴,還有偶像梅老板。 火力分配屬于一種資源分配問題,將供應(yīng)量有限的若干種資源,比如說資金、機(jī)器設(shè)備、

    2024年02月06日
    瀏覽(20)
  • 遺傳算法及基于該算法的典型問題的求解實(shí)踐

    遺傳算法及基于該算法的典型問題的求解實(shí)踐

    ? ? 遺傳算法是一個(gè)很有用的工具,它可以幫我們解決生活和科研中的諸多問題。最近在看波束形成相關(guān)內(nèi)容時(shí)了解到可以用這個(gè)算法來優(yōu)化陣元激勵(lì)以壓低旁瓣,于是特地了解和學(xué)習(xí)了一下這個(gè)算法,覺得蠻有意思的,于是把這兩天關(guān)于該算法的學(xué)習(xí)和實(shí)踐的內(nèi)容總結(jié)成了

    2024年03月21日
    瀏覽(25)
  • DETR | 基于匈牙利算法的樣本分配策略

    DETR | 基于匈牙利算法的樣本分配策略

    如有錯(cuò)誤,懇請(qǐng)指出。 前不久,沐神對(duì)DETR進(jìn)行了講解,其實(shí)之前也對(duì)DETR進(jìn)行了介紹,見:論文閱讀筆記 | 目標(biāo)檢測(cè)算法——DETR。現(xiàn)對(duì)DETR的核心內(nèi)容進(jìn)行重溫,也就是其所提出的目標(biāo)檢測(cè)的end-to-end框架,輸入的是一張圖像,輸出的直接是最后的預(yù)測(cè)標(biāo)注結(jié)果,不再需要后處

    2024年02月11日
    瀏覽(24)
  • 基于OR-Tools的裝箱問題模型求解(PythonAPI)

    基于OR-Tools的裝箱問題模型求解(PythonAPI)

    裝箱問題(packing problem)的描述是要將一組給定尺寸的物品放置到具有固定容量的容器中,一般情況下由于容器有容量限制,不可能放入所有物品,那么裝箱問題的目標(biāo)是要找到限定約束下使得總價(jià)值最大或總花費(fèi)最小的裝箱方法。根據(jù)我們具體的目標(biāo)情況,裝箱問題又可分

    2024年02月06日
    瀏覽(18)
  • 實(shí)驗(yàn)六 基于 Dijsktra 算法的最短路徑求解

    實(shí)驗(yàn)六 基于 Dijsktra 算法的最短路徑求解

    實(shí)驗(yàn)六 基于Dijsktra算法的最短路徑求解 一、實(shí)驗(yàn)?zāi)康?1.掌握?qǐng)D的鄰接矩陣表示法,掌握采用鄰接矩陣表示法創(chuàng)建圖的算法。 2.掌握求解最短路徑的 Dijsktra 算法。 二、實(shí)驗(yàn)內(nèi)容 一張地圖包括 n 個(gè)城市,假設(shè)城市間有 m 條路徑(有向圖),每條路徑的長(zhǎng)度 已知。給定地圖的一個(gè)起

    2024年01月18日
    瀏覽(91)
  • 基于梯度下降算法的無約束函數(shù)極值問題求解

    基于梯度下降算法的無約束函數(shù)極值問題求解

    導(dǎo)數(shù)(Derivative),也叫 導(dǎo)函數(shù)值 。又名 微商 ,是微積分中的重要基礎(chǔ)概念。 導(dǎo)數(shù)是函數(shù)的局部性質(zhì)。一個(gè)函數(shù)在某一點(diǎn)的導(dǎo)數(shù)描述了這個(gè)函數(shù)在這一點(diǎn)附近的變化率 。如果函數(shù)的自變量和取值都是實(shí)數(shù)的話,函數(shù)在某一點(diǎn)的導(dǎo)數(shù)就是該函數(shù)所代表的曲線在這一點(diǎn)上的切線

    2024年02月13日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包