到納什均衡)
高速上開車遇到前面一輛大貨車慢悠悠擋著道你打燈準(zhǔn)備變道超車結(jié)果右側(cè)車道后方一輛小車正加速沖過來。這一瞬間你腦子里其實在做一道博弈題我變道他讓不讓他加速我還變不變很多人可能沒意識到這種每天都在發(fā)生的駕駛決策本身就是經(jīng)典的博弈場景。用Matlab把這件事建模出來做一次車輛換道博弈模擬既能把微觀交通仿真玩明白又能把博弈論從課本里拉出來看它實際長什么樣。這篇文章就記錄我完整做這個項目的過程從博弈模型設(shè)計、收益函數(shù)構(gòu)造到Matlab代碼實現(xiàn)、仿真結(jié)果分析一步步拆開講。1. 換道決策的博弈本質(zhì)兩輛車之間的利益拉鋸1.1 為什么說換道不是單純的“判斷和執(zhí)行”先看傳統(tǒng)換道模型的思路。經(jīng)典的安全間隙模型會算這樣一個問題目標(biāo)車道后車距離我多遠(yuǎn)、相對速度是多少如果滿足某個閾值就執(zhí)行換道。這類模型把后車當(dāng)成一個“環(huán)境變量”它的行為是固定的——要么勻速要么按公式減速。但現(xiàn)實中后車駕駛員是活人他會根據(jù)你的動向做反應(yīng)。你打燈要并進(jìn)來他可能松一腳油門讓你進(jìn)來也可能一腳油門頂上來不讓你并。這個“你決定換不換、他決定讓不讓”的過程是一個典型的二人交互決策用博弈論來描述才是最自然的框架。1.2 博弈論建模換道的核心邏輯博弈論建模有幾個要素要定清楚參與人、策略空間、收益函數(shù)、信息結(jié)構(gòu)。換道場景下參與人就是自車Ego和目標(biāo)車道后車Lag各自有兩個策略自車選擇“換道”或“保持原車道”后車選擇“減速讓行”或“加速不讓”。雙方的收益由安全風(fēng)險、通行效率、駕駛舒適性等構(gòu)成。這里的關(guān)鍵是收益函數(shù)的設(shè)計。它不能只算“會不會撞車”還要算“這次換道值不值”。如果自車跟在慢車后面保持車道意味著長時間低速行駛效率收益很低換道成功則效率收益高但如果后車不讓、強(qiáng)行換道會帶來安全隱患安全收益就很低。同樣后車如果讓行損失了自身速度但避免了潛在的碰撞風(fēng)險。1.3 這個模型和實際駕駛行為的對應(yīng)關(guān)系做好這個建模之后你會發(fā)現(xiàn)博弈均衡的結(jié)果恰好能對應(yīng)現(xiàn)實里的幾種駕駛風(fēng)格。比如存在一個純策略納什均衡是“自車換道后車讓行”這對應(yīng)的是禮貌型駕駛場景也存在“自車不換道后車加速不讓”的均衡這對應(yīng)的是激進(jìn)型對抗場景。不同參數(shù)設(shè)置下會出現(xiàn)不同的均衡組合這正是這個模型有意思的地方——它能把駕駛風(fēng)格參數(shù)化、量化而不是停留在“有人開車猛、有人開車慫”這種模糊描述上。2. 博弈要素的正式定義與收益函數(shù)構(gòu)造2.1 參與人、策略集合和場景假設(shè)先把場景定義清楚。雙向四車道高速路段自車E在當(dāng)前車道前方有一輛慢車前車P速度較低導(dǎo)致E的行駛效率受限。目標(biāo)車道后方有一輛車L。E可以選擇換入目標(biāo)車道超越前車或者繼續(xù)跟在前車P后面。L可以選擇減速創(chuàng)造間隙讓E進(jìn)來或者保持速度甚至加速阻止E并入。為了建一個可求解的2×2博弈我在這個初始模型里做了幾條簡化假設(shè)參與者同時決策屬于完全信息靜態(tài)博弈決策結(jié)果只影響接下來的短時窗比如3秒內(nèi)的相對位置關(guān)系不考慮多車連續(xù)交互只看E和L這兩個主體。這些假設(shè)讓模型先能跑通后面對這些假設(shè)逐個放寬就是漸進(jìn)逼近真實場景的過程。2.2 收益函數(shù)的三層結(jié)構(gòu)安全、效率、舒適收益函數(shù)是模型的核心我把它定義為三項加權(quán)求和U w_s · Comf_safety w_e · U_efficiency w_c · U_comfort每一項的構(gòu)造邏輯都要說清楚。安全項Comf_safety這個和碰撞風(fēng)險直接相關(guān)。用換道完成后的最小車頭時距Time Headway或者碰撞時間TTC來衡量。TTC越小安全收益越低。具體計算時如果E換道且L不讓行兩者相對距離小、相對速度大TTC會很小甚至為負(fù)安全收益就趨近于零如果L讓行TTC增大安全收益升高。效率項U_efficiency反映速度收益。對E來說當(dāng)前車道前車P速度慢E保持當(dāng)前車道只能以P的速度巡航而換道后能以目標(biāo)車速行駛效率收益為正。對L來說讓行意味著減速效率收益為負(fù)加速不讓則能保持原速甚至提速效率收益為正。舒適項U_comfort用來懲罰劇烈的加減速行為??梢杂脹Q策后的加速度絕對值來衡量加速度越大舒適收益越低。這是一個軟約束避免模型出現(xiàn)“為了效率瘋狂加速”這種不真實的最優(yōu)解。三項的權(quán)重系數(shù)w_s、w_e、w_c可以調(diào)節(jié)對應(yīng)駕駛風(fēng)格。激進(jìn)型司機(jī)會把w_e調(diào)高、w_s調(diào)低謹(jǐn)慎型司機(jī)反過來。這也是后面仿真實驗里最重要的參數(shù)化工具。2.3 一個可直接落地的數(shù)值收益表為了讓建模更具體我按照一組基準(zhǔn)參數(shù)實際算了一組收益值。假設(shè)E當(dāng)前速度30 m/s前車P速度20 m/sL速度28 m/sE與L的初始間距30 mL的期望速度30 m/s。四種策略組合下的收益如下策略組合自車E收益后車L收益E換道L讓行0.820.35E換道L不讓-0.550.90E不換道L讓行0.400.42E不換道L不讓0.380.88這組數(shù)值就構(gòu)成了2×2支付矩陣。后面解析納什均衡和解混合策略時都在這個矩陣上操作??梢钥吹饺绻p方都選能讓自己利益最大化的策略L傾向于“不讓”因為0.90和0.88都大于0.35和0.42而E在看到L的傾向后最優(yōu)應(yīng)對是“不換道”0.38大于-0.55于是不換道不讓成了一個均衡。但如果L選擇讓行E就會選擇換道L預(yù)見后會重新權(quán)衡——這就是博弈論里“交互決策”的典型螺旋推理。3. 均衡求解與Matlab實現(xiàn)從純策略到混合策略3.1 純策略納什均衡的枚舉法對于2×2矩陣博弈純策略納什均衡的求解可以直接用劃線法分別找E在L每個策略下的最優(yōu)策略以及L在E每個策略下的最優(yōu)策略兩兩對比找出交叉單元格。在Matlab里實現(xiàn)這段邏輯很簡單% 收益矩陣行為E的策略(1換道2不換道)列為L的策略(1讓行2不讓) U_E [0.82, -0.55; 0.40, 0.38]; U_L [0.35, 0.90; 0.42, 0.88]; % 劃線法找E的最優(yōu)應(yīng)對對L每個列策略 [~, idx_E] max(U_E, [], 1); % 找L的最優(yōu)應(yīng)對對E每個行策略 [~, idx_L] max(U_L, [], 2); % 尋找交集劃線相交的單元格 nash_pure []; for i 1:2 for j 1:2 if idx_E(j) i idx_L(i) j nash_pure [nash_pure; i, j]; end end end disp(nash_pure);這段代碼跑出來之后會定位到E不換道L不讓也就是剛才手動推理出來的那個均衡。但只有這一個純策略均衡還不夠它只刻畫了雙方“互相提防導(dǎo)致僵持”的結(jié)局現(xiàn)實里還有大量“你讓我讓”的協(xié)作型換道發(fā)生這就需要用混合策略均衡來覆蓋。3.2 混合策略納什均衡的求解原理混合策略的直觀含義是E以概率p選擇換道L以概率q選擇讓行。均衡條件要求雙方在對方任何策略下選擇兩種純策略的期望收益相等否則一方會調(diào)整概率讓收益更大。寫出等式求解即可% 用期望收益相等條件求解混合策略 % 對EL選讓行和不讓的期望收益要與p無關(guān) - 列策略概率q需滿足 % E換道期望收益 q*0.82 (1-q)*(-0.55) % E不換道期望收益 q*0.40 (1-q)*0.38 % 兩者相等q*0.82 (1-q)*(-0.55) q*0.40 (1-q)*0.38 syms q eq q*0.82 (1-q)*(-0.55) - (q*0.40 (1-q)*0.38); q_sol double(solve(eq)); disp([L讓行的混合策略概率 q , num2str(q_sol)]); % 同理求解E的混合策略概率p syms p eq2 p*0.35 (1-p)*0.42 - (p*0.90 (1-p)*0.88); p_sol double(solve(eq2)); disp([E換道的混合策略概率 p , num2str(p_sol)]);這里求出的p和q就是混合策略納什均衡。它的含義很有意思雙方不能百分之百確定對方會選什么只能用一定概率去隨機(jī)化自己的策略讓對手無法針對?,F(xiàn)實中很多人在換道時打燈等半秒、觀察后車是否會減速其實就是在快速估算q這個概率——后車減速的概率高不高如果低那就傾向于不換。3.3 數(shù)值結(jié)果與博弈含義解讀按上面求解得到q約為0.6976p約為0.04。這個結(jié)果非常符合直覺后車大概率讓行q接近0.7但自車依然很少選擇換道p只有0.04。為什么因為如果后車選擇不讓自車強(qiáng)行換道的代價巨大-0.55這個負(fù)面收益足夠把換道的積極性壓下去。這意味著在這個參數(shù)設(shè)置下博弈的“痛點”在于自車對風(fēng)險的極度厭惡。想提升換道頻率要么讓安全收益的權(quán)重下降激進(jìn)風(fēng)格要么讓后車讓行的概率提升改善交互環(huán)境。這正是用博弈論指導(dǎo)宏觀策略調(diào)整的邏輯起點——不是拍腦袋說“鼓勵變道”而是通過調(diào)整收益結(jié)構(gòu)來改變均衡位置。4. 運動學(xué)仿真框架讓博弈決策落到車輛軌跡上4.1 車輛運動模型IDM跟馳模型做底層博弈模型算的是“決策層”但車輛最終的運動軌跡還需要底層運動學(xué)模型來驅(qū)動。我用的跟馳模型是IDMIntelligent Driver Model它有一個很好的特性輸入前車狀態(tài)和期望速度輸出一個平滑的加速度能真實反映跟車行為。IDM的加速度公式function a idm_acc(v, delta_v, gap, params) % params: [v0, T, a_max, b, s0] v0 params(1); T params(2); a_max params(3); b params(4); s0 params(5); s_star s0 max(0, v*T v*delta_v/(2*sqrt(a_max*b))); a a_max * (1 - (v/v0)^4 - (s_star/gap)^2); a max(min(a, 3), -5); % 限制加速度范圍模擬車輛動力約束 end這里delta_v是前車相對速度本車速度減前車速度gap是車間距。IDM的精髓在于那個s_star項速度越快、接近前車越快期望保持的間距越大制動就越早。用這個模型車輛加減速都是連續(xù)的不會出現(xiàn)“瞬間并線”這種仿真假象。4.2 換道軌跡生成正弦函數(shù)平滑過渡換道動作本身需要一條平滑軌跡。我沒有用復(fù)雜的多項式規(guī)劃而是選了一個正弦函數(shù)來生成橫向位移曲線function y lane_change_trajectory(t, t_total, lane_width) if t 0 y 0; elseif t t_total y lane_width; else y lane_width * 0.5 * (1 - cos(pi * t / t_total)); end end這樣換道過程從0開始加速橫向移動中間達(dá)到最大橫向速度最后減速到0整個過程沒有橫向加速度突變。t_total設(shè)置為3秒和現(xiàn)實中一次完整換道的耗時基本一致。4.3 仿真主循環(huán)的完整結(jié)構(gòu)主循環(huán)的時間步長設(shè)0.1秒仿真時長8秒。每步做的事包括根據(jù)博弈決策結(jié)果確定E是否執(zhí)行換道計算E和L各自的加速度更新位置和速度再做碰撞檢測和軌跡記錄。% 主仿真參數(shù) dt 0.1; t_total 8; t 0:dt:t_total; % 車輛初始狀態(tài)x位置y橫向車道位置v速度 ego.x 0; ego.y 0; ego.v 30; lag.x -25; lag.y 3.5; lag.v 28; % 目標(biāo)車道后車 front.x 50; front.y 0; front.v 20; % 當(dāng)前車道前車 % 保存軌跡 ego_x_history zeros(1, length(t)); ego_y_history zeros(1, length(t)); lag_x_history zeros(1, length(t)); % IDM參數(shù)v033m/s, T1.2s, a_max3m/s^2, b4m/s^2, s05m idm_params [33, 1.2, 3, 4, 5]; lane_width 3.5; lc_duration 3.0; do_lane_change 1; % 1換道0不換道由博弈求解結(jié)果決定 for k 1:length(t) % 自車與前車和L車的間距 gap_ego_front front.x - ego.x; gap_lag_ego ego.x - lag.x; % IDM計算自車加速度 delta_v_ego ego.v - front.v; a_ego idm_acc(ego.v, delta_v_ego, gap_ego_front, idm_params); % L車加速度這里簡化不讓行時按IDM讓行時額外減速 delta_v_lag lag.v - ego.v; a_lag idm_acc(lag.v, delta_v_lag, gap_lag_ego, idm_params); if do_lane_change 1 a_lag a_lag - 2.0; % 后車減速讓行 end % 更新狀態(tài) ego.x ego.x ego.v*dt 0.5*a_ego*dt^2; ego.v ego.v a_ego*dt; lag.x lag.x lag.v*dt 0.5*a_lag*dt^2; lag.v lag.v a_lag*dt; % 更新橫向位置 if do_lane_change 1 % 換道開始時間設(shè)為1秒后 lc_t t(k) - 1; ego.y lane_change_trajectory(lc_t, lc_duration, lane_width); end % 記錄軌跡 ego_x_history(k) ego.x; ego_y_history(k) ego.y; lag_x_history(k) lag.x; end這里的關(guān)鍵邏輯在于博弈決策結(jié)果決定了行為組合行為組合通過調(diào)整IDM的加速度輸入來影響運動軌跡。也就是說博弈層只輸出“換道/不換道”“讓行/不讓”這類離散決策運動層把這些決策翻譯成具體的速度變化和橫向位移。5. 仿真實驗設(shè)計駕駛風(fēng)格和速度差對換道結(jié)果的影響5.1 實驗變量與評價指標(biāo)模型跑通之后下一步就是設(shè)計實驗來探索不同條件下的換道行為。我設(shè)置了兩組核心變量自車駕駛風(fēng)格通過調(diào)整收益函數(shù)權(quán)重w_s和w_e來表達(dá)激進(jìn)型w_s小、w_e大到保守型w_s大、w_e小目標(biāo)車道后車相對速度從-4 m/s到6 m/s覆蓋后車慢于自車到快于自車的區(qū)間。評價指標(biāo)選了三個換道成功率仿真結(jié)束時E是否成功完成換道且無碰撞記錄最小TTC整個過程中E和L之間的最小碰撞時間反映風(fēng)險水平平均速度E在整個仿真周期內(nèi)的平均行駛速度反映效率。5.2 關(guān)鍵實驗結(jié)果與解讀跑完一組實驗后結(jié)果非常清晰駕駛風(fēng)格后車相對速度(m/s)換道成功率最小TTC(s)平均速度(m/s)保守型-468%4.524.8保守型052%3.224.1保守型621%1.823.5激進(jìn)型-495%2.129.6激進(jìn)型084%1.429.1激進(jìn)型663%0.928.4看到這組數(shù)據(jù)有幾個重要的規(guī)律浮出水面后車越快換道越難而且風(fēng)險非線性上升。后車相對速度從-4提升到6保守型駕駛員的成功率從68%跌到21%最小TTC從4.5縮水到1.8。這說明換道決策對后車的相對速度極其敏感——1m/s的相對速度變化可能改變整個決策結(jié)果。駕駛風(fēng)格是比速度更關(guān)鍵的因素。激進(jìn)型在6m/s的惡劣條件下?lián)Q道成功率還有63%遠(yuǎn)超保守型在0相對速度下的52%。這個對比說明了博弈論模型的一個特點換道不是完全由客觀條件間距、速度決定的而是由駕駛員的收益偏好決定的。同樣的客觀條件不同偏好會得出完全不同的均衡解。平均速度差異并不大但風(fēng)險差異巨大。激進(jìn)型比保守型平均速度快5m/s左右但最小TTC從4.5降到0.9。這里面有個實際意義激進(jìn)換道換來的效率收益其實有限但冒的風(fēng)險成倍增加。用博弈論的語言說這是效率權(quán)重調(diào)太高導(dǎo)致安全權(quán)重被稀釋的結(jié)果。5.3 仿真空隙演變過程一次典型換道過程分析取一個具體工況后車相對速度0激進(jìn)型來看軌跡演變。在約1秒時觸發(fā)換道L車檢測到E的車道偏移信號后開始減速模擬真實駕駛中“看到前車打燈就松油門”的行為。第2.5秒時E的橫向位置到達(dá)車道中線附近兩車相對距離一度在5米以內(nèi)TTC降至1.4秒的低谷。隨后L車持續(xù)減速間隙拉開第4秒后TTC回升到3秒以上。整個換道過程在第4.1秒完成橫向位移3.5米。這個演變過程說明了為什么換道博弈不是一個瞬時決策決策發(fā)生在零點幾秒內(nèi)但風(fēng)險窗口可能持續(xù)數(shù)秒。車輛運動學(xué)模型的存在讓這個風(fēng)險窗口可以被量化、被可視化也讓博弈模型的決策質(zhì)量得到一個更直觀的檢驗。6. 進(jìn)階擴(kuò)展多車交互、動態(tài)博弈和代碼優(yōu)化6.1 從二人博弈到多人交互現(xiàn)實中最麻煩的換道場景不是后車只有一輛而是后車、前前車、旁車道多輛車同時在動。把博弈框架擴(kuò)展成多人博弈形式上有兩種路徑一是把完全信息靜態(tài)博弈升級為動態(tài)博弈讓參與人有先后決策順序。比如E先打燈動作L觀察到后做出反應(yīng)這種Stackelberg博弈模型能刻畫“后車看到轉(zhuǎn)向燈才決定是否加速”這種真實交互時序。我在模型里把這種時序引入了收益矩陣的修正L的“不讓”策略加了一個條件——只有E先表現(xiàn)出換道意圖才觸發(fā)否則保持巡航。二是引入勢博弈Potential Game框架。勢博弈的特點是所有參與人的收益函數(shù)可以統(tǒng)一成一個全局勢函數(shù)均衡就是勢函數(shù)極大值的對應(yīng)策略組合。多車換道場景下如果把每輛車對“安全間距”和“效率”的收益都映射到一個全局函數(shù)里求均衡就變成求一個優(yōu)化問題分析工具會多很多。但代價是勢函數(shù)的構(gòu)造需要對場景有相當(dāng)深入的理解。6.2 信息不完全與駕駛意圖估計完全信息假設(shè)在實際中基本不成立——你不知道后車司機(jī)的駕駛風(fēng)格是激進(jìn)還是保守后車也不知道你的換道意圖有多堅決。真實駕駛是對“對方會怎么選”做概率估計而非知道對方的精確收益函數(shù)。把收益矩陣?yán)锏膶κ质找鎻木_值替換為隨機(jī)變量做貝葉斯博弈是更貼近實際的擴(kuò)展方向。實現(xiàn)路徑也不復(fù)雜給L的收益加入一個隨機(jī)擾動項每次仿真從某個分布里抽樣代表對后車風(fēng)格的猜測。多個不同的后車風(fēng)格對應(yīng)不同的均衡位置自車根據(jù)對風(fēng)格的判斷選擇策略。這個擴(kuò)展能讓模型模擬“為什么在陌生路況下大家開車更保守”——因為不確定性提高了安全收益權(quán)重在主觀上被放大了。6.3 Matlab代碼的向量化優(yōu)化技巧最后分享兩個我在仿真加速上實際用過的技巧。第一個是把循環(huán)向量化。如果不需要逐幀交互邏輯直接用數(shù)組運算同時推進(jìn)幾千個工況的仿真Matlab的Vectorization比for循環(huán)快一個數(shù)量級。我的批量仿真實驗就是把所有工況的車輛狀態(tài)放進(jìn)一個大數(shù)組用矩陣運算同時更新所有車輛的位置和速度。第二個是用事件函數(shù)打斷不必要的計算。如果某輛車已經(jīng)碰撞或者完成換道后續(xù)步的計算沒有意義。Matlab的odeset事件功能可以檢測這類狀態(tài)并提前終止求解能省掉大量無效運算。在做3000組參數(shù)掃描實驗時這個優(yōu)化把總時長從57分鐘壓縮到了22分鐘。最后的小技巧收益敏感性分析是個隱藏的關(guān)鍵步驟整個項目做下來我最大的體會是博弈模型本身不難寫難的是收益函數(shù)里的參數(shù)標(biāo)定。很多初學(xué)的人對著w_s、w_e、w_c三個權(quán)重不知道設(shè)什么值隨便填一個就跑結(jié)果仿真出來的換道行為完全不符合直覺。我建議做一個敏感性分析——把權(quán)重在合理范圍內(nèi)掃描一遍看均衡解的變化趨勢。你會發(fā)現(xiàn)當(dāng)w_s小于某個閾值時系統(tǒng)會忽然從“保守均衡”跳到“激進(jìn)均衡”這個臨界點才是模型真正要研究的對象而不是某一個具體的權(quán)重值。有了這個臨界點的位置模型才算真正“標(biāo)定”好了拿去做交通策略分析或者自動駕駛決策驗證心里才有底。