def build_variables(data): variables = [] index = 0 for direction in data: for i in range(len(direction['specs'])): # New instance of variable variable = Variable(str(direction['prefix']) + str(i)) # Get length of block values block_length = sum(direction['specs'][i]) # Stuff we need to do to find the different permutations for this block initial_specs = Builder.initial_specs(direction['specs'][i]) combinations = Builder.specs_combinations(initial_specs, direction['length']) permutations = Builder.create_permutations(combinations, direction['length'], block_length) # Set the final domain variable.domain = Builder.permutation_to_domain(direction['specs'][i], direction['length'], permutations) # Add variable to list variables.append(variable) # Increase index value index += 1 return variables
def copy_grid(grid, colorList): grid2 = [] for y in range(0, len(grid)): grid3 = [] for c in range(0, len(grid[y])): if grid[y][c].assignment == '_': var = Variable(c, y, '_', None, None) var.domain = [] var.domain = copy_colorList(colorList) var.state = 0 else: var = Variable(c, y, grid[y][c].assignment, None, None) var.domain = [] var.domain.append(grid[y][c].assignment) var.state = 1 grid3.append(var) grid2.append(grid3) return grid2
def main(filename): flowFree = readFile(filename) colorList = [] cellList = [] colorLoc = {} grid = [] y = 0 for line in flowFree: for s in line: grid2 = [] print s for c in range(0, len(s)): if s[c] not in colorList and s[c] != '_': colorList.append(s[c]) colorLoc[s[c] + 'Start'] = (c, y) if s[c] == '_': var = Variable(c, y, '_', None, None) var.domain = colorList var.state = 0 cellList.append(var) else: var = Variable(c, y, s[c], None, None) var.domain.append(s[c]) var.state = 1 colorLoc[s[c] + 'End'] = (c, y) grid2.append(var) grid.append(grid2) y += 1 print colorList print colorLoc # Reserved for testing solution path// DO NOT UNCOMMENT -- Call in other functions if needed #------------------------------------------------------------------------- # filename = "output55.txt" # flowFree = readFile(filename) # grid = [] # y = 0 # for line in flowFree: # for s in line: # grid2 = [] # print s # for c in range(0,len(s)): # if s[c] == '_': # var = Variable(c, y, ' ', None, None) # var.domain = colorList # var.state = 0 # else: # var = Variable(c, y, s[c], None, None) # var.domain.append(s[c]) # var.state = 1 # grid2.append(var) # grid.append(grid2) # y+=1 # allPathsFound = True # for i in colorList: # startPath = colorLoc.get(i+'Start') # endPath = colorLoc.get(i+'End') # if (findPath(grid, grid[startPath[1]][startPath[0]], grid[endPath[1]][endPath[0]]) == None): # allPathsFound = False # print allPathsFound #-------------------------------------------------------------------------- # UNCOMMENT THESE LINES TO RUN DUMB CSP SOLVER # random.shuffle(cellList) # for i in cellList: # i.domain = [] # for z in colorList: # i.domain.append(z) # random.shuffle(i.domain) # print i.x, i.y, i.domain # iterative_count() # dumb_csp_search(grid, colorList, colorLoc, cellList) #--------------------------------------------------------------------------- # UNCOMMENT THESE LINES TO RUN SMART CSP SOLVER colorPaths = {} domainList = [] for i in colorList: colorStart = colorLoc.get(i + 'Start') colorPaths[i + 'x'] = [] colorPaths[i + 'y'] = [] colorPaths[i + 'x'].append(colorStart[0]) colorPaths[i + 'y'].append(colorStart[1]) smart_csp_search(grid, colorList, colorLoc, colorPaths, domainList) #---------------------------------------------------------------------------- foundPath = True for i in colorList: startPath = colorLoc.get(i + 'Start') endPath = colorLoc.get(i + 'End') if (findPath(grid, grid[startPath[1]][startPath[0]], grid[endPath[1]][endPath[0]]) == None): foundPath = False if foundPath: print "SOLUTION FOUND" for z in range(0, len(grid)): print ' '.join(grid[z][y].assignment for y in range(0, len(grid[z]))) return grid else: print "FAILED TO FIND SOLUTION" return None