Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2023-07-25 09:32:08 +08:00
3 changed files with 269 additions and 280 deletions

View File

@@ -1,17 +1,17 @@
//using System; using System;
//using System.Collections.Generic; using System.Collections.Generic;
//using System.Linq; using System.Linq;
//using System.Text; using System.Text;
//using System.Threading.Tasks; using System.Threading.Tasks;
//using JNPF.Common.Contracts; using JNPF.Common.Contracts;
//using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
//using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities;
//namespace Tnb.WarehouseMgr namespace Tnb.WarehouseMgr
//{ {
// /// <summary> /// <summary>
// /// 迪杰斯特拉(最短路径算法) /// 迪杰斯特拉(最短路径算法)
// /// </summary> /// </summary>
//public class Dijkstra<T> where T : BaseEntity<string>, IWmsRoadEntity, new() //public class Dijkstra<T> where T : BaseEntity<string>, IWmsRoadEntity, new()
//{ //{
// public static int MAX = int.MaxValue; // public static int MAX = int.MaxValue;
@@ -212,4 +212,4 @@
// this.weight = weight; // this.weight = weight;
// } // }
//} //}
//} }

View File

@@ -561,88 +561,77 @@ namespace Tnb.WarehouseMgr
private async Task<List<WmsPointH>> LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads) private async Task<List<WmsPointH>> LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads)
{ {
var points = await _db.Queryable<WmsPointH>().ToListAsync(); #region dp
List<WmsPointH> results = new(); //List<WmsPointH> results = new();
Dictionary<string, bool> isVisited = roads.Select(x => x.startpoint_id).Distinct().ToDictionary(x => x, x => false); //var points = await _db.Queryable<WmsPointH>().ToListAsync();
//Dictionary<string, bool> isVisited = roads.Select(x => x.startpoint_id).Distinct().ToDictionary(x => x, x => false);
List<string> pointIds = new(); //List<string> pointIds = new();
List<string> codes = new(); //List<string> codes = new();
Dp dp = new(); //Dp dp = new();
dynamic obj = new ExpandoObject(); //dynamic obj = new ExpandoObject();
obj.isArrivedEpoint = false; //obj.isArrivedEpoint = false;
dp.DpFunc(roads, pointIds, isVisited, pStartId, pEndId, obj); //dp.DpFunc(roads, pointIds, isVisited, pStartId, pEndId, obj);
foreach (var pid in pointIds) //foreach (var pid in pointIds)
//{
// var point = points.Find(x => x.id == pid);
// if (point != null)
// {
// results.Add(point);
// }
//}
//return results;
#endregion
#region dijkstra
var points = await _db.Queryable<WmsPointH>().ToListAsync();
var startObj = points.Find(x => x.id == pStartId);
var endObj = points.Find(x => x.id == pEndId);
var sIndex = points.IndexOf(startObj);
var eIndex = points.IndexOf(endObj);
if (eIndex < sIndex)
{ {
var point = points.Find(x => x.id == pid); var tempIndex = sIndex;
sIndex = eIndex;
eIndex = tempIndex;
var temp = points[sIndex];
points[sIndex] = points[eIndex];
points[eIndex] = temp;
}
var vexs = points.Select(p => p.id).ToArray();
EData[] edges = new EData[roads.Count];
for (int i = 0; i < edges.Length; i++)
{
var start = roads[i].startpoint_id;
var end = roads[i].endpoint_id;
var weight = roads[i].distance;
edges[i] = new EData(start, end, weight);
}
Dijkstra pG = new(vexs, edges);
int[] prev = new int[pG.mVexs.Length];
int[] dist = new int[pG.mVexs.Length];
List<WmsPointH> vertexs = new() { startObj };
pG.CalcDijkstra(sIndex, prev, dist);
var pointIds = points.Select(p => p.id).ToList();
Stack<string> result = new();
GetPoints(pointIds, prev, result, eIndex);
List<WmsPointH> results = new() { startObj };
if (points?.Count > 0)
{
foreach (var i in result)
{
WmsPointH? point = points?.Find(x => x.id == i);
if (point != null) if (point != null)
{ {
results.Add(point); results.Add(point);
} }
} }
}
return results; return results;
#region dijkstra
//var points = await _db.Queryable<WmsPointH>().ToListAsync();
//var startObj = points.Find(x => x.id == pStartId);
//var endObj = points.Find(x => x.id == pEndId);
//var sIndex = points.IndexOf(startObj);
//var eIndex = points.IndexOf(endObj);
//if (eIndex < sIndex)
//{
// var tempIndex = sIndex;
// sIndex = eIndex;
// eIndex = tempIndex;
// var temp = points[sIndex];
// points[sIndex] = points[eIndex];
// points[eIndex] = temp;
//}
////MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
//var vexs = points.Select(p => p.id).ToArray();
//EData[] edges = new EData[roads.Count];
//for (int i = 0; i < edges.Length; i++)
//{
// var start = roads[i].startpoint_id;
// var end = roads[i].endpoint_id;
// var weight = roads[i].distance;
// edges[i] = new EData(start, end, weight);
//}
//Dijkstra pG = new(vexs, edges);
//int[] prev = new int[pG.mVexs.Length];
//int[] dist = new int[pG.mVexs.Length];
//List<WmsPointH> vertexs = new() { startObj };
//pG.CalcDijkstra(sIndex, prev, dist);
//var pointIds = points.Select(p => p.id).ToList();
//List<string> result = new();
//GetPoints(pointIds, prev, result, eIndex);
//var items =new List<string>();
//foreach (var item in prev.Where(x=>x!=0))
//{
// if (points[item] != null)
// {
// items.Add(points[item].point_code);
// }
//}
//var @strings = string.Join(",", items.OrderBy(o=>o));
//var shortestPathPoints = points.FindAll(x => result.Contains(x.id));
//if (shortestPathPoints.IndexOf(startObj) < 0)
//{
// shortestPathPoints.Add(startObj);
//}
//List<WmsPointH> results = new() { startObj };
//var isVisited = shortestPathPoints.ToDictionary(x => x.id, x => false);
//var isVisited2 = shortestPathPoints.ToDictionary(x => x.id, x => false);
//isVisited[pStartId] = true;
//MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
//results.Add(endObj);
#endregion #endregion
} }
@@ -677,12 +666,12 @@ namespace Tnb.WarehouseMgr
/// <param name="prev"></param> /// <param name="prev"></param>
/// <param name="result"></param> /// <param name="result"></param>
/// <param name="eIdx"></param> /// <param name="eIdx"></param>
private static void GetPoints(List<string> pointIds, int[] prev, List<string> result, int eIdx) private static void GetPoints(List<string> pointIds, int[] prev, Stack<string> result, int eIdx)
{ {
var index = eIdx; var index = eIdx;
while (index != 0) while (index != 0)
{ {
result.Add(pointIds[index]); result.Push(pointIds[index]);
index = prev[index]; index = prev[index];
} }
} }

View File

@@ -62,15 +62,15 @@ namespace Tnb.Common.Utils
mVexs[p1].firstEdge = node1; mVexs[p1].firstEdge = node1;
else else
LinkLast(mVexs[p1].firstEdge, node1); LinkLast(mVexs[p1].firstEdge, node1);
// 初始化node2 //// 初始化node2
ENode node2 = new ENode(); //ENode node2 = new ENode();
node2.ivex = p1; //node2.ivex = p1;
node2.weight = weight; //node2.weight = weight;
// 将node2链接到"p2所在链表的末尾" //// 将node2链接到"p2所在链表的末尾"
if (mVexs[p2].firstEdge == null) //if (mVexs[p2].firstEdge == null)
mVexs[p2].firstEdge = node2; // mVexs[p2].firstEdge = node2;
else //else
LinkLast(mVexs[p2].firstEdge, node2); // LinkLast(mVexs[p2].firstEdge, node2);
} }
} }