Ejemplo n.º 1
0
        public SkyscraperArray(int arraySize)
        {
            this.arraySize = arraySize;
            nodes          = new SkyscraperNode[arraySize, arraySize];

            for (int i = 0; i < arraySize; i++)
            {
                for (int j = 0; j < arraySize; j++)
                {
                    nodes[j, i] = new SkyscraperNode(0, j, i);
                }
            }

            if (HEURISTIC_TYPE == HEURISTIC_TYPE_ENUM.GREEDY)
            {
                choosingVariableHeuristicsMethod = ChooseFirstNotSet;
            }

            else if (HEURISTIC_TYPE == HEURISTIC_TYPE_ENUM.MOST_LIMITED)
            {
                choosingVariableHeuristicsMethod = ChooseTheMostLimitedAndNotSet;
            }

            else if (HEURISTIC_TYPE == HEURISTIC_TYPE_ENUM.SMALL_DOMAIN)
            {
                choosingVariableHeuristicsMethod = ChooseTheSmallestDomainAndGreatestConstraints;
            }
        }
        public override CSPNode DeepClone()
        {
            SkyscraperNode skyscraperNode = new SkyscraperNode(data, xIndex, yIndex);

            skyscraperNode.domain = new List <int>();
            for (int i = 0; i < domain.Count; i++)
            {
                skyscraperNode.domain.Add(domain[i]);
            }
            return(skyscraperNode);
        }
Ejemplo n.º 3
0
        private bool AreAllRowConstraintsSatisfied(SkyscraperNode element, int data, IEnumerable <SkyscraperNode> row)
        {
            if (!CheckConstraint(element, data, SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_LEFT, row))
            {
                return(false);
            }
            if (!CheckConstraint(element, data, SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_RIGHT, row))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 4
0
        private bool AreAllColumnConstraintsSatisfied(SkyscraperNode element, int data, IEnumerable <SkyscraperNode> column)
        {
            if (!CheckConstraint(element, data, SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_UPSIDE, column))
            {
                return(false);
            }
            if (!CheckConstraint(element, data, SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_DOWNSIDE, column))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        private List <int> PossibilitiesNotFulfillingConstraintsRow(SkyscraperNode element, List <int> allPossibilities, IEnumerable <SkyscraperNode> row)
        {
            List <int> itemsToRemove = new List <int>();

            for (int i = 0; i < allPossibilities.Count; i++)
            {
                if (!AreAllRowConstraintsSatisfied(element, allPossibilities[i], row))
                {
                    itemsToRemove.Add(element.data);
                }
            }
            return(itemsToRemove);
        }
Ejemplo n.º 6
0
        private List <int> RepeatedPossibilitiesInColumnOrRowOfElement(SkyscraperNode node, List <int> allPosibilites)
        {
            List <int> itemsToRemove = new List <int>();

            for (int i = 0; i < arraySize; i++)
            {
                var columnElement = nodes[node.xIndex, i];
                if (allPosibilites.Contains(columnElement.data))
                {
                    itemsToRemove.Add(columnElement.data);
                }

                var rowElement = nodes[i, node.yIndex];
                if (allPosibilites.Contains(rowElement.data))
                {
                    itemsToRemove.Add(rowElement.data);
                }
            }

            return(itemsToRemove);
        }
Ejemplo n.º 7
0
        private void UpdateDomainInRowsAndColumns(SkyscraperNode node, int data)
        {
            for (int i = 0; i < arraySize; i++)
            {
                if (i != node.yIndex)
                {
                    var columnElement = nodes[node.xIndex, i];
                    if (columnElement.data == 0)
                    {
                        columnElement.domain.Remove(data);
                    }
                }

                if (i != node.xIndex)
                {
                    var rowElement = nodes[i, node.yIndex];
                    if (rowElement.data == 0)
                    {
                        rowElement.domain.Remove(data);
                    }
                }
            }
        }
Ejemplo n.º 8
0
        private int CalculateMeasure(SkyscraperNode node)
        {
            int rowMeasure        = nodes.OfType <SkyscraperNode>().Where(i => i.yIndex == node.yIndex && i.data != 0).Count();
            int columnMeasure     = nodes.OfType <SkyscraperNode>().Where(i => i.xIndex == node.xIndex && i.data != 0).Count();
            int constraintMeasure = 0;

            if (SkyscraperProblemSingleton.leftContraints[node.yIndex] != 0)
            {
                constraintMeasure++;
            }
            if (SkyscraperProblemSingleton.rightContraints[node.yIndex] != 0)
            {
                constraintMeasure++;
            }
            if (SkyscraperProblemSingleton.upperContraints[node.xIndex] != 0)
            {
                constraintMeasure++;
            }
            if (SkyscraperProblemSingleton.lowerContraints[node.xIndex] != 0)
            {
                constraintMeasure++;
            }
            return(rowMeasure + columnMeasure + constraintMeasure);
        }
Ejemplo n.º 9
0
 private void UpdateAllDomains(SkyscraperNode node, int newData)
 {
     UpdateDomainInRowsAndColumns(node, newData);
 }
Ejemplo n.º 10
0
        private bool CheckConstraint(SkyscraperNode element, int data, SkyscraperProblemSingleton.CONSTRAINT_ENUM constraintType, IEnumerable <SkyscraperNode> rowOrColumn)
        {
            if (constraintType == SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_LEFT)
            {
                int constraint = SkyscraperProblemSingleton.leftContraints[element.yIndex];

                if (constraint == 0)
                {
                    return(true);
                }
                else
                {
                    var rowOrColumnElement = rowOrColumn.ElementAt(element.xIndex);
                    rowOrColumnElement.data = data;
                    int howManyISee = HowManySkyscrapersIsee(rowOrColumn);
                    rowOrColumnElement.data = 0;
                    return(howManyISee == constraint);
                }
            }
            else if (constraintType == SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_RIGHT)
            {
                int constraint = SkyscraperProblemSingleton.rightContraints[element.yIndex];

                if (constraint == 0)
                {
                    return(true);
                }
                else
                {
                    var rowOrColumnElement = rowOrColumn.ElementAt(element.xIndex);
                    rowOrColumnElement.data = data;
                    var row         = rowOrColumn.OrderByDescending(i => i.xIndex);
                    int howManyISee = HowManySkyscrapersIsee(row);
                    rowOrColumnElement.data = 0;
                    return(howManyISee == constraint);
                }
            }
            else if (constraintType == SkyscraperProblemSingleton.CONSTRAINT_ENUM.LOOK_FROM_UPSIDE)
            {
                int constraint = SkyscraperProblemSingleton.upperContraints[element.xIndex];
                if (constraint == 0)
                {
                    return(true);
                }
                else
                {
                    var rowOrColumnElement = rowOrColumn.ElementAt(element.yIndex);
                    rowOrColumnElement.data = data;
                    int howManyISee = HowManySkyscrapersIsee(rowOrColumn);
                    rowOrColumnElement.data = 0;
                    return(howManyISee == constraint);
                }
            }
            else
            {
                int constraint = SkyscraperProblemSingleton.lowerContraints[element.xIndex];
                if (constraint == 0)
                {
                    return(true);
                }
                else
                {
                    var rowOrColumnElement = rowOrColumn.ElementAt(element.yIndex);
                    rowOrColumnElement.data = data;
                    var column      = rowOrColumn.OrderByDescending(i => i.yIndex);
                    int howManyISee = HowManySkyscrapersIsee(column);
                    rowOrColumnElement.data = 0;

                    return(howManyISee == constraint);
                }
            }
        }