하드웨어 (fpga
)에서 게임 응용 프로그램을 구현하려고합니다. 인식 할 수있는 하드웨어 문제로 인해 함수 재귀를 구현할 수 없습니다. 난 minimax 트리에서 비 재귀 알파 베타 제거 알고리즘을 검색했습니다. 불행히도 적절한 것은 없습니다. 스택 또는 다른 데이터 구조를 사용하여 재귀 문제를 해결하는 알고리즘이나 구현은 인정 될 것입니다.비 재귀 알파 베타 전정 알고리즘
2
A
답변
1
내 알파 - 베타 maximin 코드를 보면 내가 제안이 :이 방법은 다른에 의해 불려
/**
* Returns maximin value of node with alpha-beta pruning for a certain level of forecasting.
*/
double getMaxAlphaBeta(Node currentState, Player player, int level, double alpha, double beta) {
// [ . . . ]
if(player == MAX){
for(State s : currentState.nextStates){
utility = getMaxAlphaBeta(s, MIN, level - 1, alpha, beta);
if (utility > alpha)
alpha = utility;
if (alpha >= beta)
break;
}
}
else{ // [. . .] MIN is playing, do the same things with oppisite sign }
return newBeta;
}
: 하나의 재귀 방법은 다음과 같이 내 알고리즘에있다
이 같은 방법은 :
public Action getMinimaxStrategy(Node currentState, Player player, int level) {
double max = this.getMaxAlphaBeta(currentState, player, level, -inf, +inf);
// [ . . . ]
내가 뭘 할 것은 이런 일에 두 번째 방법을 변경하는 것입니다 :
,public Action getMinimaxStrategy(Node currentState, Player player, int level) {
DATA max = new DATA(currentState);
for(!max.isOptimal){
Array<Node> nextNodes = max.currentState.getNextNodes();
for(Node max.s : nextNodes){
max = this.getMaxAlphaBeta(currentState, player, level, currentAlpha, currentBeta);
// [ . . .]
}
}
// [ . . . ]
여기서 DATA는 재귀 인수 (현재 상태, 플레이어, 레벨, 알파, 베타)와 최적 성 (재귀에서 반환 할 조건)으로 모두 전달하는 데이터 구조입니다.
그런 다음 동일한 논리를 사용하여 첫 번째 방법을 수정할 수 있습니다. 이 솔루션은 최적화 될 수 있으며 시도하지 않았습니다.
원한다면 사용해보십시오. 좋은지 말해보세요.
귀하의 환경에서 셀 수 또는 미리 정의 된 스택을 사용할 수 있습니까? 아마도 배열의 수단일까요? 개념적으로 재귀 없이는 수행 할 수 없습니다. 어떤 언어를 사용할 수 있습니까? – Codor
예 스택을 사용할 수 있습니다. 개념적으로 모든 재귀 함수는 컴파일러가 프로그램 스택에서이 작업을 수행하는 방식으로 자체 제작 스택으로 구현 될 수 있습니다! c/C++가 더 적절하지만 알고리즘이 요지입니다. – muradin
좋아, 너는 시작할 수있는 미니 맥스 알고리즘을 구현 했니? 그렇다면 문제는 주로 스택을 사용하여 재귀를 구현하는 것이지만 특정 구현을 언급하지 않고서는 약간 어렵습니다. 게다가, 호출 인수뿐만 아니라 리턴 값도 처리해야합니다. – Codor