import org.chocosolver.solver.Model; import org.chocosolver.solver.Solver; import org.chocosolver.solver.constraints.Constraint; import org.chocosolver.solver.search.strategy.Search; import org.chocosolver.solver.variables.IntVar; import java.io.*; import java.util.ArrayList; import java.util.Scanner; public class NoCriteriaSingleWithSolFile { public static void giveDomains (Model model, IntVar[] ugs, String dir, UG[] nodes){ int index = 0; try { File allUg = new File(dir + "/ugs_init.txt"); Scanner readerUg = new Scanner(allUg); while (readerUg.hasNextLine()) { String dataUg = readerUg.nextLine(); if(nodes[index].valid) { String[] str_split = dataUg.split(",", 0); int size = str_split.length; int[] toInsert = new int[size]; for (int i = 0; i < size; i++) { toInsert[i] = Integer.parseInt(str_split[i]); } ugs[index] = model.intVar("UG_" + (index), toInsert); } else { ugs[index] = model.intVar("UG_"+(index), 0); } index++; } readerUg.close(); } catch (FileNotFoundException e) { System.out.println("An error occurred."); e.printStackTrace(); } } public static void main(String[] args) throws IOException { int areaLimit = Integer.parseInt(args[0]); String fileDirectory = args[1]; ArrayList islandUGs = new ArrayList<>(); String regionFile = args[3]; File island = new File("subregions/"+regionFile); Scanner islandReader = new Scanner(island); while (islandReader.hasNextLine()) { islandUGs.add(Integer.parseInt(islandReader.nextLine())); } islandReader.close(); Model m = new Model("Forest Management"); System.out.println("Reading Input Files"); BufferedReader reader = new BufferedReader(new FileReader(fileDirectory + "/ugs_init.txt")); int nUgs = 0; while (reader.readLine() != null) nUgs++; reader.close(); UG[] nodes = new UG[nUgs]; int minBorder = Integer.parseInt(args[2]); UG.setupInternalIds(nodes, fileDirectory); if(minBorder <= 0) UG.fillNoCriteria(nodes, fileDirectory, 0); else UG.fillNoCriteria(nodes, fileDirectory, minBorder); for(int i = 0; i < nodes.length; i++){ if(islandUGs.contains(nodes[i].externalId)){ nodes[i].valid = true; } } IntVar[] ugs = new IntVar[nUgs]; // same for the constraint variable array giveDomains(m, ugs, fileDirectory, nodes); // reads the ugs_init file and initializes each variable with its possible prescription values as domain String solutionFileName = args[4]; File solutionFile = new File("subregions/"+solutionFileName); Scanner solFileReader = new Scanner(solutionFile); while (solFileReader.hasNextLine()) { String solLine = solFileReader.nextLine(); int externalId = Integer.parseInt(solLine.split(",")[0]); int presc = Integer.parseInt(solLine.split(",")[1]); for(int i = 0; i < nodes.length; i++){ if(nodes[i].externalId == externalId && nodes[i].valid) { m.arithm(ugs[i], "=", presc).post(); } } } solFileReader.close(); System.out.println("Setting up Constraints"); for(int ugIndex = 0; ugIndex < nodes.length; ugIndex++) { //loops through every UG //the propagator takes as parameters the index of the UG we are starting out from //the nodes with all the info, the constraint variable array and the area limit if(nodes[ugIndex].valid && !nodes[ugIndex].noAdjacencies) { new Constraint("Area Limit Constraint", new CustomPropagatorFloat(ugIndex, nodes, ugs, areaLimit)).post(); } } System.out.println("Running solver"); Solver s = m.getSolver(); //solver.setSearch(Search.activityBasedSearch(ugs)); //s.setSearch(Search.minDomUBSearch(ugs)); long startTime = System.currentTimeMillis(); //fetch starting time if (s.solve()) { System.out.println("Found solution! Timestamp: "+(System.currentTimeMillis()-startTime)+"\n"); FileWriter outputPairs = new FileWriter("Results/"+"NC-"+regionFile+"-ValidSolutionWith.csv"); outputPairs.write("Timestamp: "+(System.currentTimeMillis()-startTime)+"\n"); for (int i = 0; i < ugs.length; i++) { if (nodes[i].valid) { outputPairs.write(nodes[i].externalId + "," + ugs[i].getValue() + "\n"); } } outputPairs.close(); } } }