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); }
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); }
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); }
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); }
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); }
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); } } } }
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); }
private void UpdateAllDomains(SkyscraperNode node, int newData) { UpdateDomainInRowsAndColumns(node, newData); }
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); } } }