case study
- VI Projection and MP FW comparison
- find they all collapse, find where is the problem
- see the performance of MNL based sue
- 公式是什么
- 正确吗
- 算法
- 编程
Bug:
entropy_left 和 entropy_right相互颠倒防止
LeftTrialOutput = LeftTrialOutput + entropy_left;
RightTrialOutput = RightTrialOutput + entropy_right;
note 这个bug是通过一步步的debug试出来的。
- 用e-5来显示比%.10lf更高的精度
%.5e //显示5位数字
- 检查是否满足均衡条件
完全满足均衡条件
-
Dispersion parameter
Theta=2
Theta=3
Theta=0.5
Theta=0.1
不能达到收敛(Theta=0.1)
-
计算一下平均最小期望
Theta=0.1的时候也不一致。
吓死爹了,excel中ln试ln,然后就一致了
总结
FW在解MNL based SEU时就会出现偏差
- congestion situation
同样,再此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;已经达到最优了。
所得结论确实与Theta的变化一致。
CNL里面的离散参数
下层0-1
上层》0
下层=1时,为MNL
CNL有不同表达式,怎么互推
CNL更接近Probit,缓解了独立性
CNL-UE with FW Debug
- CNL上没有问题
- 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对不对?
- 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 万次迭代,最高1e-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上也能跑起来