|
|
- #!/usr/bin/env python3
-
- import numpy as np
- import random
- from . import kSAT
-
- def generateRandomKSAT(numberOfClauses,
- numberOfVariables,
- numberOfVariablesPerClause):
-
- instance = kSAT.kSAT()
-
- clauses = [[] for i in range(numberOfClauses)]
-
- #make sure every variable is bound to at least one clause
- for varIndex in range(numberOfVariables):
-
- clauseIndex = random.choice(range(numberOfClauses))
-
- while (len(clauses[clauseIndex]) >= numberOfVariablesPerClause or
- varIndex + 1 in clauses[clauseIndex]):
- clauseIndex = random.choice(range(numberOfClauses))
-
- clauses[clauseIndex].append(varIndex + 1)
-
- #fill in the missing bindings
- for clause in clauses:
- tmpClause = []
-
- clauseIsUnique = False
- while not clauseIsUnique:
-
- tmpClause = clause.copy()
-
- numRemainingBindings = numberOfVariablesPerClause - len(tmpClause)
- variablesNotYetInClause = __getVariablesNotYetInClause(tmpClause,
- numberOfVariables)
-
- remainingBindings = random.sample(variablesNotYetInClause,
- numRemainingBindings)
-
- tmpClause += remainingBindings
-
- for i in range(len(tmpClause)):
- tmpClause[i] *= random.choice([-1, 1])
-
- if tmpClause not in clauses:
- clauseIsUnique = True
-
- instance.addClause(tmpClause)
-
- return instance
-
-
- def __getVariablesNotYetInClause(clause, numberOfTotalVars):
- missingVariables = []
-
- prevVar = 1;
- for currVar in clause:
- missingVariables += list(range(prevVar, currVar))
-
- prevVar = currVar + 1
-
- missingVariables += list(range(prevVar, numberOfTotalVars + 1))
-
- return missingVariables
|