MNL(SUE) --> CNL-UE with FW

case study

  1. VI Projection and MP FW comparison
  2. find they all collapse, find where is the problem
  3. see the performance of MNL based sue
  4. 公式是什么
  5. 正確嗎
  6. 算法
  7. 編程

Bug:

entropy_left 和 entropy_right相互顛倒防止

LeftTrialOutput = LeftTrialOutput + entropy_left;
RightTrialOutput = RightTrialOutput + entropy_right;
note 這個bug是通過一步步的debug試出來的。
  1. 用e-5來顯示比%.10lf更高的精度
%.5e //顯示5位數字
  1. 檢查是否滿足均衡條件
計算機跑出的結果

完全滿足均衡條件


看看是否滿足均衡條件
  1. Dispersion parameter
    Theta=2


    Paste_Image.png

    Theta=3


    Paste_Image.png

    Theta=0.5
    Paste_Image.png

    Theta=0.1
    Paste_Image.png

    不能達到收斂(Theta=0.1)

Paste_Image.png
  1. 計算一下平均最小期望


    Paste_Image.png

    Theta=0.1的時候也不一致。


    Paste_Image.png

    嚇死爹了,excel中ln試ln,然后就一致了
    Paste_Image.png

總結

FW在解MNL based SEU時就會出現偏差

  1. congestion situation
在Deamnd加倍,path cost比以前多10倍的情況下,表現良好,達到均衡,最小期望值也一樣

同樣,再此Demand下測試離散參數,同樣非常敏感,步長一開始好好的,然后,突然變0,前后解的誤差急劇減少,同時不收斂。這個可以像一開始一樣一步步看。

11/29

ptt不能過高

這時link free flow time, OD demand, BPR對ptt影響都很大。

line search 里面也有bug

for (p_i = 0; p_i < NoPs; p_i++){
            entropy_left = entropy_left + p[p_i].Pf_Left * (log(p[p_i].Pf_Left) - 1);
            entropy_right = entropy_right + p[p_i].Pf_Right * (log(p[p_i].Pf_Right) - 1);
        }

把這兩個問題測完,對Theta不敏感了,Apf符合Logit公式了。收斂的很好

改變Theta=2還是有bug

外部參數Theta要寫成2.0

到目前為止調整Theta沒問題了。Demand也可以。

Theta=0.1

符合logit fun
符合流量守恒
前后解相差很小。
Theta=0.01,direction=0;已經達到最優了。

Paste_Image.png

所得結論確實與Theta的變化一致。
CNL里面的離散參數
下層0-1
上層》0
下層=1時,為MNL
CNL有不同表達式,怎么互推
CNL更接近Probit,緩解了獨立性

CNL-UE with FW Debug

  1. CNL上沒有問題
  2. CNL excel 印證過,那估計在line search上有偏差
    從MNL(SUE)可以看出,output的精度由line search的精度決定。不會比line search的精度高。說錯了,提高line search的精度沒有提高最終結果的精度。
    S4LinkTravelTime(l);
    S2CNL_Loading(l, nm, n, od);
    S3AON(l, nm);
    S5Direct(l, nm);
    這幾部出錯的可能性不大
    打印輸出line search
    line search內部沒有問題,都在excel中核對過了
    簡化網絡,就考慮三條線的情況。
    也是AD符合CNL,line search有問題,不是路徑選擇的問題
    將step size adjust 放在循環外面,對結果沒有影響。

line search 在縮小到一定程度的時候就不動了。但是步長精度不需要那么高。問題不在這。MNL在line search的時候也有同樣的問題。
不是在已有的基礎上開發,就很難Debug。

