게임 트리를 분석하는 함수를 작성하려고합니다. 트리는 각 하위 목록이 분기를 나타내는 중첩 된 목록으로 표시됩니다. 기본적으로 알아 내고 싶은 두 가지가 있습니다.Scheme/Racket/Lisp의 중첩 목록에 대한 Minimax 연산?
- 중첩 목록의 최소값은 얼마입니까?
- 해당 값의 색인은 무엇입니까?
나는 첫 번째 문제를 대부분 해결했다고 생각했지만 코드는 잘못된 값을 반환합니다. 나는 모든 것을 검사했고 내가 잘못 한 것을 볼 수 없습니다.
도움을 주시면 감사하겠습니다.
;MINIMAX*
(define minimax*
(lambda (l operation hilo)
(cond
((null? l) hilo)
((equal? operation 'max)
(cond
((null? (cdr l)) (if
(list? (car l))
(minimax* (car l) 'min hilo)
(if
(> (car l) hilo)
(car l)
hilo)))
(else (if
(list? (car l))
(if
(> (minimax* (car l) 'min hilo) hilo)
(minimax* (cdr l) 'max (minimax* (car l) 'min hilo))
(minimax* (cdr l) 'max hilo))
(if
(> (car l) hilo)
(minimax* (cdr l) 'max (car l))
(minimax* (cdr l) 'max hilo))))))
((equal? operation 'min)
(cond
((null? (cdr l)) (if
(list? (car l))
(minimax* (car l) 'max hilo)
(if
(< (car l) hilo)
(car l)
hilo)))
(else (if
(list? (car l))
(if
(< (minimax* (car l) 'max hilo) hilo)
(minimax* (cdr l) 'min (minimax* (car l) 'max hilo))
(minimax* (cdr l) 'min hilo))
(if
(< (car l) hilo)
(minimax* (cdr l) 'min (car l))
(minimax* (cdr l) 'min hilo))))))
(else (error "Invalid operation type, must be 'max or 'min")))))
먼저 할 수있는 한 가지 방법은 코드를 단순화하는 것입니다. Racket에는 목록의 최소 및 최대 요소를 반환하는 'argmin' 및'argmax' 함수가 있으므로 직접 작성하지 않아도됩니다. 함수로 직접 사용하기 위해'min'과'max'도 있습니다. 알파 베타 프 루닝보다는 미니 맥스 알고리즘을 수행하는 경우 훨씬 단순한 재귀'map' 연산을 사용하여 함수를 작성할 수 있습니다. –
또는 레코드와 같은 다른 데이터 구조를 사용하십시오. – Sebastian
일부 입력 및 예상 출력 값의 예를 게시 한 경우 도움이됩니다. – soegaard