Я выполняю поиск минимальных конфликтов nqueens, как упомянуто
Norvig S., & Peter, JR and. (2014). Искусственный интеллект - современный подход. В Пирсоне (том 58, выпуск 12).
Авторы упоминают, что один heuristi c один очень эффективен:
Пока когда я его реализую, я не могу решить более 5000 меньше, чем за минуту. Несмотря на то, что авторы используют скорость в миллион и более за 50 итераций, моя реализация часто превышает 1000 итераций для 5000 итераций. Другой вопрос упоминает аналогичный результат.
Есть идеи, что я делаю не так? Это алгоритми c или я использую все oop, где я не должен? Кстати,
update()
- основной метод.
list<unsigned> rowsInConflict(const unsigned currentState[]) {
list<unsigned> rowsInConflict; //TODO change to map
for (unsigned row = 0; row < boardSize; row++) {
for (unsigned otherRow = 0; otherRow < boardSize; otherRow++) {
if (isConflict(row, currentState[row], otherRow, currentState[otherRow])) {
rowsInConflict.push_front(row);
debug("row in conflict " + to_string(row));
rowsInConflict.push_front(otherRow);
//return rowsInConflict;
}
}
}
return rowsInConflict;
}
bool update(unsigned currentState[]) {
unsigned randomRow, column;
list<unsigned> conflictRows = rowsInConflict(currentState);
if (conflictRows.empty()) {
return true;
}
list<unsigned>::iterator it = conflictRows.begin();
std::advance(it, rand() % conflictRows.size());
randomRow = (unsigned) *it;
column = getMinConflictColumn(currentState, randomRow);
placeQueen(currentState, randomRow, column);
return false;
}
void solve_nqueen(unsigned size, bool isVerbose) {
unsigned rowSpace[size];
while (!update(rowSpace)) {
if (iterations >= 1000) {
cout << "Random restart." << endl;
intialize(rowSpace);
iterations = 0;
}
iterations++;
}
printBoard(rowSpace);
}
};