You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行八皇后约束代码时无法从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:27:48