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
示例#2
0
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
示例#3
0
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