Welcher Algorithmus eignet sich am besten, um 15 Rätsel zu lösen? [geschlossen]

Ich arbeite daran, die Lösungsschritte für ein zufällig generiertes "15-Puzzle" zu finden. Sagen Sie mir also, welcher Algorithmus am besten geeignet ist, um ihn schnell zu lösen. Geben Sie mir den Ansatz, dies zu tun.

Ich erstelle einen Baum von Knoten, die ein 4 * 4-Array enthalten, und durchlaufe alle Knoten, die noch nicht verarbeitet wurden. Wenn ich die Lösung erhalte, beende ich die Iteration.

In Viewcontroller habe ich einige Code als

- (IBAction)getSolution:(id)sender {
while (!appDelegate.isResultFound) {
    TreeNode *node=[self nodeWithLowestCostAndUnproceessedInRootNode];
    [node expandNodeToChilds];
    //break;
}
NSLog(@"Result Found");
if([appDelegate.result isEqualToString:@""])
    NSLog(@"No move required");
else
    NSLog(@"%@",appDelegate.result);

}

-(TreeNode*)nodeWithLowestCostAndUnproceessedInRootNode{
TreeNode *node1;
int lowestCost=200;
for (TreeNode *node in appDelegate.treeNodes) {
    if([node myHeuristicsFunction]<lowestCost&&node.isProcessed==NO){
        node1=node;
        lowestCost=[node.cost intValue];
    }
}
return node1;}

und in der Knotenklasse erweitere ich den Knoten als (mit Ausnahme der Bewegung, die vom Elternteil verwendet wird)

-(void)expandNodeToChilds{
[self checkMovesForEmptyPlace];

if(top.x>=0){
    [self addPuzzleBoxToTreeBySwapingPoint:top withMove:@"Bottom"];
}
if(right.y<=3){
    [self addPuzzleBoxToTreeBySwapingPoint:right withMove:@"Left"];
}
if(bottom.x<=3){
    [self addPuzzleBoxToTreeBySwapingPoint:bottom withMove:@"Top"];
}
if(left.y>=0){
    [self addPuzzleBoxToTreeBySwapingPoint:left withMove:@"Right"];
}
self.isProcessed=true;}

Derzeit verwende ich Manhattan Distance mit A *, erhalte aber nicht in nennenswerter Zeit das Ergebnis, der App-Speicher steigt auf 1 GB und die App stürzt ab.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage