Esempio n. 1
0
        //////////////////////矩阵计算//////////////////////
        //计算矩阵元素值(计算任意两个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表示起点到终点的总移动数目
        }
Esempio n. 2
0
 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();
     }
 }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        /// <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);
        }