//////////////////////矩阵计算////////////////////// //计算矩阵元素值(计算任意两个MPZ间连接值的连接矩阵),m1和m2就是两条MPZ public static double CountEle(MPZ m1, MPZ m2, Dictionary <int, Zone> zlist) { if (m1.PatternId == m2.PatternId) { return(0); //同一条轨迹取0 } if (!Zone.zone_dis(zlist[m1.SId], zlist[m2.SId], m_dzonemax)) { return(0); //起点不相邻取0 } if (!Zone.zone_dis(zlist[m1.EId], zlist[m2.EId], m_dzonemax)) { return(0); //终点不相邻取0 } long n1 = zlist[m1.SId].StaNos.Count(); //m1里面起点包含站点的个数 long n2 = zlist[m1.EId].StaNos.Count(); //m1里面终点包含站点的个数 long n3 = zlist[m2.SId].StaNos.Count(); long n4 = zlist[m2.EId].StaNos.Count(); long cnt = 0, n5 = 0, n6 = 0; List <int> S_Sta = new List <int>(); //m1和m2中的起点的站点标识码 List <int> E_Sta = new List <int>(); //m1和m2中的终点的站点标识码 //起点站点去重s for (int i = 0; i < n1; i++) { S_Sta.Add(zlist[m1.SId].StaNos[i]);//add可能会重复添加 } for (int i = 0; i < n3; i++) { S_Sta.Add(zlist[m2.SId].StaNos[i]); } S_Sta = S_Sta.Distinct().ToList();//去重 //终点站点去重 for (int i = 0; i < n2; i++) { E_Sta.Add(zlist[m1.EId].StaNos[i]); } for (int i = 0; i < n4; i++) { E_Sta.Add(zlist[m2.EId].StaNos[i]); } E_Sta = E_Sta.Distinct().ToList(); n5 = S_Sta.Count(); //起点个数 n6 = E_Sta.Count(); //终点个数 for (int i = 0; i < n5; i++) { for (int j = 0; j < n6; j++) { cnt += Data.moveamount[S_Sta [i] - 1][E_Sta[j] - 1]; } } return(((double)cnt) / (n5 * n6));//两个MPZ间的连接值,n5*n6表示起点到终点的总移动数目 }
private static object RandomInclusive(params object[] args) { if (args.Length >= 2) { return(MPZ.URandom((MPZ)args[0], (MPZ)args[1], true)); } else if (args.Length >= 1) { return(MPZ.URandom((MPZ)args[0], true)); } else { throw new System.ArgumentException(); } }
public static double m_dmaxstop = 175; //迭代终止阈值,迭代最大adj值 // public static double zadjvalue = 10;//地域相邻阈值 static void Main(string[] args) { Dictionary <int, Zone> dicSta;//out内部会初始化,所以外部可以不初始化 Dictionary <int, MPZ> dicMpz = new Dictionary <int, MPZ>(); string str1 = "../../../pnt_project.txt"; string str2 = "../../../move_rcd2.txt"; Dictionary <int, Station> dicS = Station.sta_Read(str1); //读站点文件 if (!Zone.zone_Ini(dicS, out dicSta)) //将站点初始化为地域得到地域集 { Console.WriteLine("地域初始化失败!"); return; //异常结束 } Dictionary <int, MoveRcd> dicMov = MoveRcd.move_Read(str2); //读轨迹文件 if (!MPZ.move_Ini(dicMov, out dicMpz, m_iMinMoveVal)) //将移动轨迹初始化为MPZ(筛选后的) { Console.WriteLine("MPZ初始化失败!"); return;//异常结束 } int i = 0; while (UpdateMatrix(matrix, dicMpz, dicSta, m_dmaxstop) != 0) { i++;//迭代次数 } int nm = 0; double avev = 0; double avea = 0; double avec = 0; double navev = 0; double navea = 0; double navec = 0; measure(dicMpz, dicSta, ref avev, ref avea, ref avec, ref navev, ref navea, ref navec, ref nm); int rep = ClearRepZone(dicMpz, dicSta);//去除重复地域 Console.WriteLine("最小移动数目:{0},地域相邻阈值:{1},停止迭代阈值:{2},迭代次数:{3},删除地域个数:{4}", m_iMinMoveVal, m_dzonemax, m_dmaxstop, i, rep); //filew1 << z; Console.WriteLine("新MPZ:{0},平均v:{1},平均a:{2},平均c:{3},新平v:{4}, 新平a:{5}, 新平c:{6}", nm, avev, avea, avec, navev, navea, navec); // filew2 << m; }
/// <summary> /// 更新矩阵 /// </summary> /// <returns></returns> public static int UpdateMatrix(double[,] matrix, Dictionary <int, MPZ> dicMpz, Dictionary <int, Zone> dicSta, double epsi) { stop1 = dicMpz.Count; if (matrix == null) { matrix = BuildMatrix(dicMpz, dicSta); } int mi = 0, mj = 0; double max = getMax(dicMpz, matrix, ref mi, ref mj); if (max < epsi || stop1 == stop2) { return(0);//连接值小于阈值或者不能进行合并,停止迭代 } int n1 = 1, n2 = 1; int szonid1 = dicMpz[mi].SId;//mi的上客站点标识码,返回序列中指定索引 int ezonid1 = dicMpz[mi].EId; int szonid2 = dicMpz[mj].SId; int ezonid2 = dicMpz[mj].EId; int startz = 0, endz = 0; //新地域的站点:两个起始站点合并 if (szonid1 != szonid2) { startz = zone_merge(dicSta, szonid1, szonid2, ref n1); } else { startz = szonid1; } //新地域的站点:两个终点站点合并 if (ezonid1 != ezonid2) { /*if(szonid1==ezonid1&&szonid2==ezonid2) * endz = startz;*/ endz = zone_merge(dicSta, ezonid1, ezonid2, ref n2); } else { endz = ezonid1; } //更新移动表 //把第mi个删除,并取出值 int tracnum = 0; MPZ mpzMove = dicMpz[mi]; //把第mi个值取出 dicMpz.Remove(mi); //把第mi个删除 tracnum = mpzMove.MoveNum; mi = mpzMove.PatternId; Data.move_num[szonid1 - 1][ezonid1 - 1] = 0; //把第mj个删除,并取出值 mpzMove = dicMpz[mj]; //把第mj个值取出 dicMpz.Remove(mj); //把第mj个删除 tracnum += mpzMove.MoveNum; mj = mpzMove.PatternId; Data.move_num[szonid2 - 1][ezonid2 - 1] = 0; MPZ nmpz = new MPZ(); nmpz.PatternId = moveid++; nmpz.SId = startz; //合并后的起点ID nmpz.EId = endz; //合并后的终点ID nmpz.MoveNum = tracnum; //移动模式包含移动记录的数量 nmpz.MoveNos.Add(mi); //导入两条搭乘记录所属的移动号 nmpz.MoveNos.Add(mj); //出入度 dicSta[startz].OutD += tracnum; //起点出度 dicSta[startz].InD += tracnum; //终点入度 tracnum = 0; //找子集 //子集 MPZ mpzSubMove = new MPZ(); //mpzSubMove为子集 for (int i = 0; i < n1; i++) //n1是m1起点的个数 { for (int j = 0; j < n2; j++) //n2是m1终点的个数 { mpzSubMove.SId = dicSta[startz].StaNos[i]; mpzSubMove.EId = dicSta[endz].StaNos[j]; if ((tracnum = Data.move_num[mpzSubMove.SId - 1][mpzSubMove.EId - 1]) != 0) //将子集的移动数目赋值给tracnum且不为零 { nmpz.MoveNum += tracnum; //合并子集移动数目 dicMpz.Remove(mpzSubMove.PatternId); //移除子集 Data.move_num[mpzSubMove.SId - 1][mpzSubMove.EId - 1] = 0; dicSta[startz].OutD += tracnum; dicSta[endz].InD += tracnum; } } } dicMpz.Add(dicMpz.Max(x => x.Key) + 1, nmpz);//将nmpz添加到dicMpz.Count的位置 BuildMatrix(dicMpz, dicSta); stop2 = stop1; return(2); }