Ejemplo n.º 1
0
        /// <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;
            }));
        }
Ejemplo n.º 2
0
        /// <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;
            }));
        }