如果link travel time是常數,一步就完成。所有流量分到最短路,line search 的時候確實是偏向均衡解的。說明,至少在一定情況下line search是沒問題的。改為線性函數,也不已完成,但是解不正確。看看MNL。對于FFT乘以系數還是常數,要與flow掛鉤;乘以一個常數,MNL也控制的不好;但是在輸入data的時候,也乘以一個系數,一步就能收斂。下面,把flow這個變量引入試試;加入Flow以后也不收斂,應該是收斂的。回到BPR就可以,都是增函數,為啥不一樣?BPR改成1次,也不收斂。這個怎么查?牽一發而動全身,肯定其他地方也用到了。看一遍流程就知道啦,link funtion是和objective fun連在一起的,link fun 改動,object fun也要改。如果是常數,obj不變化,正好碰巧了。我在VI里調link fun就沒關系,因為就一步用地link fun。把link flow調低,link flow和Obj調整好,對了,沒錯。不調低的話

  • 那我再試試CNL下面的link travel fun的改變會怎樣。
    直接到無窮了;

可能line search還有隱藏的問題
input對不對?

  1. Link travel time 是BPR+constant+constant

第二天,從CNL-UE測試起。

要修改的地方:頭文件,文件讀寫時的文件名,強行給定的最短路徑(OD pair, mode)
昨天的code 測試亂了,從倉庫里取原來的。又要重新Debug。說明,沒做一點改動都要記錄,不然馬上就忘了。而且代碼和數據要放一起,不能分開。
原來的代碼數據結構變了,都要改。主要時nest數據結構體。
** 在data input要輸入nest結構體**
將cost: nest cost, root cost, MargProb, CondProb都進行了調整
在probability 的計算代碼也進行了修改
另外,在AON中也發現了問題
加載的時輔助流量,不是流量(ADem,Dem)

  • 將FW與MSA進行對比:
    首先,結果不一致。
    第二,MSA的比FW更加符合CNL概率。
    第三,MSA的多種固定步長對結果沒有影響。(0.1,0.2... 1, 1.5)
    總結,可以認為是line search的問題。
  • 用VI的Projection和MSA對比,結果也不一致
  • 想原因,可能是link travel time的表達式不一樣,改成相同的表達式后,結果果然一致。
  • MSA改link cost中的一步,FW要改兩步
    然后想到,FW不但要改link cost的表達式,還要改line search里面積分的表達式。測試以后,發現FW,MSA,Projection對同一個算例求解得到相同的結果。

3 precision of FW and MSA is still not acceptable

3.1 Is the problem of AON?

membership 0.5-0.5 correct
membership 0.2-0.8 correct
Mu 0.8 correct (一開始是不一樣的,后來檢查一下CNL.xlxs,是原來的計算公式有錯,改過來就完全一樣了)
總結,不是AON的問題,還是要看看line search

3.2 check line search

check MSA: 精度一直在提高,只是比較慢而已。最高1e-6.
check line search: 精度一直在提高,明顯比MSA快。但是仍有上限,20 萬次迭代,最高1
e-7. 50萬次迭代,3*e-8. 同時查看AON—CNL,我認為沒有問題。
總結:line search 上也沒有問題,可能是FW自身的問題。

  • 在MNL(SUE)中出現過的左右顛倒的問題,沒有出現。
  • ptt也沒有過高
  • line search里面的積分表達式正確
  • 全局變量Theta要寫成1.0的形式
  • line search 時候的積分表達式不對

3.3 test on larger net

  • 規范輸入格式
  • input data format
  • input file name
  • head file
  • shortest path: different origin should be give the shortest path

還是有問題,跑不起來。那就只能一步步Debug。

  • 最短路給錯了,Wrong origin
    correct: Pred[2] = 15; Pred[3] = 15; Pred[15] = 14; Pred[14] = 5; Pred[5] = 1;
    Wrong:Pred[2] = 15; Pred[3] = 15; Pred[15] = 14; Pred[14] = 5; Pred[5] = 4;
    CNL pass
    all pass
    在ND上也能跑起來
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • fix step size 過高引起的Precision異常 Projection method 里面分為兩步,一...
    Silly_N_Fool閱讀 433評論 0 0
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • 記憶中,我最早接觸的書,是圖書連環畫,就是上面是圖畫,下面配有文字的小人書。在七八十年代,兒童圖書并不像現在那樣泛...
    一泓夜雨閱讀 472評論 8 4