как я могу изменить поведение или функцию в зависимости от значений, переданных ей - PullRequest
1 голос
/ 03 февраля 2020

поэтому у меня есть эти две функции, одна называется min, а другая называется max. min ищет минимум, который он может получить, начиная с POSITIVE_INFINITY, а максимум начинается с NEGATIVE_INFINITY и пытаясь найти максимальное значение.

private Node Max(State node, int depth, double max, double beta, Player player) {

        if(node.searchLimitReached() || node.over || depth <= 0)
            return new Node(node , heuristic(node, player));

        double value = Double.NEGATIVE_INFINITY;
        Node nextNode = new Node();
        Node bestNode = new Node();
        Iterator<State> iterator = node.next().iterator();

        while(!node.searchLimitReached() && iterator.hasNext()) {

            nextNode = Min(iterator.next(), depth-1, max, beta, player);
            if(nextNode.value > value) {
                value = nextNode.value;
                bestNode = nextNode;
            }

            if(value >= beta)
                return bestNode;

            max = Math.max(max, value);

        }
        return bestNode;
    }
    private Node Min(State node, int depth, double alpha, double min, Player player) {

        if(node.searchLimitReached() || node.over || depth <= 0)
            return new Node(node, heuristic(node, player));

        double value = Double.POSITIVE_INFINITY;
        Node nextNode = new Node();
        Node bestNode = new Node();
        Iterator<State> iterator = node.next().iterator();

        while(!node.searchLimitReached() && iterator.hasNext()) {
            nextNode = Max(iterator.next(), depth-1, alpha, min, player);

            if(nextNode.value < value) {
                value = nextNode.value;
                bestNode = nextNode;
            }

            if(value <= alpha)
                return bestNode;

            min = Math.min(min, value);
        }
        return bestNode;
    }

Мне кажется, что оба метода похожи во многих аспектах и ​​желательны чтобы превратить в одну функцию, которая ведет себя по-разному в зависимости от передаваемого ей значения,

Я пробовал многие вещи безуспешно и задавался вопросом, есть ли у кого-нибудь хорошая идея о том, как подойти к этой ситуации.

1 Ответ

2 голосов
/ 03 февраля 2020

Я думаю, вы могли бы попробовать что-то вроде этого (я не проверял код Java):

private Node Extreme(State node, int depth, double a, double b, Player player, boolean which) {
  if(node.searchLimitReached() || node.over || depth <= 0)
      return new Node(node, heuristic(node, player));

  double value = which ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
  Node nextNode = new Node();
  Node bestNode = new Node();
  Iterator<State> iterator = node.next().iterator();

  while(!node.searchLimitReached() && iterator.hasNext()) {
      nextNode = Extreme(iterator.next(), depth-1, a, b, player, !which);
      if(which && nextNode.value > value || !which && nextNode.value < value) {
          value = nextNode.value;
          bestNode = nextNode;
      }

      if(which && value >= b || !which && value <= a)
          return bestNode;

      if (which) a = Math.max(a, value);
      else b = Math.min(b, value);
  }
  return bestNode;
}

Обратите внимание на переменную which; если это true, минимум возвращается, а максимум - иначе.

Однако я бы посоветовал вам никогда не звонить Extreme напрямую (так как это было бы неестественно), а скорее переопределять данные данные. функционирует следующим образом:

private Node Min(State node, int depth, double max, double beta, Player player) {
  return Extreme(node, depth, max, beta, player, true);
}

private Node Max(State node, int depth, double alpha, double min, Player player) {
  return Extreme(node, depth, alpha, min, player, false);
}

и вызывает их.

...