После динамического счета - PullRequest
3 голосов
/ 25 июня 2010

У меня почти нет формального обучения по математике, и я столкнулся с небольшой проблемой. Я пытаюсь написать агента, который читает в произвольном (человеческом) счете игрока и набирает очки очень часто. Агент должен «отставать» и «догонять» так часто, чтобы человек-игрок считал, что происходит какое-то соревнование. Затем агент должен либо выиграть, либо проиграть (в зависимости от условий) против человека.

Я испробовал несколько разных техник, в том числе шаткий вероятностный цикл (который ужасно провалился). Я думал, что эта проблема требует чего-то наподобие эмиссионной модели Маркова (HMM), но я не уверен, как ее реализовать (или даже если это лучший подход).

У меня гист вверх, но опять же, это отстой.

Я надеюсь, что функция __main__ даст некоторое представление о цели этого агента. Это будет называться в пигме.

Ответы [ 2 ]

2 голосов
/ 27 июня 2010

Я думаю, вы, возможно, слишком обдумываете это. Вы можете использовать простую вероятность, чтобы оценить, как часто и на сколько оценка компьютера должна «догонять». Кроме того, вы можете рассчитать разницу между оценкой компьютера и оценкой человека, а затем передать ее в сигмоидальную функцию, чтобы определить степень увеличения оценки компьютера.

Иллюстративный Python:

#!/usr/bin/python
import random, math
human_score = 0
computer_score = 0
trials = 100
computer_ahead_factor = 5 # maximum amount of points the computer can be ahead by
computer_catchup_prob = 0.33 # probability of computer catching up
computer_ahead_prob = 0.5 # probability of computer being ahead of human
computer_advantage_count = 0
for i in xrange(trials):
    # Simulate player score increase.
    human_score += random.randint(0,5) # add an arbitrary random amount
    # Simulate computer lagging behind human, by calculating the probability of
    # computer jumping ahead based on proximity to the human's score.
    score_diff = human_score - computer_score
    p = (math.atan(score_diff)/(math.pi/2.) + 1)/2.
    if random.random() < computer_ahead_prob:
        computer_score = human_score + random.randint(0,computer_ahead_factor)
    elif random.random() < computer_catchup_prob:
        computer_score += int(abs(score_diff)*p)
    # Display scores.
    print 'Human score:',human_score
    print 'Computer score:',computer_score
    computer_advantage_count += computer_score > human_score
print 'Effective computer advantage ratio: %.6f' % (computer_advantage_count/float(trials),)
0 голосов
/ 25 июня 2010

Я предполагаю, что человек не может видеть компьютерного агента, играющего в игру.Если это так, вот одна из идей, которые вы можете попробовать.

Создайте список всех возможных комбинаций очков, которые можно набрать за любой данный ход.Для каждого хода найдите диапазон очков, в который вы бы хотели, чтобы агент попал после текущего хода.Сократите набор возможных значений перемещения только до тех значений, которые приводят к завершению оператора в этом конкретном диапазоне, и выберите случайным образом одно из них.Когда условия изменятся в зависимости от того, насколько далеко от вас или вперед вы хотите получить агента, просто измените свой диапазон соответствующим образом.

Если вы ищете что-то с какими-то встроенными и исследованными психологическими эффектами для человека,не могу помочь вам с этим.Вам нужно будет определить для нас больше правил, если вы хотите что-то более конкретное для вашей ситуации, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...