在回溯算法中实现“最小启发式”以解决Python中的难题

2024-10-02 02:38:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始解决难题和递归/回溯。 我试图解决6x6摩天大楼的难题,其中包括根据提供给我们的具体线索填充一块6x6板。 我已经做了尽可能多的约束编程,但为了解决某些难题,我不得不诉诸暴力迫使结束

我的板中的一行退出约束函数的外观如下所示:

board = [[1, 2, 3, 4, 5], 6, [1, 2, 3, 5, 6], [1, 2, 4, 5], [1, 3], [2, 3, 4, 5]] 其中子列表是该特定单元的不同可能性。(因此,第一个子列表中的单元格可以是1、2、3、4或5)

我已经成功地实现了回溯蛮力方法,但希望尝试一种最小的启发式方法,例如优先考虑可能性最小的单元。 以下是我目前掌握的情况:

def search(searchBoard, clues):
    findLeast = full(searchBoard)
    if not findLeast:
        return True
    else:
        row , col = findLeast
    val = searchBoard[row][col]
    for i in searchBoard[row][col]:
        if is_valid(searchBoard, clues, 6, i, (row, col)):
            searchBoard[row][col] = i
            if search(searchBoard, clues):
                return True
            searchBoard[row][col] = val
    return False

def full(puzzle):
    try:
        min = 0
        for i in range(len(puzzle)):
            for j in range(1 ,len(puzzle)):
                if isinstance(puzzle[i][j] , list):
                    if len(puzzle[i][j-1]) < len(puzzle[i][j]):
                        min = len(puzzle[i][j-1])
                        pos = (i , j-1)
        return pos
    except TypeError:
        return None

检查元素是否可以插入到特定单元格中

(在我的代码中编辑了一些语法错误)


Tags: in列表forlenreturnifcol可能性

热门问题