package ec.app.sat; 

import ec.*; 
import ec.simple.*; 
import ec.vector.*; 
import ec.util.*; 
import java.io.*; 
import java.util.*; 

/**
   SAT implements the boolean satisfiability problem. 
  
   

Parameters

base.sat-filename
String
(Filename containing boolean satisfiability formula in Dimacs CNF format)
@author Keith Sullivan @version 1.0 */ public class SAT extends Problem implements SimpleProblemForm { private static final long serialVersionUID = 1; public static final String P_FILENAME = "sat-filename"; Clause formula[]; public void setup(EvolutionState state, Parameter base) { super.setup(state, base); File filename = state.parameters.getFile(base.push(P_FILENAME), null); if (filename == null) // uh oh state.output.fatal("Filename must be provided", base.push(P_FILENAME)); try { BufferedReader inFile = new BufferedReader(new FileReader(filename)); String line=""; int cnt=0; boolean start = false; while ((line = inFile.readLine()) != null) { if (start) { formula[cnt++] = new Clause(line); continue; } if (line.startsWith("p")) { start = true; line = line.trim(); int index = line.lastIndexOf(" "); formula = new Clause[Integer.parseInt(line.substring(index+1))]; } } inFile.close(); } catch (IOException e) { state.output.fatal("Error in SAT setup, while loading from file " + filename + "\nFrom parameter " + base.push(P_FILENAME) + "\nError:\n" + e); } } /** Evalutes the individual using the MAXSAT fitness function. */ public void evaluate(final EvolutionState state, final Individual ind, final int subpopulation, final int threadnum) { BitVectorIndividual ind2 = (BitVectorIndividual) ind; double fitness=0; for (int i=0; i < formula.length; i++) fitness += formula[i].eval(ind2); ((SimpleFitness)(ind2.fitness)).setFitness( state, fitness, false); ind2.evaluated = true; } /** Private helper class holding a single clause in the boolean formula. Each clause is a disjunction of boolean variables (or their negation). */ public static class Clause implements java.io.Serializable { private static final long serialVersionUID = 1; int[] variables; public Clause(String c) { StringTokenizer st = new StringTokenizer(c); variables = new int[st.countTokens()-1]; for (int i=0; i < variables.length; i++) { variables[i] = Integer.parseInt(st.nextToken()); } } /** Evaluates the individual with the clause. Returns 1 is clase is satisfiabile, 0 otherwise. */ public int eval(BitVectorIndividual ind) { boolean tmp; int x; for (int i=0; i < variables.length; i++) { x = variables[i]; if (x < 0) tmp = !ind.genome[-x-1]; else tmp = ind.genome[x-1]; if (tmp) return 1; } return 0; } }; }

Ads help maintain this website.