You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

66 lines
2.0 KiB

#!/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