执行八皇后约束代码时无法从csp库导入CSP类的问题
问题描述
执行以下八皇后问题代码时出现导入错误:
from typing import Dict,List,Optional from csp import CSP from constraint import Constraint from typing import Dict,List,Optional class QueensConstraint(Constraint[int,int]): def __init__(self,columns:List[int])->None: super().__init__(columns) self.columns: List[int]=columns def satisfied(self,assignment: Dict[int,int])->bool: for q1c,q1r in assignment.items(): for q2c in range(q1c+1,len(self.columns)+1): q2r: int=assignment[q2c] if q1r==q2r: return False if abs(q1r-q2r)==abs(q1c-q2c): return False return True if __name__=="__main__": columns: List[int]=[1,2,3,4,5,6,7,8] for column in columns: rows[column]=CSP(columns,rows) csp.add_constraint(QueensConstraint(columns)) solution: Optional[Dict[int,int]]=csp.backtracking_search() if solution is None: print("no solution found.") else: print(solution)
错误信息:
ImportError Traceback (most recent call last) Cell In[16], line 3 1 from typing import Dict,List,Optional ----> 3 from csp import CSP 4 from constraint import Constraint 5 from typing import Dict,List,Optional ImportError: cannot import name 'CSP' from 'csp' (c:\users\xxxxx\appdata\local\programs\python\python38\lib\site-packages\csp\__init__.py)
已安装python-constraint、csp、typing库,但问题仍存在。
解决方法
- 卸载错误的
csp包:你安装的csp第三方库和代码中需要的CSP类不匹配,执行命令卸载:pip uninstall csp - 确认
CSP类的来源:- 若你是跟着教程编写代码,这个
CSP类通常是教程中自定义的模块,而非第三方库。你需要创建csp.py文件,并实现包含backtracking_search等方法的CSP类,示例实现如下:from typing import Dict, List, Optional from constraint import Constraint class CSP: def __init__(self, variables: List[int], domains: Dict[int, List[int]]): self.variables = variables self.domains = domains self.constraints: Dict[int, List[Constraint]] = {} for variable in self.variables: self.constraints[variable] = [] if variable not in self.domains: raise LookupError("每个变量都必须有对应的定义域") def add_constraint(self, constraint: Constraint): for variable in constraint.variables: if variable not in self.variables: raise LookupError("约束中的变量不在CSP变量列表中") self.constraints[variable].append(constraint) def backtracking_search(self, assignment: Dict[int, int] = None) -> Optional[Dict[int, int]]: if assignment is None: assignment = {} if len(assignment) == len(self.variables): return assignment unassigned = [v for v in self.variables if v not in assignment] first = unassigned[0] for value in self.domains[first]: local_assignment = assignment.copy() local_assignment[first] = value if self.is_consistent(local_assignment): result = self.backtracking_search(local_assignment) if result is not None: return result return None def is_consistent(self, assignment: Dict[int, int]) -> bool: for constraint_list in self.constraints.values(): for constraint in constraint_list: if not constraint.satisfied(assignment): return False return True - 若想直接使用
python-constraint库,需调整代码适配其API,该库的约束定义和搜索方法与你当前代码结构不同。
- 若你是跟着教程编写代码,这个
- 修正主函数逻辑错误:原代码中
rows未定义,且循环创建CSP对象的逻辑错误,修正后的主函数如下:if __name__=="__main__": columns: List[int] = [1,2,3,4,5,6,7,8] # 为每个列定义可行的行范围 rows: Dict[int, List[int]] = {col: list(range(1,9)) for col in columns} csp = CSP(columns, rows) csp.add_constraint(QueensConstraint(columns)) solution: Optional[Dict[int,int]] = csp.backtracking_search() if solution is None: print("no solution found.") else: print(solution)
内容的提问来源于stack exchange,提问作者Hamza Ali
相关产品推荐
相关产品推荐

