0.search

lab0

环境

实验地址:https://cs50.harvard.edu/ai/2024/projects/0/degrees/

WSL2 Ubuntu20.04

image-1

#安装实验测试工具
pip install check50

背景要求

基于六度分割理论,通过参演电影找出两个电影演员之间的联系

实现

def shortest_path(source, target):
    """
    Returns the shortest list of (movie_id, person_id) pairs
    that connect the source to the target.

    If no possible path, returns None.
    """
    lastNode = None
    result = []
    visited = set()
    visited_movies = set()
    # BFS
    root = Node(source, None, None)
    queue = QueueFrontier()
    visited.add(source)
    queue.add(root)
    while not queue.empty():
        # 获取当前用户id
        curNode = queue.remove()

        if target == curNode.state:
            lastNode=curNode
            break

        p_id = curNode.state
        # 获取参演电影
        movice_ids = people[p_id]["movies"]
        # 获取电影的star 逐个遍历
        for movie_id in movice_ids:
            if movie_id in visited_movies:
                continue
            stars = movies[movie_id]['stars']
            for star_id in stars:
                if star_id in visited:
                    continue
                pNode = Node(curNode.state, curNode.parent, curNode.action)
                node = Node(star_id, pNode, movie_id)
                visited.add(star_id)
                queue.add(node)
            visited_movies.add(movie_id)
    if lastNode is not None:
       while lastNode.parent is not None:
           m = lastNode.action
           p = lastNode.state
           result.insert(0,(m,p))
           lastNode=lastNode.parent
       return result
    else:
        return None

结果

# 输入命令测试结果
check50 -l ai50/projects/2024/x/degrees

image-2

代码地址

Degrees