/// <summary> /// エッジごとの最遅開始時刻の演算 /// </summary> /// <param name="finishEdge"></param> /// <param name="data"></param> /// <param name="valMap"></param> /// <returns></returns> private double CalcLatestStartValue(UpdateCalcValuesInput.ActivityData startEdge, IEnumerable <UpdateCalcValuesInput.ActivityData> data, Dictionary <int, double> valMap, double totalValueOfPeriod) { // 接続エッジを検索 var edges = data.Where(x => x.SrcNodeId == startEdge.DstNodeId).ToArray(); // 接続エッジが存在しない=終点の場合再帰処理を終了 if (edges.Length == 0) { return(totalValueOfPeriod); } return(edges.Min(x => { var val = CalcLatestStartValue(x, data, valMap, totalValueOfPeriod) - x.PlanValue; valMap[x.Id] = val; return val; })); }
/// <summary> /// エッジごとの最早開始時刻の演算 /// </summary> /// <param name="finishEdge"></param> /// <param name="data"></param> /// <param name="valMap"></param> /// <returns></returns> private double CalcEarliestStartValue(UpdateCalcValuesInput.ActivityData finishEdge, IEnumerable <UpdateCalcValuesInput.ActivityData> data, Dictionary <int, double> valMap) { // 接続エッジを検索 var edges = data.Where(x => x.DstNodeId == finishEdge.SrcNodeId).ToArray(); // 接続エッジが存在しない=始点の場合再帰処理を終了 if (edges.Length == 0) { return(0.0); } return(edges.Max(x => { var val = CalcEarliestStartValue(x, data, valMap); valMap[x.Id] = val; return val + x.PlanValue; })); }