sync projects
This commit is contained in:
parent
e769ff9ec2
commit
7f1d03beec
@ -41,7 +41,10 @@ namespace TrainInfomationProviderService
|
|||||||
var searchProvider = new TrainInfoSearchProvider();
|
var searchProvider = new TrainInfoSearchProvider();
|
||||||
var lines = searchProvider.FindDirectTrains(DateTime.Parse("2014-12-10"), "NVH", "JJG").ToArray();
|
var lines = searchProvider.FindDirectTrains(DateTime.Parse("2014-12-10"), "NVH", "JJG").ToArray();
|
||||||
var maxTimeRage = lines.Max(s => s.CalculatedMinutesBase);
|
var maxTimeRage = lines.Max(s => s.CalculatedMinutesBase);
|
||||||
var altLines = searchProvider.FindOnceTransitTrains(DateTime.Parse("2014-12-12"), "CCT", "ZHQ", new TrainTransitSearchOptions() { MaxExtraMinutes = int.MaxValue }).ToArray();
|
|
||||||
|
var opt = new TrainTransitSearchOptions();
|
||||||
|
opt.InitLimit(780);
|
||||||
|
var altLines = searchProvider.FindOnceTransitTrains(DateTime.Parse("2014-12-12"), "NVH", "JJG", opt).ToArray();
|
||||||
|
|
||||||
var availableLines = lines.Select(s => s.Train.Code + "," + s.FromStation.Name + "," + s.ToStation.Name + "," + s.ElapsedTime).ToArray();
|
var availableLines = lines.Select(s => s.Train.Code + "," + s.FromStation.Name + "," + s.ToStation.Name + "," + s.ElapsedTime).ToArray();
|
||||||
Array.ForEach(altLines.Select(s =>
|
Array.ForEach(altLines.Select(s =>
|
||||||
|
@ -123,5 +123,18 @@ namespace TrainInfomationProviderService.TrainInfo.Entities
|
|||||||
return _trainClass ?? '*';
|
return _trainClass ?? '*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否是高速列车
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public bool IsHighSpeedClass
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var c = TrainClass;
|
||||||
|
return c == 'G' || c == 'D' || c == 'C';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ namespace TrainInfomationProviderService.TrainInfo.Entities
|
|||||||
{
|
{
|
||||||
case 'C':
|
case 'C':
|
||||||
case 'G':
|
case 'G':
|
||||||
return 30+extraTime;
|
return 30 + extraTime;
|
||||||
case 'D':
|
case 'D':
|
||||||
return 30 + extraTime;
|
return 30 + extraTime;
|
||||||
case 'Z':
|
case 'Z':
|
||||||
@ -320,6 +320,16 @@ namespace TrainInfomationProviderService.TrainInfo.Entities
|
|||||||
_list.Remove(line);
|
_list.Remove(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//如果线路数超过五条,则砍掉时间太多的
|
||||||
|
if (Options.StartCutLongRunningCount <= _list.Count)
|
||||||
|
{
|
||||||
|
//基础时间
|
||||||
|
var times = _list.Select(s => s.FirstElapsedTime.Add(s.SecondElapsedTime)).OrderBy(s => s).Skip((int)(_list.Count * Options.CutLongRunningSampleRate)).Max();
|
||||||
|
var maxTime = (long)(times.Ticks * Options.CutLongRunningRate);
|
||||||
|
|
||||||
|
Array.ForEach(_list.Where(s => (s.SecondElapsedTime + s.FirstElapsedTime).Ticks > maxTime).ToArray(), _ => _list.Remove(_));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -328,7 +338,70 @@ namespace TrainInfomationProviderService.TrainInfo.Entities
|
|||||||
|
|
||||||
void ProcessPriority()
|
void ProcessPriority()
|
||||||
{
|
{
|
||||||
|
//对换乘站点计算优先级
|
||||||
|
var stData = _list.GroupBy(s => s.First.ToStation).Select(s => new KeyValuePair<StationDetailInfo, TrainTransitOnceResult[]>(s.Key, s.ToArray())).ToList();
|
||||||
|
|
||||||
|
stData.Sort((x, y) =>
|
||||||
|
{
|
||||||
|
//前车高铁/动车等,优先推荐
|
||||||
|
var fhc1 = x.Value.Count(_ => _.First.Train.IsHighSpeedClass);
|
||||||
|
var shc1 = y.Value.Count(_ => _.First.Train.IsHighSpeedClass);
|
||||||
|
if (shc1 != fhc1)
|
||||||
|
return shc1 < fhc1 ? 1 : -1;
|
||||||
|
|
||||||
|
//否则推荐后车的高铁/动车
|
||||||
|
var fhc2 = x.Value.Count(_ => _.Second.Train.IsHighSpeedClass);
|
||||||
|
var shc2 = y.Value.Count(_ => _.Second.Train.IsHighSpeedClass);
|
||||||
|
if (shc2 != fhc2)
|
||||||
|
return shc1 < fhc1 ? 1 : -1;
|
||||||
|
|
||||||
|
//如果都米有,则按线路数推荐
|
||||||
|
if (x.Value.Length != y.Value.Length)
|
||||||
|
return y.Value.Length - x.Value.Length;
|
||||||
|
|
||||||
|
//线路数也相同。。。。那好像没啥再区别的了
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
//对应起排序
|
||||||
|
var stationWeight = new Dictionary<StationDetailInfo, int>(stData.Count);
|
||||||
|
for (var i = 0; i < stData.Count; i++)
|
||||||
|
{
|
||||||
|
stationWeight.Add(stData[i].Key, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
//分组排序
|
||||||
|
_list.Sort((x, y) =>
|
||||||
|
{
|
||||||
|
//不推荐,按不推荐来排序
|
||||||
|
if (x.NotRecommand ^ y.NotRecommand)
|
||||||
|
return x.NotRecommand ? 1 : -1;
|
||||||
|
|
||||||
|
//车站不同,按车站来排序
|
||||||
|
if (x.First.To != y.First.To)
|
||||||
|
{
|
||||||
|
return stationWeight[x.First.ToStation] - stationWeight[y.First.ToStation];
|
||||||
|
}
|
||||||
|
//按前车是否是高速车排序
|
||||||
|
if (x.First.Train.IsHighSpeedClass ^ y.First.Train.IsHighSpeedClass)
|
||||||
|
return x.First.Train.IsHighSpeedClass ? -1 : 1;
|
||||||
|
//按后车是否是高速车排序
|
||||||
|
if (x.Second.Train.IsHighSpeedClass ^ y.Second.Train.IsHighSpeedClass)
|
||||||
|
return x.Second.Train.IsHighSpeedClass ? -1 : 1;
|
||||||
|
|
||||||
|
//如果到的时间是不推荐的时间
|
||||||
|
var xIsTimeNotRecommand = x.FirstTrainArriveDate.Hour < 6 || x.FirstTrainArriveDate.Hour >= 23;
|
||||||
|
var yIsTimeNotRecommand = y.FirstTrainArriveDate.Hour < 6 || y.FirstTrainArriveDate.Hour >= 23;
|
||||||
|
if (xIsTimeNotRecommand ^ yIsTimeNotRecommand)
|
||||||
|
return xIsTimeNotRecommand ? 1 : -1;
|
||||||
|
|
||||||
|
//按总耗时排序
|
||||||
|
var ttl1 = x.First.ElapsedTime + x.SecondElapsedTime;
|
||||||
|
var ttl2 = y.First.ElapsedTime + y.SecondElapsedTime;
|
||||||
|
|
||||||
|
if (ttl1 != ttl2)
|
||||||
|
return ttl1 < ttl2 ? -1 : 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -13,17 +13,60 @@ namespace TrainInfomationProviderService.TrainInfo.Entities
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int MaxExtraMinutes { get; set; }
|
public int MaxExtraMinutes { get; set; }
|
||||||
|
|
||||||
|
public void InitLimit(int baseMinutes)
|
||||||
|
{
|
||||||
|
if (baseMinutes < 120)
|
||||||
|
{
|
||||||
|
//2小时内的车最大允许到6小时
|
||||||
|
MaxExtraMinutes = baseMinutes*3;
|
||||||
|
}
|
||||||
|
else if (baseMinutes < 180)
|
||||||
|
{
|
||||||
|
MaxExtraMinutes = (int)(baseMinutes * 2.5);
|
||||||
|
}
|
||||||
|
else if (baseMinutes < 300)
|
||||||
|
{
|
||||||
|
MaxExtraMinutes = (int)(baseMinutes * 2);
|
||||||
|
}
|
||||||
|
else if (baseMinutes < 900)
|
||||||
|
{
|
||||||
|
MaxExtraMinutes = (int)(baseMinutes * 1.5);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MaxExtraMinutes = (int)(baseMinutes * 1.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 同一个车次最高保持的换乘站数
|
/// 同一个车次最高保持的换乘站数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int SameLineMaxKeepStations { get; set; }
|
public int SameLineMaxKeepStations { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当换乘线路数超过此数目时,砍掉超过时间的
|
||||||
|
/// </summary>
|
||||||
|
public int StartCutLongRunningCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 砍掉超过时间比例
|
||||||
|
/// </summary>
|
||||||
|
public double CutLongRunningRate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 砍掉时间超过比例时,采样的最高保证比例
|
||||||
|
/// </summary>
|
||||||
|
public double CutLongRunningSampleRate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建 <see cref="TrainTransitSearchOptions" /> 的新实例(TrainTransitSearchOptions)
|
/// 创建 <see cref="TrainTransitSearchOptions" /> 的新实例(TrainTransitSearchOptions)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TrainTransitSearchOptions()
|
public TrainTransitSearchOptions()
|
||||||
{
|
{
|
||||||
SameLineMaxKeepStations = 3;
|
SameLineMaxKeepStations = 3;
|
||||||
|
CutLongRunningRate = 1.5;
|
||||||
|
StartCutLongRunningCount = 5;
|
||||||
|
CutLongRunningSampleRate = 0.7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user