1、Dijkstra算法求最短路径C#版Dijkstra算法求最短路径(C#版) 行如下图的路径,(V0是中心):经过该算法后转化为下图using System;using System.Collections;using System.Text;namespace Greedy class Marx private int distance; private int row; private ArrayList ways = new ArrayList(); public Marx(int n,params int d) this.row = n; distance = new introw *
2、 row; for (int i = 0; i row * row; i+) this.distancei = di; for (int i = 0; i this.row; i+) /有row个点,则从中心到各点的路有row-1条 ArrayList w = new ArrayList(); int j = 0; w.Add(j); ways.Add(w); /- public void Find_way() ArrayList S = new ArrayList(1); ArrayList Sr = new ArrayList(1); int Indexof_distance=new in
3、tthis.row; for(int i=0; i row; i+) Indexof_distancei=i; S.Add( Indexof_distance0 ); for (int i = 0; i 0) /假定中心点的编号是0的贪吃法求路径 for (int i = 0; i row; i+) Di = this.distancei; int min_num = (int)Sr0; /距中心点的最小距离点编号 foreach (int s in Sr) if (Ds Dmin_num) min_num = s; /以上可以排序优化 S.Add(min_num); Sr.Remove(mi
4、n_num); /-把最新包含进来的点也加到路径中- (ArrayList)waysmin_num).Add(min_num); /- foreach (int element in Sr) int position = element * (this.row) + min_num; bool exchange = false; /有交换标志 if (Delement Dmin_num + this.distanceposition) Delement = Delement; else Delement = this.distanceposition + Dmin_num; exchange
5、= true; /修改距离矩阵 this.distanceelement = Delement; position = element * this.row; this.distanceposition = Delement; /修改路径- if (exchange = true) (ArrayList)wayselement).Clear(); foreach (int point in (ArrayList)waysmin_num) (ArrayList)wayselement).Add(point); -Count; /- public void Display() /-中心到各点的最短
6、路径- Console.WriteLine(中心到各点的最短路径如下: nn); int sum_d_index = 0; foreach(ArrayList mother in ways) foreach (int child in mother) Console.Write(V0 - , child+1); Console.WriteLine( 路径长 0,distancesum_d_index+); class MainEnterPoint static void Main(string args) int r; /列数 Console.Write(请输入点个数(含配送中心点): );
7、Int32.TryParse(Console.ReadLine(), out r); Console.WriteLine(各点分别为: n); for (int i = 0; i r; i+) Console.Write(V0 , i); Console.Write( 假定第一个点是配送中心); Console.WriteLine(nn输入各点之间的距离(无通径的用个大整数表示)n); int a = new intr * r; int da; for (int i = 0; i r; i+) for (int j = i + 1; j r; j+) Console.Write(V0 到 V1
8、的距离是: ,i,j); Int32.TryParse(Console.ReadLine(), out da); ai * r + j = da; Console.WriteLine(); /-完善距离矩阵(距离矩阵其实可以是个上三角矩阵, /-但为了处理方便,还是将其完整成一个对称阵)- for (int i = 0; i r; i+) for (int j = 0; j Ul+1,lPh)过程2:模型生成过程基于过程1的数据驱动,将NPh 转化成为“剩余装载量”极小化为目标,以Ph和FFh为配载约束且仅以关于车辆选择变量thl 为决策变量的0-1规划模型。(0-1)h :min St. F
9、Fh thl0,1,lPn 过程3:求解过程Step1:对(0-1)h求解,并基于“最优解”生成的“优选车辆集”Ph,计算优先级最低车辆的“剩余装载量”FlhStep2:基于需求矩阵Cih和满载要求,先按第三级优先准则,再按第四能优先准则,以数据驱动方式对“优先车辆集”Ph 中的车辆进行配载,生成xhlk 的“最优解”。(2)值得说明的n个问题:关于0-1规划的求解比较成熟,后面讨论对优先级最低车辆的剩余装载量的继续配载5基于对分搜索(0-1)h的求解过程:(如图所示)基于上述优化模型,NP问题已经转化为基于优先级循环调用折半查找(对分搜索)的过程,各类的实现已经编译成 .dll, 该程序中包括一个通用排序类,寻找最优上界的折半查找方法,和Dijkstra算法找配送中心到各配送点最短路径以形成配送路径网络的类.是测试代码:class MainEnterPoint public void Default_Input() int r; /列数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1