/*
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.nqueens.persistence;
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.optaplanner.examples.common.app.LoggingMain;
import org.optaplanner.examples.common.persistence.AbstractSolutionImporter;
import org.optaplanner.examples.common.persistence.SolutionDao;
import org.optaplanner.examples.nqueens.domain.Column;
import org.optaplanner.examples.nqueens.domain.NQueens;
import org.optaplanner.examples.nqueens.domain.Queen;
import org.optaplanner.examples.nqueens.domain.Row;
public class NQueensGenerator extends LoggingMain {
private static final File outputDir = new File("data/nqueens/unsolved/");
protected SolutionDao solutionDao;
public static void main(String[] args) {
new NQueensGenerator().generate();
}
public void generate() {
solutionDao = new NQueensDao();
writeNQueens(4);
// writeNQueens(5);
// writeNQueens(6);
// writeNQueens(7);
writeNQueens(8);
// writeNQueens(9);
// writeNQueens(10);
// writeNQueens(11);
// writeNQueens(12);
// writeNQueens(13);
// writeNQueens(14);
// writeNQueens(15);
writeNQueens(16);
// writeNQueens(17);
// writeNQueens(18);
// writeNQueens(19);
// writeNQueens(20);
// writeNQueens(21);
// writeNQueens(22);
// writeNQueens(23);
// writeNQueens(24);
// writeNQueens(25);
// writeNQueens(26);
// writeNQueens(27);
// writeNQueens(28);
// writeNQueens(29);
// writeNQueens(30);
// writeNQueens(31);
writeNQueens(32);
writeNQueens(64);
writeNQueens(256);
// writeNQueens(10000);
// writeNQueens(100000);
// writeNQueens(1000000);
}
private void writeNQueens(int n) {
String outputFileName = n + "queens.xml";
File outputFile = new File(outputDir, outputFileName);
NQueens nQueens = createNQueens(n);
solutionDao.writeSolution(nQueens, outputFile);
}
public NQueens createNQueens(int n) {
NQueens nQueens = new NQueens();
nQueens.setId(0L);
nQueens.setN(n);
nQueens.setColumnList(createColumnList(nQueens));
nQueens.setRowList(createRowList(nQueens));
nQueens.setQueenList(createQueenList(nQueens));
BigInteger possibleSolutionSize = BigInteger.valueOf(nQueens.getN()).pow(nQueens.getN());
logger.info("NQueens {} has {} queens with a search space of {}.",
n, nQueens.getN(),
AbstractSolutionImporter.getFlooredPossibleSolutionSize(possibleSolutionSize));
return nQueens;
}
private List<Column> createColumnList(NQueens nQueens) {
int n = nQueens.getN();
List<Column> columnList = new ArrayList<Column>(n);
for (int i = 0; i < n; i++) {
Column column = new Column();
column.setId((long) i);
column.setIndex(i);
columnList.add(column);
}
return columnList;
}
private List<Row> createRowList(NQueens nQueens) {
int n = nQueens.getN();
List<Row> rowList = new ArrayList<Row>(n);
for (int i = 0; i < n; i++) {
Row row = new Row();
row.setId((long) i);
row.setIndex(i);
rowList.add(row);
}
return rowList;
}
private List<Queen> createQueenList(NQueens nQueens) {
int n = nQueens.getN();
List<Queen> queenList = new ArrayList<Queen>(n);
long id = 0;
for (Column column : nQueens.getColumnList()) {
Queen queen = new Queen();
queen.setId(id);
id++;
queen.setColumn(column);
// Notice that we leave the PlanningVariable properties on null
queenList.add(queen);
}
return queenList;
}
}