首页 > 解决方案 > 显示 TypeError: unhashable type: 'list'

问题描述

这是一个用 CSP 解决的 K-Knights 问题,问题似乎是约束。

来自这里的错误

文件“F:/Lectures/AI Lab/Codes/nonattacking/aicodes/csp.py”,第 23 行,在init self.setUpVariableDomains()

文件“F:/Lectures/AI Lab/Codes/nonattacking/aicodes/csp.py”,第 28 行,在 setUpVariableDomains self.addVariableDomain(var, self._domain)

文件“F:/Lectures/AI Lab/Codes/nonattacking/aicodes/csp.py”,第 35 行,在 addVariableDomain self._domainOfVariable[var] = copy.deepcopy(domain)

类型错误:不可散列类型:“列表”

import variable
import copy
import notEqualConstraint
import simpleInference
import time
import backtrackingSearch
import consoleListener
import nonAttackingConstraint
class CSP():

def __init__(self, variables = [], domains = [], constraints = []):
    self._variables = variables
    self._domain = domains
    self._constraints = constraints
    self._domainOfVariable = {}
    self._contraintsOfVariable = {}
    self.setUpVariableDomains()
    self.setUpConstraints()

def setUpVariableDomains(self):
    for var in self._variables:
        self.addVariableDomain(var, self._domain)

def setUpConstraints(self):
    for constraint in self._constraints:
        self.addConstraint(constraint)

def addVariableDomain(self,var,domain):
    self._domainOfVariable[var] = copy.deepcopy(domain)

def addConstraint(self,constraint):
    for var in constraint.getScope():
        if var not in self._contraintsOfVariable:
            self._contraintsOfVariable[var] = []
            self._contraintsOfVariable[var].append(constraint)

def addSingleConstraint(self,constraint):
    self._constraints.append(constraint)
    for var in constraint.getScope():
        if var not in self._contraintsOfVariable:
            self._contraintsOfVariable[var] = []
            self._contraintsOfVariable[var].append(constraint)

def addVariable(self,variable):
    self._variables.append(variable)
    self.addVariableDomain(variable,self._domain)

def getVariables(self):
    return self._variables

def getDomainValues(self,var):
    return self._domainOfVariable[var]

def getConstraints(self,var):
    if var not in self._contraintsOfVariable:
        return []
    return self._contraintsOfVariable[var]

def getVariableDomains(self):
    return self._domainOfVariable

def setVariableDomains(self,domainOfVariable):
    self._domainOfVariable = domainOfVariable

def copy(self):
    variables = copy.deepcopy(self._variables)
    domains = copy.deepcopy(self._variables)
    constraints = copy.deepcopy(self._variables)
    csp = CSP(variables, domains, constraints)
    return csp

def getNeighbour(self,variable,constraint):
    neigh = []
    for va in constraint.getScope():
        if va != variable and (va not in neigh):
            neigh.append(va)
            return neigh

def removeValueFromDomain(self,variable,value):
    values = []
    for val in self.getDomainValues(variable):
        if val != value:
            values.append(val)
            self._domainOfVariable[variable] = values


if __name__ == '__main__':

    domains = ["K","A"]


    variables = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

    X=[[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[1,-2],[-1,2],[-1,-2]]

    constraints = [
    nonAttackingConstraint.NotAttackingConstraint(X)



        ]


    Csp = CSP(variables,domains,constraints)
    inPro = simpleInference.SimpleInference()
    bts = backtrackingSearch.BactrackingSearch(inPro,[consoleListener.ConsoleListener()],variableOrdering = True)
    start = time.time()
    result = bts.solve(Csp)
    end = time.time()
    print("%.2f ‐ %.2f" % (start,end))

特别是在上面的 CSP 类中的 addVariableDomain 处停止,并且由于我的约束是列表而给了我不可散列的类型:'list' 错误。问题是否可识别?有解决办法吗?

标签: python

解决方案


列表不能用作字典键,因为它们是可变的,因此不适合散列。尝试将列表转换为元组。

def addVariableDomain(self,var,domain):
    self._domainOfVariable[tuple(var)] = copy.deepcopy(domain)

您可能必须在var用作字典键的任何地方执行相同的操作。


推荐阅读