放射形专用线取送车顺序 C# 算法
该程序为客户的一个毕业设计,客户采用Winform作为毕业设计程序语言,网上没有类似的C#算法,大多都是matlab;
因客户迫切急于答辩,文中算法代码采用了序列化和反序列化,没有对其进行过多的优化,在专用线较多的时候,计算时长略微延长
(经测试,在专用线在10条的情况下,计算时间大概在10秒左右,专用线在4条的情况下,计算速度为毫秒级别;因为计算过程中,数据量是成阶乘级别上升)
核心算法如下:
public partial class FrmBestTakeSendOrder : Form
{
/// <summary>
/// 计算资料表,
/// </summary>
List<TimeTableEntity> timeTableEntityList = new List<TimeTableEntity>()
{
//new TimeTableEntity(){Num = 1, TakeTime = 20,WorkTime = 60 },
};
/// <summary>
/// 计算
/// </summary>
public void Calculate()
{
// 最大时间
var numMax = timeTableEntityList.OrderByDescending(t => t.WorkTime).First().Num;
// 创建送车顺序集合
List<SequenceEntity> SequenceEntityList = timeTableEntityList.Select(t =>
{
return new SequenceEntity()
{
Number = t.Num,
};
}).ToList();
// 只保留最大排列
List<SequenceEntity[]> lst_Permutation = PermutationAndCombination<SequenceEntity>.GetPermutation(SequenceEntityList.ToArray(), SequenceEntityList.Count()).Where(t => t[0].Number == numMax).ToList();
// 通过排列获取方案集合
var planEntityList = lst_Permutation.Select((t, index) =>
{
return new PlanEntity()
{
Num = index,
SendCarSequence = t.ToList()
};
}).ToList();
//
foreach (var item in planEntityList)
{
item.SendCarSequence = GetSendCar(item.SendCarSequence);
item.TakeCarSequence = GetRecCar(item.SendCarSequence);
item.TakeCarLoadTimeMax = item.TakeCarSequence.Select(t => t.LackTime).Max();
}
// 方案升序输出
// GoodPlanOrder(planEntityList);
// 最优方案输出
GoodPlan(planEntityList);
}
/// <summary>
/// 最优方案输出
/// </summary>
/// <param name="planEntityList"></param>
private void GoodPlan(List<PlanEntity> planEntityList)
{
var goodTime = (from p in planEntityList
orderby p.TakeCarLoadTimeMax
group p by p.TakeCarLoadTimeMax into n
select n.Key).First();
var goodPlan = (from p in planEntityList
where p.TakeCarLoadTimeMax == goodTime
select p).ToList();
foreach (var item in goodPlan)
{
var sendCarNum = string.Join(",", item.SendCarSequence.Select(t => t.Number).ToArray());
var takeCarNum = string.Join(",", item.TakeCarSequence.Select(t => t.Number).ToArray());
// Console.Write($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum} T等:{item.TakeCarLoadTimeMax}分钟 \n\n");
var tLoadTime = item.TakeCarLoadTimeMax < 0 ? 0 : item.TakeCarLoadTimeMax;
richTextBox1.AppendText($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum} T等:{tLoadTime}分钟 \n\n");
}
}
/// <summary>
/// 方案升序输出
/// </summary>
/// <param name="planEntityList"></param>
/// <returns></returns>
private List<PlanEntity> GoodPlanOrder(List<PlanEntity> planEntityList)
{
var goodPlan = planEntityList.OrderBy(t => t.TakeCarLoadTimeMax).ToList();
foreach (var item in goodPlan)
{
var sendCarNum = string.Join(",", item.SendCarSequence.Select(t => t.Number).ToArray());
var takeCarNum = string.Join(",", item.TakeCarSequence.Select(t => t.Number).ToArray());
Console.Write($"送车顺序:{sendCarNum} 取车顺序:{takeCarNum} T等:{item.TakeCarLoadTimeMax}分钟 \n\n");
}
return goodPlan;
}
/// <summary>
/// 计算送车顺序的创造的时间与时间差值
/// </summary>
/// <param name="sendCarList"></param>
/// <returns></returns>
public List<SequenceEntity> GetSendCar(List<SequenceEntity> sendCarList)
{
var retSendCarList = sendCarList.Clone().ToList();
for (int i = 0; i < retSendCarList.Count(); i++)
{
var sendCar = retSendCarList[i];
for (int j = i; j < retSendCarList.Count(); j++)
{
sendCar.TotalTime += timeTableEntityList.Where(t => t.Num == retSendCarList[j].Number).First().TakeTime;
}
sendCar.LackTime = timeTableEntityList.Where(t => t.Num == sendCar.Number).First().WorkTime - sendCar.TotalTime;
}
return retSendCarList;
}
/// <summary>
/// 获取取车顺序集合
/// </summary>
/// <param name="sendCar">【送车循序】集合获取</param>
/// <returns></returns>
private List<SequenceEntity> GetRecCar(List<SequenceEntity> sendCar)
{
var retRecCarList = sendCar.OrderBy(t => t.LackTime).ToList();
for (int i = 0; i < retRecCarList.Count(); i++)
{
var retRecCar = retRecCarList[i];
if (i == 0)
{
int lackTimePoor = sendCar.Where(t => t.Number == retRecCar.Number).First().LackTime;
retRecCar.TotalTime = 0;
retRecCar.LackTime = lackTimePoor - 0;
}
else
{
int totalTimePoor = 0;
for (int j = i; j > 0; j--)
{
var carID = retRecCarList[j - 1].Number;
totalTimePoor += timeTableEntityList.Where(t => t.Num == carID).First().TakeTime;
}
int lackTimePoor = sendCar.Where(t => t.Number == retRecCar.Number).First().LackTime;
retRecCar.TotalTime = totalTimePoor;
retRecCar.LackTime = lackTimePoor - totalTimePoor;
}
}
return retRecCarList;
}
}
博主代接毕业设计等各种程序软件开发,论文代写,欢迎骚扰
QQ:1063823095
参考:
http://www.doc88.com/p-8681271008948.html
https://www.icourse163.org/learn/SWJTU-1206451818?tid=1452035457#/learn/content?type=detail&id=1220714539&cid=1230369305
https://blog.csdn.net/jtys2016/article/details/90147138