Круговой турнир

Следуя идеологии коллективного разума, надо было бы проверять пригодность программ в игре против людей и соответственно проводить эволюцию. Было бы замечательно учесть при разработке «умной» программы поведение тысяч людей. Но при большой популяции и многих поколениях пришлось бы сыграть десятки тысяч игр, в большинстве своем с очень слабыми противниками. На практике это нереализуемо, поэтому сначала мы разовьем программы, заставив их состязаться друг с другом на турнире.

Функция tournament принимает на входе список игроков и организует игру каждого из них со всеми другими, отслеживая, сколько раз каждая программа проиграла. За проигрыш программе начисляется два очка, за ничью – одно. Добавьте эту функцию в файл gp.py:

def tournament(pl):

#       Массив для подсчета проигрышей losses=[0 for p in pl]

#       Каждый игрок встречается со всеми другими for i in range(len(pl)):

for j in range(len(pl)): if i==j: continue

#       Кто выиграл?

winner=gridgame(,pl[j]])

#       Два очка за поражение, одно за ничью if winner==0:

losses[]]+=2 elif winner==1: losses[i]+=2 elif winner==-1: losses[i]+=1 losses[i]+=1 pass

#       Отсортировать и вернуть результаты z=zip(losses,pl)

z.sort( ) return z

В конце функция сортирует результаты и возвращает их вместе с программами, которые потерпели меньше всего поражений. Именно эта информация необходима функции evolve, чтобы организовать эволюцию, поэтому функция tournament может использоваться в качестве аргумента evolve, следовательно, у нас все готово для выбора программы- победителя. Выполните в интерактивном сеансе следующие команды (на это может уйти заметное время): >>> reload(gp) <module ‘gp’ from ‘gp.py’>

>>> winner=gp.evolve(5,100,gp.tournament,maxgen=50) Обратите внимание, что в ходе эволюции числа не убывают монотонно, как было при поиске математической функции. Подумайте, чем это можно объяснить, – ведь мы же отбираем в следующее поколение лучшего игрока, не так ли? Но поскольку следующее поколение целиком состоит из новых эволюционировавших программ, то лучший игрок прошлого поколения может проявить себя гораздо хуже в следующем.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100