Beispiel #1
0
        /// <summary>
        /// Determina se o objecto proporcionado é igual à instância corrente.
        /// </summary>
        /// <param name="obj">O objecto.</param>
        /// <returns>
        /// Verdadeiro caso o objecto seja igual e falso caso contrário.
        /// </returns>
        public override bool Equals(object obj)
        {
            TransportationMaxDoubleNumberField objToCompare = obj as TransportationMaxDoubleNumberField;

            if (objToCompare == null)
            {
                return(base.Equals(obj));
            }
            else
            {
                return(this.MaximumComponent == objToCompare.MaximumComponent &&
                       this.FiniteComponent == objToCompare.FiniteComponent);
            }
        }
        /// <summary>
        /// Aplica a incialização de Russels.
        /// </summary>
        private void ApplyRussels()
        {
            TransportationMaxDoubleNumberField[] largestRowsCosts    = new TransportationMaxDoubleNumberField[supplyNumber];
            TransportationMaxDoubleNumberField[] largestColumnsCosts = new TransportationMaxDoubleNumberField[demandNumber];
            bool[] isRowEliminated    = new bool[this.supplyNumber];
            bool[] isColumnEliminated = new bool[this.demandNumber];
            TransportationMaxDoubleNumberField temporary;

            for (int i = 0; i < this.supplyNumber; ++i)
            {
                largestRowsCosts[i] = new TransportationMaxDoubleNumberField(this.transportationCost[i, 0]);
            }

            for (int i = 0; i < this.demandNumber; ++i)
            {
                largestColumnsCosts[i] = new TransportationMaxDoubleNumberField(this.transportationCost[0, i]);
            }

            for (int i = 0; i < this.supplyNumber; ++i)
            {
                for (int j = 0; j < this.demandNumber; ++j)
                {
                    if (largestRowsCosts[i] < this.transportationCost[i, j])
                    {
                        largestRowsCosts[i] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                    }

                    if (largestColumnsCosts[j] < this.transportationCost[i, j])
                    {
                        largestColumnsCosts[j] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                    }
                }
            }

            int chosenLine   = -1;
            int chosenColumn = -1;
            TransportationMaxDoubleNumberField minimumDelta = new TransportationMaxDoubleNumberField(this.transportationCost[0, 0]);

            for (int i = 0; i < this.supplyNumber; ++i)
            {
                for (int j = 0; j < this.demandNumber; ++j)
                {
                    temporary = this.transportationCost[i, j] - largestColumnsCosts[j] - largestRowsCosts[i];
                    if (temporary < minimumDelta)
                    {
                        minimumDelta = temporary;
                        chosenLine   = i;
                        chosenColumn = j;
                    }
                }
            }

            int  numberOfRemainingRows    = this.supplyNumber;
            int  numberOfRemainingColumns = this.demandNumber;
            bool state = true;

            while (state)
            {
                bool rowHasBeenEliminated = true;
                if (this.supply[chosenLine] <= this.demand[chosenColumn])
                {
                    this.resultMatrix[chosenLine, chosenColumn] = this.supply[chosenLine];
                    this.demand[chosenColumn]  -= this.supply[chosenLine];
                    this.supply[chosenLine]     = 0;
                    isRowEliminated[chosenLine] = true;
                    --numberOfRemainingRows;
                }
                else
                {
                    this.resultMatrix[chosenLine, chosenColumn] = this.demand[chosenColumn];
                    this.supply[chosenLine]         -= this.demand[chosenColumn];
                    isColumnEliminated[chosenColumn] = true;
                    --numberOfRemainingColumns;
                    rowHasBeenEliminated = false;
                }

                if (numberOfRemainingRows == 0)
                {
                    state = false;
                }
                else if (numberOfRemainingColumns == 0)
                {
                    state = false;
                }
                else if (rowHasBeenEliminated)
                {
                    int i = 0;
                    int j = 0;
                    while (isRowEliminated[i])
                    {
                        ++i;
                    }
                    while (isColumnEliminated[j])
                    {
                        ++j;
                    }
                    for (; j < this.demandNumber; ++j)
                    {
                        if (!isColumnEliminated[j])
                        {
                            largestColumnsCosts[j] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                        }
                    }
                }
                else
                {
                    int i = 0;
                    int j = 0;
                    while (isRowEliminated[i])
                    {
                        ++i;
                    }
                    while (isColumnEliminated[j])
                    {
                        ++j;
                    }
                    for (; i < this.supplyNumber; ++i)
                    {
                        if (!isRowEliminated[i])
                        {
                            largestRowsCosts[i] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                        }
                    }
                }

                for (int i = 0; i < this.supplyNumber; ++i)
                {
                    if (!isRowEliminated[i])
                    {
                        for (int j = 0; j < this.demandNumber; ++j)
                        {
                            if (!isColumnEliminated[j])
                            {
                                if (largestRowsCosts[i] < this.transportationCost[i, j])
                                {
                                    largestRowsCosts[i] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                                }

                                if (largestColumnsCosts[j] < this.transportationCost[i, j])
                                {
                                    largestColumnsCosts[j] = new TransportationMaxDoubleNumberField(this.transportationCost[i, j]);
                                }
                            }
                        }
                    }
                }

                chosenLine   = -1;
                chosenColumn = -1;
                minimumDelta = new TransportationMaxDoubleNumberField(double.MaxValue);
                for (int i = 0; i < this.supplyNumber; ++i)
                {
                    if (!isRowEliminated[i])
                    {
                        for (int j = 0; j < this.demandNumber; ++j)
                        {
                            if (!isColumnEliminated[j])
                            {
                                temporary = this.transportationCost[i, j] - largestColumnsCosts[j] - largestRowsCosts[i];
                                if (temporary < minimumDelta)
                                {
                                    minimumDelta = temporary;
                                    chosenLine   = i;
                                    chosenColumn = j;
                                }
                            }
                        }
                    }
                }
            }  //While
        }