Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -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;
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
//}
|
}
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user