편집 기록

편집 기록
  • 프로필 정영훈님의 편집
    날짜2021.10.11

    __str__ 메서드가 실행이 안되고 attribute error가 발생합니다..


    # -*- coding: utf-8 -*-
    """
    Created on Tue Sep 28 20:54:55 2021
    
    @author: Salieli
    """
    
    class State:
        def __init__(self, board, goal, moves=0):
            self.board = board
            self.moves = moves
            self.goal = goal
    
            # i1과 i2를 교환하여 새로운 상태를 반환함
            def get_new_board(self, i1, i2, moves):
                new_board = self.board[:]
                new_board[i1], new_board[i2] = new_board[i2], new_board[i1]
    
                return State(new_board, self.goal, moves)
    
            # 자식 노드를 확장하여 리스트에 저장하여 반환하기
            def expand(self, moves):
                result = []
                i = self.board.index(0)
                if not i in [0,1,2]:# up
                        result.append(self.get_new_board(i,i-3,moves))          
                        if not i in [0,3,6]:# LEFT
                           result.append(self.get_new_board(i,i-1,moves))
                        if not i in [2,5,8]:# RIGHT 
                           result.append(self.get_new_board(i,i+1,moves))
                        if not i in [6,7,8]:# DOWN
                           result.append(self.get_new_board(i,i+3,moves))
                return result
    
    
            def __str__(self):
                return str(self.board[:3])+"\n"+\
                    str(self.board[3:6])+"\n"+\
                    str(self.board[6:])+"\n"+\
                    "-----------------"
    
            def __eq__(self,other):
                   return self.board == other.board
    
    # 초기상태
    puzzle = [2,8,3,
              1,0,4,
              7,6,5]
    
    # 목표 상태
    goal = [1,2,3,
            4,5,6,
            7,8,0]
    
    # open list
    open_queue = [] 
    open_queue.append(State(puzzle, goal)) 
    
    # closed list
    closed_queue = []
    moves = 0;
    
    while len(open_queue) !=0:
        current = open_queue.pop(0)
        print(current)    
        if current.board == goal:
            print("탐색 성공")
            break    
        moves = current.moves+1             
        closed_queue.append(current)
    
        for state in current.expand(moves): 
            if (state in closed_queue) or (state in open_queue):
                continue
            else:
                open_queue.append(State)
                print("탐색 실패")
    

    8-puzzle을 DFS방법으로 풀고 그 과정을 출력하는 코드입니다. 코드 자체는 대학 강의 자료에서 그대로 가져온 것이고 정상적으로 실행되는 교수님과 같은 환경에서 실행했다고 생각합니다

    하지만 print(current)에서 current = State(puzzle, goal)이지만 str을 통해 리스트가 출력되지 않고 그저 state의 주소가 출력됩니다. (str이 정상적으로 실행되지 않는 것 같습니다)

    또한 'State' object has no attribute 'expand' 라는 오류가 출력되는데 오류의 원인을 찾아보았지만 위 코드와는 크게 상관이 없어 보였습니다.. 교수님과 다른 사람들은 정상적으로 실행되는 걸 확인했는데 도대체 왜 안되는 건가요?

  • 프로필 서재영님의 편집
    날짜2021.10.11

    __str__ 메서드가 실행이 안되고 attribute error가 발생합니다..


    -- coding: utf-8 --

    """ Created on Tue Sep 28 20:54:55 2021

    @author: Salieli """

    class State: def init(self, board, goal, moves=0): ``self.board = board self.moves = moves self.goal = goal

        # i1과 i2를 교환하여 새로운 상태를 반환함
        def get_new_board(self, i1, i2, moves):
            new_board = self.board[:]
            new_board[i1], new_board[i2] = new_board[i2], new_board[i1]
    
            return State(new_board, self.goal, moves)
    
        # 자식 노드를 확장하여 리스트에 저장하여 반환하기
        def expand(self, moves):
            result = []
            i = self.board.index(0)
            if not i in [0,1,2]:# up
                    result.append(self.get_new_board(i,i-3,moves))          
                    if not i in [0,3,6]:# LEFT
                       result.append(self.get_new_board(i,i-1,moves))
                    if not i in [2,5,8]:# RIGHT 
                       result.append(self.get_new_board(i,i+1,moves))
                    if not i in [6,7,8]:# DOWN
                       result.append(self.get_new_board(i,i+3,moves))
            return result
    
    
        def __str__(self):
            return str(self.board[:3])+"\n"+\
                str(self.board[3:6])+"\n"+\
                str(self.board[6:])+"\n"+\
                "-----------------"
    
        def __eq__(self,other):
               return self.board == other.board
    

    초기상태

    puzzle = [2,8,3, 1,0,4, 7,6,5]

    목표 상태

    goal = [1,2,3, 4,5,6, 7,8,0]

    open list

    open_queue = [] open_queue.append(State(puzzle, goal))

    closed list

    closed_queue = [] moves = 0;

    while len(open_queue) !=0: current = open_queue.pop(0) print(current)
    if current.board == goal: print("탐색 성공") break
    moves = current.moves+1
    closed_queue.append(current)

    for state in current.expand(moves): 
        if (state in closed_queue) or (state in open_queue):
            continue
        else:
            open_queue.append(State)
            print("탐색 실패")
    

    8-puzzle을 DFS방법으로 풀고 그 과정을 출력하는 코드입니다. 코드 자체는 대학 강의 자료에서 그대로 가져온 것이고 정상적으로 실행되는 교수님과 같은 환경에서 실행했다고 생각합니다

    하지만 print(current)에서 current = State(puzzle, goal)이지만 str을 통해 리스트가 출력되지 않고 그저 state의 주소가 출력됩니다. (str이 정상적으로 실행되지 않는 것 같습니다)

    또한 'State' object has no attribute 'expand' 라는 오류가 출력되는데 오류의 원인을 찾아보았지만 위 코드와는 크게 상관이 없어 보였습니다.. 교수님과 다른 사람들은 정상적으로 실행되는 걸 확인했는데 도대체 왜 안되는 건가요?