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. 检查是否满足均衡条件
MNL(SUE) --> CNL-UE with FW_第1张图片
计算机跑出的结果

完全满足均衡条件


MNL(SUE) --> CNL-UE with FW_第2张图片
看看是否满足均衡条件
  1. Dispersion parameter
    Theta=2


    MNL(SUE) --> CNL-UE with FW_第3张图片
    Paste_Image.png

    Theta=3


    MNL(SUE) --> CNL-UE with FW_第4张图片
    Paste_Image.png

    Theta=0.5
    MNL(SUE) --> CNL-UE with FW_第5张图片
    Paste_Image.png

    Theta=0.1
    MNL(SUE) --> CNL-UE with FW_第6张图片
    Paste_Image.png

    不能达到收敛(Theta=0.1)

MNL(SUE) --> CNL-UE with FW_第7张图片
Paste_Image.png
  1. 计算一下平均最小期望


    Paste_Image.png

    Theta=0.1的时候也不一致。


    MNL(SUE) --> CNL-UE with FW_第8张图片
    Paste_Image.png

    吓死爹了,excel中ln试ln,然后就一致了
    Paste_Image.png

总结

FW在解MNL based SEU时就会出现偏差

  1. congestion situation
MNL(SUE) --> CNL-UE with FW_第9张图片
在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;已经达到最优了。

MNL(SUE) --> CNL-UE with FW_第10张图片
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上也能跑起来

你可能感兴趣的:(MNL(SUE) --> CNL-UE with FW)