70 lines
2.2 KiB
C#
70 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using JNPF.Common.Extension;
|
|
using JNPF.Templates;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using NPOI.SS.Formula.Functions;
|
|
using Spire.Doc;
|
|
using Tnb.WarehouseMgr.Entities;
|
|
|
|
namespace Tnb.WarehouseMgr
|
|
{
|
|
/// <summary>
|
|
/// 动态规划类
|
|
/// </summary>
|
|
public class Dp
|
|
{
|
|
private HashSet<string> set = new HashSet<string>();
|
|
|
|
/// <summary>
|
|
/// 动态规划函数
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public void DpFunc(List<WmsRoad> roads, List<string> pointIds, Dictionary<string, bool> isVisited, string sPointId, string ePointId, dynamic ArrivedEpoint)
|
|
{
|
|
var sRoads = roads.FindAll(x => x.startpoint_id == sPointId).ToList();
|
|
var sRoads_EPointIds = sRoads.Select(x => x.endpoint_id).ToList();
|
|
|
|
if (!isVisited[sPointId])
|
|
{
|
|
pointIds.Add(sPointId);
|
|
set.Add(roads?.Find(x => x.startpoint_id == sPointId)?.startpoint_code!);
|
|
isVisited[sPointId] = true;
|
|
}
|
|
|
|
if (sRoads_EPointIds.Contains(ePointId)) //判断是否到达终点
|
|
{
|
|
ArrivedEpoint.isArrivedEpoint = true;
|
|
pointIds.Add(ePointId);
|
|
foreach (var kvp in isVisited)
|
|
{
|
|
isVisited[kvp.Key] = true;
|
|
}
|
|
return;
|
|
}
|
|
if (sRoads_EPointIds?.Count > 0)
|
|
{
|
|
var subRoads = roads?.FindAll(x => sRoads_EPointIds.Contains(x.startpoint_id) && !isVisited[x.endpoint_id]);
|
|
if (subRoads?.Count > 0)
|
|
{
|
|
for (int i = 0; i < subRoads.Count; i++)
|
|
{
|
|
var sIdx = subRoads[i].startpoint_id;
|
|
if (!isVisited[sIdx])
|
|
{
|
|
DpFunc(roads, pointIds, isVisited, sIdx, ePointId, ArrivedEpoint);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!ArrivedEpoint.isArrivedEpoint)
|
|
{
|
|
pointIds.Remove(sPointId);
|
|
}
|
|
}
|
|
}
|
|
}
|