Ejemplo n.º 1
0
        /// <summary>
        /// Исключение ребра
        /// </summary>
        /// <param name="coord">Координаты ребра</param>
        /// <returns>Новая матрица, с исключенным ребром [coord.Col, coord.Row]</returns>
        public RouteMatrix ExcludeEdge(MatrixCoord coord)
        {
            var result = new RouteMatrix(this, coord);

            result.Reduction();

            return(result);
        }
Ejemplo n.º 2
0
            public bool TryGetCoord(Line colLine, Line rowLine, out MatrixCoord coord)
            {
                try
                {
                    coord = GetCoord(colLine, rowLine);
                }
                catch
                {
                    coord = default(MatrixCoord);
                    return(false);
                }

                return(true);
            }
Ejemplo n.º 3
0
        public RouteMatrix(RouteMatrix matrix, MatrixCoord excluded)
        {
            BaseMinTimespan = matrix.MinTimespan;
            _passedRoutes.AddRange(matrix.PassedRoutes);
            State   = RouteMatrixState.Process;
            Headers = matrix.Headers;
            Items   = new MatrixValue[Headers.ColumnsCount + 1, Headers.RowsCount + 1];
            for (int col = 0; col < ColumnsCount; ++col)
            {
                for (int row = 0; row < RowsCount; ++row)
                {
                    Items[col, row] = matrix.Items[col, row];
                }
            }

            Items[excluded.Col, excluded.Row].SetInfinity();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Создать копию матрицы, удалив из неё столбец и строку
        /// </summary>
        /// <param name="coord">Удаляемые строка и столбец</param>
        /// <returns>Копия матрицы</returns>
        public RouteMatrix CopyWithoutColAndRow(MatrixCoord coord)
        {
            // Настройка заголовков строк и столбцов создаваемой матрицы
            MatrixHeaders    newHeaders = null;
            RouteMatrixState newState   = RouteMatrixState.Process;
            List <IRoute>    routes     = null;

            var addedRoute = GetRoute(coord);

            if (CanAddPassedRoute(PassedRoutes, addedRoute))    // Контроль за образованием цикла
            {
                routes = new List <IRoute>(PassedRoutes)
                {
                    addedRoute
                };
                newHeaders = Headers.CopyWithoutColRow(coord.Col, coord.Row);

                if (newHeaders.ColumnsCount == 1 &&
                    newHeaders.RowsCount == 1)
                {
                    var newLinesCount = newHeaders.GetLines().Count();
                    if (newLinesCount == 2)
                    {
                        var fromLine = newHeaders.GetLineByRow(0);
                        var toLine   = newHeaders.GetLineByCol(0);
                        var curCoord = Headers.GetCoord(toLine, fromLine);
                        // Оставшийся последним маршрут достижим
                        if (!Items[curCoord.Col, curCoord.Row].IsInfinity)
                        {
                            var lastRoute = GetRoute(curCoord);
                            routes.Add(lastRoute);

                            newState = RouteMatrixState.IsComplete;
                        }
                        else
                        {
                            newState = RouteMatrixState.Unreachable;
                        }
                    }
                    else
                    {
                        newState = RouteMatrixState.Unreachable;
                    }
                    newHeaders = null;
                }
            }
            else
            {
                newState = RouteMatrixState.Unreachable;
            }


            RouteMatrix result = new RouteMatrix(newHeaders, routes, MinTimespan, newState);

            if (result.State == RouteMatrixState.Process)
            {
                for (int col = 0; col < ColumnsCount; ++col)
                {
                    if (col != coord.Col)
                    {
                        var newCol = result.Headers.GetColByLine(Headers.GetLineByCol(col));

                        for (int row = 0; row < RowsCount; ++row)
                        {
                            if (row != coord.Row)
                            {
                                var newRow = result.Headers.GetRowByLine(Headers.GetLineByRow(row));
                                result.Items[newCol, newRow] = Items[col, row];
                            }
                        }
                    }
                }
                // Устанавливаем элемент [row, col] в бесконечность
                var fromLine = Headers.GetLineByRow(coord.Row);
                var toLine   = Headers.GetLineByCol(coord.Col);
                var infCol   = result.Headers.GetColByLine(fromLine);
                var infRow   = result.Headers.GetRowByLine(toLine);
                if (infCol >= 0 && infRow >= 0)
                {
                    result.Items[infCol, infRow].SetInfinity();
                }

                result.FillMinValuesByRows();
                result.FillMinValuesByCols();
                result.CalcCurrentMinTimespan();
            }

            return(result);
        }
Ejemplo n.º 5
0
 private IRoute GetRoute(MatrixCoord coord)
 {
     return(GetRoute(coord.Col, coord.Row));
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Включение ребра
        /// </summary>
        /// <param name="coord">Координаты ребра</param>
        /// <returns>Новая матрица, с включенным ребром [coord.Col, coord.Row]</returns>
        public RouteMatrix IncludeEdge(MatrixCoord coord)
        {
            var result = CopyWithoutColAndRow(coord);

            return(result);
        }