Wms路径算法代码提交,根据dijkstra
This commit is contained in:
@@ -7,10 +7,16 @@ using Aspose.Cells.Drawing;
|
||||
using JNPF.Common.Extension;
|
||||
using JNPF.DependencyInjection;
|
||||
using JNPF.DynamicApiController;
|
||||
using JNPF.Extras.CollectiveOAuth.Config;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NPOI.OpenXmlFormats.Wordprocessing;
|
||||
using Polly.Timeout;
|
||||
using Spire.Pdf.Widget;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData.Entities;
|
||||
using Tnb.BasicData.Entities.Enums;
|
||||
using Tnb.Common.Utils;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
|
||||
@@ -54,7 +60,7 @@ namespace Tnb.WarehouseMgr
|
||||
carry_id = a.id,
|
||||
carry_name = a.carry_name,
|
||||
location_id = b.id,
|
||||
|
||||
|
||||
location_name = b.location_name,
|
||||
warehouse_id = c.id,
|
||||
warehouse_name = c.whname,
|
||||
@@ -159,5 +165,90 @@ namespace Tnb.WarehouseMgr
|
||||
.ToListAsync();
|
||||
return items;
|
||||
}
|
||||
/// <summary>
|
||||
/// 路径算法
|
||||
/// </summary>
|
||||
/// <param name="pStartId"></param>
|
||||
/// <param name="pEndId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task PathAlgorithms(string pStartId, string pEndId)
|
||||
{
|
||||
var roads = await _db.Queryable<WmsRoad>().ToListAsync();
|
||||
await LocPathCalcAlgorithms(pStartId, pEndId, roads);
|
||||
}
|
||||
private async Task LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads)
|
||||
{
|
||||
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);
|
||||
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<WmsPointH> 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 shortestPathPoints = points.FindAll(x => result.Contains(x.id));
|
||||
shortestPathPoints.Add(points.Find(x => x.id == pStartId));
|
||||
List<WmsPointH> results = new() { startObj };
|
||||
var isVisited = shortestPathPoints.ToDictionary(x => x.id, x => false);
|
||||
isVisited[pStartId] = true;
|
||||
MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
|
||||
results.Add(endObj);
|
||||
string str = null;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取匹配的最短路径节点
|
||||
/// </summary>
|
||||
/// <param name="results"></param>
|
||||
/// <param name="roads"></param>
|
||||
/// <param name="shortestPathPoints"></param>
|
||||
/// <param name="isVisited"></param>
|
||||
/// <param name="pStartId"></param>
|
||||
/// <param name="pEndId"></param>
|
||||
private void MatchPoint(List<WmsPointH> results, List<WmsRoad> roads, List<WmsPointH> shortestPathPoints, Dictionary<string, bool> isVisited, string pStartId, string pEndId)
|
||||
{
|
||||
var sRoads = roads.Where(x => x.startpoint_id == pStartId).ToList();
|
||||
for (int j = 0; j < sRoads.Count; j++)
|
||||
{
|
||||
var sPoint = shortestPathPoints.Find(x => x.id == sRoads[j].endpoint_id);
|
||||
if (sPoint != null && isVisited.ContainsKey(sPoint.id) && !isVisited[sPoint.id] && sPoint.id != pEndId)
|
||||
{
|
||||
var code = sPoint.point_code;
|
||||
results.Add(sPoint);
|
||||
isVisited[sPoint.id] = true;
|
||||
MatchPoint(results, roads, shortestPathPoints, isVisited, sPoint.id, pEndId);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据终止节点获取最短路径顶点
|
||||
/// </summary>
|
||||
/// <param name="pointIds"></param>
|
||||
/// <param name="prev"></param>
|
||||
/// <param name="result"></param>
|
||||
/// <param name="eIdx"></param>
|
||||
private static void GetPoints(List<string> pointIds, int[] prev, List<string> result, int eIdx)
|
||||
{
|
||||
var index = eIdx;
|
||||
while (index != 0)
|
||||
{
|
||||
result.Add(pointIds[index]);
|
||||
index = prev[index];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user