Dijkstra算法求最短路径C#版.docx

上传人:b****6 文档编号:7404479 上传时间:2023-01-23 格式:DOCX 页数:20 大小:218.09KB
下载 相关 举报
Dijkstra算法求最短路径C#版.docx_第1页
第1页 / 共20页
Dijkstra算法求最短路径C#版.docx_第2页
第2页 / 共20页
Dijkstra算法求最短路径C#版.docx_第3页
第3页 / 共20页
Dijkstra算法求最短路径C#版.docx_第4页
第4页 / 共20页
Dijkstra算法求最短路径C#版.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Dijkstra算法求最短路径C#版.docx

《Dijkstra算法求最短路径C#版.docx》由会员分享,可在线阅读,更多相关《Dijkstra算法求最短路径C#版.docx(20页珍藏版)》请在冰豆网上搜索。

Dijkstra算法求最短路径C#版.docx

Dijkstra算法求最短路径C#版

Dijkstra算法求最短路径(C#版)

行如下图的路径,(V0是中心):

经过该算法后转化为下图

usingSystem;

usingSystem.Collections;

usingSystem.Text;

namespaceGreedy

{  

   classMarx

   {

       privateint[]distance;       

       privateintrow;

       privateArrayListways=newArrayList();

       publicMarx(intn,paramsint[]d)

       {

           this.row=n;

           distance=newint[row*row];

           for(inti=0;i

           {

               this.distance[i]=d[i];             

           }

           for(inti=0;i

           {

               ArrayListw=newArrayList();

               intj=0;

               w.Add(j);

               ways.Add(w);

           }

       }

       //------------------------------

       publicvoidFind_way()

       {

           ArrayListS=newArrayList

(1);

           ArrayListSr=newArrayList

(1);

           int[]Indexof_distance=newint[this.row];

           

           for(inti=0;i

           {

               Indexof_distance[i]=i;

           }

           S.Add(Indexof_distance[0]);       

           for(inti=0;i

           {

               Sr.Add(Indexof_distance[i]);

           }

           Sr.RemoveAt(0);

           int[]D=newint[this.row];   //存放中心点到每个点的距离

          

        //---------------以上已经初始化了,S和Sr(里边放的都是点的编号)------------------

           intCount=this.row-1;

           while(Count>0)

           {

               //假定中心点的编号是0的贪吃法求路径

               for(inti=0;i

                   D[i]=this.distance[i];

               intmin_num=(int)Sr[0]; //距中心点的最小距离点编号

               foreach(intsinSr)

               {

                   if(D[s]

               }

       

               //以上可以排序优化

               S.Add(min_num);

               Sr.Remove(min_num);

               //-----------把最新包含进来的点也加到路径中-------------

               ((ArrayList)ways[min_num]).Add(min_num);

               //-----------------------------------------------

               foreach(intelementinSr)

               {

                   intposition=element*(this.row)+min_num;

                   boolexchange=false;     //有交换标志

                   if(D[element]

                       D[element]=D[element];

                   else

                   {

                       D[element]=this.distance[position]+D[min_num];

                       exchange=true;

                   }

                   //修改距离矩阵                  

                   this.distance[element]=D[element];

                   position=element*this.row;     

                   this.distance[position]=D[element];

                   //修改路径---------------

                   if(exchange==true)

                   {                      

                       ((ArrayList)ways[element]).Clear();

                       foreach(intpointin(ArrayList)ways[min_num])

                           ((ArrayList)ways[element]).Add(point);

                   }

               }

               --Count;

          }

       }

       //----------------------------------------------------

       publicvoidDisplay()

       {        

           //------中心到各点的最短路径----------

           Console.WriteLine("中心到各点的最短路径如下:

\n\n");

           intsum_d_index=0;

           foreach(ArrayListmotherinways)

           {

               foreach(intchildinmother)

                   Console.Write("V{0}--",child+1);

               Console.WriteLine("   路径长{0}",distance[sum_d_index++]);

           }

       }

   }

   classMainEnterPoint

   {  

       staticvoidMain(string[]args)

       {

           intr;    //列数

           Console.Write("请输入点个数(含配送中心点):

");

           Int32.TryParse(Console.ReadLine(),outr);

           Console.WriteLine("各点分别为:

\n");

           for(inti=0;i

               Console.Write("V{0}",i);

           Console.Write(" 假定第一个点是配送中心");

           Console.WriteLine("\n\n输入各点之间的距离(无通径的用个大整数表示)\n");

           int[]a=newint[r*r];           

           intda;

           for(inti=0;i

           {

               for(intj=i+1;j

               {

                   Console.Write("V{0}到V{1}的距离是:

 ",i,j);

                   Int32.TryParse(Console.ReadLine(),outda);

                   a[i*r+j]=da;

                   Console.WriteLine();

               }

           }

           //----完善距离矩阵(距离矩阵其实可以是个上三角矩阵,

           //----但为了处理方便,还是将其完整成一个对称阵)-----------

           for(inti=0;i

           {

               for(intj=0;j

               {

                   if(i==j)

                   {

                       a[i*r+j]=0;

                   }

                   a[j*r+i]=a[i*r+j];

               }

           }     

           Marxm=newMarx(r,a);

           Console.WriteLine();

           m.Find_way();

           m.Display();

       }

   }

}

//该程序不但能够算出从中心到各点的最短路径距离,而且把路径也保存了下来.

车辆调度模型

 

一、           基于配送网络和调运优先准则的物流敏捷调动优先技术

1.支持物流敏捷调动优化的基础信息描述

(1)配送中心货物库存信息

    配送中心(或调运中心,Depot)的货物库存信息由以下三元数组A表示:

            A=(i,gi,qi)

    其中,i表示货物编码,i=1,2,3,…,简记为i∈I;gi表示货物i的规格(单位重量、体积等),并假定所有货物换算为同一规格;qi货物i的库存数量。

(2)配送点需求信息

     配送点在t时刻的实时需求信息由需求矩阵C(t)来表示

           C(t)=(cij(t))i∈I,j∈J

     其中,j表示配送点编码,j=1,2,3,…,简记为j∈J;cij(t)为t时刻配送点j对货物i的需求量,t即交货期。

(3)配送网络(可行运输路径)信息

     配送中心至配送点j的配送网络的信息由以下三元数组R(j)表示

          R(j)=(rj,V(rj),D(rj))

     其中,rj表示配送中心至配送点j的可行运输路径编码,rj=1,2,3,…,简记为rj∈Rj;

     V(rj)表示路径rj上全部配送点的集合,且V(rj)={j|若配送点j位于可行运输路径rj之上,j∈J};

     D(rj)表示路径rj上的配送点到配送中心的距离集,且D(rj)={d(v|rj)v∈V(rj)},

    其中,d(v|rj)表示在路径rj上配送点v到配送中心的距离,显然它不一定使配送点v到配送中心的最短距离。

至于任意配送点v到配送中心的最短距离则为

          D(v)=min{d(v|rv)rv∈Rv}

基于以上描述的方法,配送网络所包含的信息,因可行路径路径搜索深度和广度而异。

这里提出的基于配送网络网络和调运优先准则的物流敏捷调运技术的基本前提,就是假定配送中心至其服务区域内所有陪送点的可行陪送路径已经优化。

(4)配送中心运输资源(车辆)信息

   配送中心的运输车辆信息有以下三元数组E表示

       E=(p,up,wp)

   其中,p表示车辆编码,p=1,2,3,...,简记为p∈P;up表示车辆容量,并假定其已经换算为与gi同一量钢;wp表示车辆运行状态,wp∈{0,1},且wp=1表示车辆处于可调运状态;反之,则表示车辆处于正在运输状态。

2.物流敏捷调运优化技术的工作逻辑与思想

(1)调运优先准则

“调运优先准则”是在物流调运中根据交货期迟早、距离远近、运输量大小以及客户重要性程度等信息而对当前全部客户的物流调运优先次序进行的分类、排序。

根据调运优先准则设定陪送点的当前调运优先级,进一步可以构成物流调运的递阶控制机制。

调运优先准则以实现物流调运敏捷化为策略层面的首要准则,并按调运策略的层次顺序设置:

第一级调运优先准则:

交货需求早的配送地要优先安排;

第二级调运优先准则:

在交货期相同的配送地中,距配送中心远的优先安排;

第三级调运优先准则:

针对确定的配送地,配送车辆吨位大的优先安排;

第四级调运优先准则:

针对确定车辆,装载物品质量大的优先安排地方

 

从图可以看出,“最终配送地”是在最早交货期to有有交货需求且距离配送中心最远的配送点,而且是动态产生的。

而实现物流敏捷调动的核心在于第三个工作环节:

基于调运优化模型生成关于“最终配送地”的敏捷调运优化方案。

  注意到针对确定的“最终配送地”j*所对应的可行运输路径集构成一个以配送中心为起点,认j*为终点的子配送网络。

因此,整个逻辑整个配送网络的调运优化实际是转换成对一系列处于第一优先的子配送网络按第二优先准则的逐次调运优化。

  在调运方案生成后,对基本信息进行更新。

(3)针对确定“最终配送地”调运敏捷化步骤(即③):

  第一步 基于E生成当前可调用车辆集P*,P*={p︱wp=1,p∈P}。

  第二步 针对由配送中心到最终配送地j*的每一条路径r(r∈Rj*)

搜索该路径上在时间t0有交货需求的配送点,并按第二优先准则对其排序,记为j(h)(其中,j

(1)记为最终配送地j*)。

基于路径r上配送点到配送中心的距离集D(r)生成与j(h)相对应的距离集{d(j(h)︱r)},记为{d(h)},同时基于C(t)和当前库存量生成配送地j(h)的需求矩阵C(h)(t0)=[]。

第三步针对各路径r,在满足j(h)在交货的前提下,以“空载率”极小化为目标,建立调运优化模型,进行车辆配置优化和货物配载敏捷化。

第四步 在针对各路径r的调运优化模型求解后,将对应“空载率”最小的路径选出作为配送中心向“最终配送地”j*配送货物的“优选路径”,对应该路径的优化配送方案则为关于j*的敏捷调运方案,同时更新有关基础信息。

第五步转到工作逻辑下一个工作环节,直到符合终于原则。

3.针对确定路径调运优化模型的建立及近似求解方法。

 

(1)针对确定路径r的调运优化模型的建立。

   ①决策变量的确定

   设关于车辆的选择变量为∈{0,1},h∈(r),L∈ 其中,t=1表示第号车被派往第h号主配送地,反之不派。

 记为第号车派往第号主配送地时,第k种货物的装载量。

   ②调运优化模型

 由于调运优化的目标是“空载率”极小化,注意到路径r的空载率η(r)为

η(r)=1-()/()  ①

 

而第j号主配送地所需求货物总量( GGh)的计算公式为:

GG= ,           ②

这里,为路径r上在时间有交货需求的配送点集。

于是,在库存和装载限制下,满足货运需求的针对确定路径(r)的调运优化模型可由如下的非线性混合型规划问题③~⑧描述,记为NP

NP:

max()/() ③

St.=,              ④

                           ⑤

                          ⑥

                          ⑦

                       ⑧

其④为需求约束条件,⑤为库存约束条件,其中为货物k的当前库存量;⑥为资源约束条件;其中为车辆的剩余装载量。

(2)基于确定路径调运优化模型近似求解的基本过程:

我们对调运人格化模型NP近似求解的基本思想是按确定路径r上主配送地(即在t0有交货需求的配送点)从远到近的顺序(即第二级优先准则),通过数据驱动将NP逐次分解为针对配送点j(h)的调动优化模型NPn后,再对其递阶求解。

该求解过程如下:

基于确定路径调运优化模型的递阶求解过程:

过程1:

赋初值

令h=1,Flh-1=0,P0”=

 

过程2:

数据驱动过程

Step1:

基于需求矩阵[Cih*]和当前库存量qk*(k∈I),生成针对j(h)的满足库存限制的需求集和缺货信息并修正GGh

Step2:

基于P*和上一级优化后生成的“车辆优选集”(已调用的车辆)P”h-1,生成针对j(h)的“当前可调用车辆集”Ph*.

 

过程3:

模型生成过程:

 基NP和过程2的数据驱动生成针对确定主配送地j(h)的调动优化模型⑨~13,记为NPh.\

NPh:

max()/()      ⑨

St.   =GGh              ⑽

    ≤Ul*       ⑾

thl∈{0,1},l∈P*          ⑿

     xhlk≥0,l∈P*,k∈I       ⒀

 

过程4:

NPh求解过程

Step1:

基于NPh求得针对主配送地j(h)的“车辆优选集”Ph及相应的最佳装载量,并计算优先级最低的车辆的剩余装载量Flh.

Step2:

令h=h+1,若j(h)∈V*(r),则转过程2;反之,则结束对(NP)的递阶求解过程。

可以看出,经过“过程2”之Step1的数据处理所生成的NPh将自然删除关于库存约束的约束条件式⑤,再经过“过程2”之Step2的数据处理使得NPh的规模进一步有效缩小。

尽管如此,NPh仍然是一个非线性混合型规划,关于NPh求解过程(“过程4”之Step1)下面讨论。

4、针对确定主配送地的调运优化模型NPh的求解:

 

(1)为了更有效地实现空载率极小化的目标,根据NPh的模型的具体含义,其求解采用用基于模型驱动和数据驱动相结合的优化过程。

如下:

过程1:

数据驱动过程

Step1:

记NPh-1求解后俦级最低车辆(不妨记该车车号为P(h-1))的“剩余装载量”为Flh-1。

然后在Flh-1的限制下,基于需求矩阵[Cih*]并根据第四级级准则对该车进行配载,随即修正需求矩阵[Cih*],记修正后的需求矩阵为[Cih’]。

同时,计算针对主配送地j(h)的剩余装载需求量FFh

FFh=GGn-Flh-1

Step2:

对“可调用车辆集”Ph*按第三级优先准则排序,记排序后的“可调用车辆集”为Ph’,记Ph’中各车辆相应装载容量为Ul’(Ul’>Ul+1’,l∈Ph’)

 

过程2:

模型生成过程

基于过程1的数据驱动,将NPh转化成为“剩余装载量”极小化为目标,以Ph’和FFh为配载约束且仅以关于车辆选择变量thl为决策变量的0-1规划模型⒁~⒃。

(0-1)h:

min           ⒁

St.  ≥FFh                  ⒂

thl∈{0,1},l∈Pn’                ⒃

过程3:

求解过程

 Step1:

对(0-1)h求解,并基于“最优解”生成的“优选车辆集”Ph,计算优先级最低车辆的“剩余装载量”Flh

Step2:

基于需求矩阵[Cih’]和满载要求,先按第三级优先准则,再按第四能优先准则,以数据驱动方式对“优先车辆集”Ph中的车辆进行配载,生成xhlk的“最优解”。

 

(2)值得说明的n个问题:

 ①关于0-1规划的求解比较成熟,后面讨论

 ②对优先级最低车辆的剩余装载量的继续配载

5.基于对分搜索(0-1)h的求解过程:

(如图所示)

 

基于上述优化模型,NP问题已经转化为基于优先级循环调用折半查找(对分搜索)的过程

各类的实现已经编译成.dll,该程序中包括一个通用排序类,寻找最优上界的折半查找方法,和Dijkstra算法找配送中心到各配送点最短路径以形成配送路径网络的类.

是测试代码:

classMainEnterPoint

   {

       publicvoidDefault_Input()

       {

           intr;    //列数          

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1