Ich wollte Leistungsvergleiche für verschiedene Ansätze zur Lösung des N-Königinnen-Problems bewerten. Hauptsächlich auf AI-Metaheuristiken basierende Algorithmen wie Simulated Annealing, Tabu-Suche und genetischer Algorithmus etc. im Vergleich zu exakten Methoden (wie Backtracking). Gibt es einen Code für das Studium? Eine Menge von realen Optimierungsproblemen wie es betrachten kooperative Schemata zwischen genauen Methoden und Metaheuristiken.Vergleich der algorithmischen Ansätze zum N-Königinnen-Problem
Antwort
Ich musste einen N-Queens Solver in Java für eine Klasse vor ein paar Jahren in der Schule schreiben. Ich bin nicht sicher, welche Art von Quellcode Sie suchen, aber wenn es irgendeine Hilfe wäre hier ist der Code aus diesem Programm. Es ist in keiner Weise wirklich optimiert, nur ein ziemlich einfacher rekursiver Algorithmus. Ich habe dies mein erstes Semester am College geschrieben, also entschuldige die Anfängerfehler :-) Ich habe die meisten Blockkommentare rausgenommen, aber hoffentlich kannst du es mit denen, die ich hinterlassen habe, verstehen. Wenn du einen professionellen Quellcode willst Vielleicht eine Google-Suche durchführen? Ich weiß, dass Wikipedia einige anständige Artikel und Pseudocode hatte. Hoffe das hilft!
import java.util.Scanner;
public class QueensSolver
{
public static void main(String args[])
{
System.out.println("Please enter the size of the chessboard: ");
Scanner stdin = new Scanner(System.in);
int sizeOfBoard = stdin.nextInt();
//Create the board to the given size.
char[][] board = new char[sizeOfBoard][sizeOfBoard];
//fill board with hyphens
for(int row=0; row<sizeOfBoard; row++)
{
for(int col=0; col<sizeOfBoard; col++)
{
board[row][col] = '-';
}
}
//Call the method which attempts to solve the problem
if(solve(sizeOfBoard, board, 0))
{ //if true, we know that the board array contains a solution
printBoard(sizeOfBoard, board);
}
else
{ //if false, we know that no solutions exist on this size of board
System.out.println("No solutions are possible with this board size.");
}
}
public static boolean solve(int sizeOfBoard, char[][] board, int row)
{
//If all rows have been filled, we have a solution
if(row>=sizeOfBoard)
{
return true;
}
//For each column(space) on the given row
for(int col=0; col<sizeOfBoard; col++)
{
//If placing a queen in this column(space) does not cause a conflict
if(!checkConflict(sizeOfBoard, board, row, col))
{
//place a queen here
board[row][col]='Q';
//then call this same function on the next row
boolean success = solve(sizeOfBoard, board, row+1);
//if every function in this recursive path returns true
if(success)
{
//then we return true also
return true;
}
//If there is no possible solution with this queen placement,
//then we replace the queen with an empty and attempt
//to place a queen in the next column(space).
else
{
board[row][col]='-';
}
}
}
return false;
}
public static boolean checkConflict(int sizeOfBoard, char[][] board, int rowCheck, int colCheck)
{
//Check for queens placed directly above this position
for(int row = rowCheck-1; row>=0; row--)
{
if(board[row][colCheck]=='Q')
{
return true;
}
}
//Check for queens placed on the diagonal
//above and to the right of this position
int col = colCheck+1;
for(int row = rowCheck-1; row>=0; row--)
{
if(col>=sizeOfBoard)
{
break;
}
if(board[row][col]=='Q')
{
return true;
}
col++;
}
//Check for queens placed on the diagonal
//above and to the left of this position
col = colCheck-1;
for(int row = rowCheck-1; row>=0; row--)
{
if(col<0)
{
break;
}
if(board[row][col]=='Q')
{
return true;
}
col--;
}
//We know that no conflicts are caused by this position, so return false
return false;
}
public static void printBoard(int sizeOfBoard, char[][] board)
{
for(int row=0; row<sizeOfBoard; row++)
{
for(int col=0; col<sizeOfBoard; col++)
{
System.out.print(board[row][col]);
}
System.out.print("\n");
}
}
}
Ich weiß nicht wirklich Ihre Frage bekommen (haben Sie die Theorie des Algorithmus wissen? Sie wollen also den Code sehen?), Aber ich bin bereit, den Code zu teilen, die ich aus der Natur angepasst. Es ist Python und es ist ziemlich cool. Ich habe es geändert, um Iteratoren zu verwenden, und auf wundersame Weise funktioniert es immer noch.
# I can't really claim much credit for this implementation.
# I found this on the web and I converted it to use python generators.
# Adapted from:
# http://en.wikibooks.org/wiki/Algorithm_implementation/Miscellaneous/N-Queens
def queensproblem(solution, rows, columns):
def add_one_queen(new_row, columns, solution):
for new_column in range(columns):
if not conflict(new_row, new_column, solution):
yield new_column
def conflict(new_row, new_column, solution):
return any(solution[row] == new_column or
solution[row] + row == new_column + new_row or
solution[row] - row == new_column - new_row
for row in range(new_row))
if len(solution) == rows:
yield solution
else :
for row in range(len(solution), rows):
for col in add_one_queen(row, columns, solution):
for x in queensproblem(solution + [col], rows, columns):
yield x
else:
break
if __name__ == '__main__':
for i,solution in enumerate(queensproblem([], 8, 8)):
print i, solution
Ein schöner Ansatz besteht in der Datei test/test_generators.py
der Python-Standardbibliothek. Überprüfen Sie die Queens-Klasse. Wenn Sie Python nicht auf Ihrem Computer installiert haben, können Sie die Datei online durchsuchen here.
Der Drools Löser könnte für Sie interessant sein. Vor allem chapter 1 of the documentation.
Dies ist nicht die schnellste mögliche Implementierung des Schemas, aber es ist ziemlich prägnant. Ich habe es mir selbst ausgedacht, aber ich bezweifle, dass es einzigartig ist. Es ist in PLT Scheme, daher müssen einige Funktionsnamen geändert werden, damit sie in R6RS ausgeführt werden. Die Liste der Lösungen und jeder Lösung ist mit Widersprüchen aufgebaut, also sind sie umgekehrt. Die Umkehrungen und Maps am Ende reorder alles und fügen Sie Zeilen zu den Lösungen für eine hübsche Ausgabe. Die meisten Sprachen haben eine Art Funktion fold, siehe:
http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29
#lang scheme/base
(define (N-Queens N)
(define (attacks? delta-row column solution)
(and (not (null? solution))
(or (= delta-row (abs (- column (car solution))))
(attacks? (add1 delta-row) column (cdr solution)))))
(define (next-queen safe-columns solution solutions)
(if (null? safe-columns)
(cons solution solutions)
(let move-queen ((columns safe-columns) (new-solutions solutions))
(if (null? columns) new-solutions
(move-queen
(cdr columns)
(if (attacks? 1 (car columns) solution) new-solutions
(next-queen (remq (car columns) safe-columns)
(cons (car columns) solution)
new-solutions)))))))
(unless (exact-positive-integer? N)
(raise-type-error 'N-Queens "exact-positive-integer" N))
(let ((rows (build-list N (λ (row) (add1 row)))))
(reverse (map (λ (columns) (map cons rows (reverse columns)))
(next-queen (build-list N (λ (i) (add1 i))) null null)))))