Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм шахматной игры, вот настоящий образец ИИ 
:(
    Опции темы
Cashey
  Дата 16.6.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Все знают мощные шахматные программы: ChessMaster, Frith, ну и конечно же известнейший Deep Blue. А многие даже сами умеют играть в шахматы smile
Но вот кто знает, как научить компьютер играть в шахматы?
Ведь что такое шахматная игра? Это анализ позиции, просчет ходов с анализом будующих позиций в огромном количестве. Как объяснить компьютеру, что эта позиция лучше той, когда это не очевидно самому? Это и хранение, а главное быстрый доступ к большому количеству данных. 
А что такое ИИ? Если не самообущающаяся система? А разве можно научится играть в шахматы если постоянно не обучатся? не запоминать новые позиции, новые решения?
Кто может предложить эффективный алгоритм шахматной игры? Кто сможет сделать этот первый шаг к созданию искуственного интеллекта?
Мне лично пока не удалось..... smile  


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
DragonFire
Дата 16.6.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



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


--------------------
PM MAIL ICQ   Вверх
Cashey
Дата 16.6.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Программка на Паскале есть и в книжках. Интересно не научить программу фигуры двигать, а научить ее думать smile 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
DragonFire
Дата 16.6.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Ну вот она и думала - ты с компом типо играл... кстати достаточно неплохо он ходил, пока глюк с ним не происходил... 


--------------------
PM MAIL ICQ   Вверх
Helicopterr
Дата 17.6.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: нет
Всего: 3



Cashey тебе известна игра сёги? Знаешь почему нет программ которые достойно играли бы в сёги? Число возможных вариантов в митльшпиле сёги на 360 порядков больше, чем в шахматах. Шахматные ИИ - это алгоритмы кот. сокращают число вариантов для перебора, отбрасывая плохие. Т.е. в основе метод перебора, как ни крути. По сути дела это никакой не ИИ. 


--------------------
people can fly
PM MAIL   Вверх
DragonFire
Дата 17.6.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



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


--------------------
PM MAIL ICQ   Вверх
DragonFire
Дата 18.6.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Вот, нашел какой то свой старый архив (только я не уверен что это вообще работает - среда Turbo Pascal 7.0) - привожу кусок, отвечающий за ИИ. По кускам)
Для 12 летнего парня помоему нормально  smile 
Код

{THINK-ДУМАЙ}
            procedure think;
            label l2,ataka1,notataka1,ataka2,notataka2,notataka3,notataka4,ataka4,ataka3a,ataka3b,ataka5;
            begin
                 fillcircle(60,400,4,50);
                 circle(60,400,0,50);
                 shod:=0;
                 xmemori:=x; ymemori:=y;
                 mam:=0;
                 pam;
                 for x:=1 to 8 do begin
                 for y:=8 downto 1 do begin
                 if pole[x,y].k=1 then begin
                    with pole[x,y] do begin
                     if (namber=1) or (namber=2) or (namber=3) or (namber=4) or (namber=5)
                     or (namber=6) or (namber=7) or (namber=8) then begin
                     peshka;
                     peshkas;
                     end;
                     if (namber=10) or (namber=15) or (namber=18) or (namber=23) then begin
                     kone;
                     end;
                     if (namber=11) or (namber=14) or (namber=19) or (namber=22) then begin
                     slon;
                     end;
                     if (namber=9) or (namber=16) or (namber=17) or (namber=24) then begin
                     ladya;
                     end;
                     if (namber=12) or (namber=20) or (namber=21) then begin
                     ferz;
                     end;
                     if (namber=13) then begin
                     korol;
                     end;
                    end;
                 end;


                 if pole[x,y].k=2 then begin
                    with pole[x,y] do begin
                     if (namber=1) or (namber=2) or (namber=3) or (namber=4) or (namber=5)
                     or (namber=6) or (namber=7) or (namber=8) then begin
                     peshka_blak;
                     end;
                     if (namber=10) or (namber=15) or (namber=18) or (namber=23) then begin
                     kone_blak;
                     end;
                     if (namber=11) or (namber=14) or (namber=19) or (namber=22) then begin
                     slon_blak;
                     end;
                     if (namber=9) or (namber=16) or (namber=17) or (namber=24) then begin
                     ladya_blak;
                     end;
                     if (namber=12) or (namber=20) or (namber=21) then begin
                     ferz_blak;
                     end;
                     if (namber=13) then begin
                     korol_blak;
                     end;
                    end;
                 end;
                 end;
                 end;
                 mam:=1;
                 pam;

            {алгоритм}
                   for x:=1 to 8 do begin
                   for y:=8 downto 1 do begin
                       if (pole[x,y].namber=13) and (pole[x,y].k=2) then begin
                       {если фигура-король черный}
                          for h:=1 to 60 do begin
                          for n:=1 to 24 do begin
                            for x2:=1 to 8 do begin
                            for y2:=8 downto 1 do begin
                                if (pole[x2,y2].namber=n) and (pole[x2,y2].k=1) then goto ataka1
                            end;
                            end;
                            goto notataka1;
                            ataka1:
                              if (hods[h,n,1].x1=x) and (hods[h,n,1].y1=y) and (hod[h,n,1]=ok) then begin
                              {если на него нападают}
                              {pp}outtextxy(450,20,4,'ataka1');
                              for h1:=1 to 60 do begin
                              for n1:=1 to 24 do begin
                                  for i:=1 to 8 do begin
                                  for j:=8 downto 1 do begin
                                     if (hods[h1,n1,2].x1=i) and (hods[h1,n1,2].y1=j) and (pole[i,j].k=1)
                                     and (hod[h1,n1,2]=ok) and (pole[i,j].namber=n) then begin
                                     {определяем какая фигура нападает}
                                        for i1:=1 to 8 do begin
                                        for j1:=8 downto 1 do begin
                                            if (pole[i1,j1].namber=n1) and (pole[i1,j1].k=2) then begin
                                            {находим фигуру которая может съесть наподающюю фигуру}
                                               {if ((n1=1) or (n1=2) or (n1=3) or (n1=4) or (n1=5) or (n1=6) or(n1=7)or(n1=8))
                                               and (pole[i1,j1].onego0) and ((h1=1) or (h1=2)) then goto notataka1;}
                                               pole[i,j].namber:=n1;
                                               pole[i,j].k:=2;
                                               pole[i,j].onego:=pole[i1,j1].onego+1;
                                               pole[i1,j1].k:=0;
                                               pole[i1,j1].namber:=0;
                                               shod:=1;
                                               goto l2;
                                            {переставляем}
                                               {pp}
                                               outtextxy(600,10,15,ssk1);
                                               outtextxy(600,20,15,ssk2);
                                               str(i1,ssk1);
                                               str(j1,ssk2);
                                               outtextxy(600,10,4,ssk1);
                                               outtextxy(600,20,4,ssk2);
                                               outtextxy(550,10,15,sskk1);
                                               outtextxy(550,20,15,sskk2);
                                               str(i,sskk1);
                                               str(j,sskk2);
                                               outtextxy(550,10,4,sskk1);
                                               outtextxy(550,20,4,sskk2);
                                            end;
                                        end;
                                        end;
                                  end;
                                  end;
                                  end;
                              end;
                              end;
                              mam:=2;
                              pam;
                                     for h2:=1 to 8 do begin
                                     for h3:=1 to 60 do begin
                                     for n3:=1 to 24 do begin
                                     if (hods[h2,13,2].x10) and (hods[h2,13,2].y10) then begin
                                     if (hods[h2,13,2].x1hods[h3,n3,1].x1)
                                     and (hods[h2,13,2].y1hods[h3,n3,1].y1)
                                     and (hod[h2,13,2]=ok) and (hod[h3,n3,1]=ok) then begin
                                     {определяем путь отхода}
                                                 with hods[h2,13,2] do begin
                                                 pole[x1,y1].namber:=13;
                                                 pole[x1,y1].k:=2;
                                                 pole[x1,y1].onego:=pole[x,y].onego+1;
                                                 pole[x,y].k:=0;
                                                 pole[x,y].namber:=0;
                                                 end;
                                                 {pp}
                                                 outtextxy(600,10,15,ssk1);
                                                 outtextxy(600,20,15,ssk2);
                                                 str(hods[h2,13,2].x1,ssk1);
                                                 str(hods[h2,13,2].y1,ssk2);
                                                 outtextxy(600,10,4,ssk1);
                                                 outtextxy(600,20,4,ssk2);
                                                 outtextxy(550,10,15,sskk1);
                                                 outtextxy(550,20,15,sskk2);
                                                 str(x,sskk1);
                                                 str(y,sskk2);
                                                 outtextxy(550,10,4,sskk1);
                                                 outtextxy(550,20,4,sskk2);

                                                 {pp}
                                                     outtextxy(400,10,15,sss1);
                                                     outtextxy(400,20,15,sss2);
                                                     str(hods[h2,13,2].x1,sss1);
                                                     str(hods[h2,13,2].y1,sss2);
                                                     outtextxy(400,10,4,sss1);
                                                     outtextxy(400,20,4,sss2);
                                                     outtextxy(420,10,15,sss1);
                                                     outtextxy(420,20,15,sss2);
                                                     str(hods[h2,13,2].x1,sss1);
                                                     str(hods[h2,13,2].y1,sss2);
                                                     outtextxy(420,10,4,sss1);
                                                     outtextxy(420,20,4,sss2);

                                                 goto l2;
                                            {переставляем}

                                     end;
                                     end;
                                     end;
                                     end;
                                     end;
                              end
                              else begin
                              {pp}outtextxy(450,20,15,'ataka1');
                              end;
                            notataka1:
                          end;
                          end;
                      end;
                   end;
                   end;
                   mam:=3;
                   pam;              
                                               

Так влезла где-то 1/4 процедуры, иначе говорит что слишком большое сообщение, ну и ладно, приложу весь файл, не уверен тока что скомпелируется, но вроде должен)
 

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  ACHES3.rar 8,07 Kb


--------------------
PM MAIL ICQ   Вверх
dereyly
Дата 18.6.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 2
Всего: 4



Да я вот тоже думал как сделать обучаемую программу, те же шахматы...

Рассмотрим партию в шахматы как поиск в пространстве состояний, 1й ход порождает 10 потомков, наверное идеей метода шахмотных програм запомнить партии и использовать их как наиболее вероятные состояния в дереве состоянийесли позиция на доске совподает с канонической то выбираем один из возможных вариантов из БД (БЗ), но фигня в том что состояний бесчисленно много и точного совпадения ждать не приходится поэтому следут
I) По некоторому алгоритму кластерилизовать позицию на доске и рассматривать уже комбинации подсостояний (вот тут уже самою интересное ), что выступает в роли критерия кластеризации:
 а) Набор фигур имеющие атакующе (защитные) связи?
 б) Король и его степень свободы
 (стоит ли  вводить степень свободы для всех фигур?)
И вообще как коомбинировать кластеризованную позицию, тоже по графу состояний?

II) Сравнивать целые позиции по каккому нибудь критерию идентичности позиция с наибольшим критерием (весом) является продолжением хода...  

Это сообщение отредактировал(а) dereyly - 18.6.2006, 17:46
PM MAIL   Вверх
Fin
Дата 18.6.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Очень давно читал статейку. Поэтому имена и даты не помню. Помню только идею. Какие коэфиценты брать, чтобы оценивать ту или иную ситуацию партии. 
Брали две одинаковые программы. В одной жестко задавали коэфиценты. У второй коэфиценты мутировали в самом начале серии партий. Обыгрывалось 10 партий. Если программа с мутированными  коэфицентами выигрывала серию, то эти коэфиценты переписывались в первую программу. Если проигрывала, то линия мутации отбрасывалась. И так продолжалось по циклу.    

Это сообщение отредактировал(а) Fin - 18.6.2006, 18:11


--------------------
Пролетал мимо.
PM MAIL   Вверх
Cashey
Дата 21.6.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(Helicopterr @  17.6.2006,  01:17 Найти цитируемый пост)
Шахматные ИИ - это алгоритмы кот. сокращают число вариантов для перебора, отбрасывая плохие. Т.е. в основе метод перебора, как ни крути. По сути дела это никакой не ИИ. 

Совершенно верно, но почему не создать анализирующий, самообучающийся алгоритм? задача не тревиальная и до сих пор ни кем не реализованная.  smile  


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
DragonFire
Дата 21.6.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Цитата(Cashey @  21.6.2006,  21:53 Найти цитируемый пост)
 и до сих пор ни кем не реализованная. 

а ты уверен?
 


--------------------
PM MAIL ICQ   Вверх
Romikgy
Дата 22.6.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Имхо самое главное во всех алгоритмах критерий по которому определять , хорош ход будет или нет, вот как его определить? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
unicuum
Дата 30.6.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(Cashey @  16.6.2006,  21:49 Найти цитируемый пост)
Программка на Паскале есть и в книжках. Интересно не научить программу фигуры двигать, а научить ее думать   

Цитата(Cashey @  21.6.2006,  21:53 Найти цитируемый пост)
Совершенно верно, но почему не создать анализирующий, самообучающийся алгоритм? задача не тревиальная и до сих пор ни кем не реализованная. 


Я во что думаю, программа, когда перебирает варианты, в некотором роде мыслит. Да у неё нет внешних рецепторов, если рассматривать шахматы. И её алгоритм, скорее всего линейный и основан на примитивном переборе. Но вот возьмём реальность, те же самые вирусы, они ведь не живые и думать не умеют, а зато как могут изгадить жизнь органического существа. А в чём их отличие от человека или на худой конец животного? Ведь изначальный принцип органики один и тот же – углерод, водород, азот, кислород и так далее. Всё это находится в воде или как-нибудь иначе, но ведь некоторые высокоорганизованные формы жизни научились запоминать правильные или не правильные решения и на основе этого делать выводы, действовать. Причём каждый раз рассматриваются варианты находящиеся в центральной нервной системе, у человека это головной мозг.
Человека можно осмыслить, его можно понять, можно предсказать как он будет действовать в той или иной ситуации, те же шахматы, но он лишь один из носителей разума и я не то чтобы не согласен, что человеческий разум нельзя повторить в программах, я считаю что лучше потратить усилия на более высший по скорости и принятию правильных решений ИК. Стоит отметить, что для одних носителей разума решения правильной, а для других этот же самый вариант нет, но вот применительно к шахматам это правило не действует. В шахматах главное победа.
К примеру, если уж речь зашла именно об ИК, то, безусловно, он должен самообучаться. Если ИК ознакомить с правилами игры, пусть даже и насильно, то есть прямым вводом в его электронные мозги и ввести цель, которую он должен добиться, то есть определённое стечение обстоятельств называемую победой и при всём при этом программа ИК сама выработает оптимальный (самый лучший в данных обстоятельствах) алгоритм действий, то в таком случае он уже будет обладать половиной необходимого для полноценного разума свойствами. А именно – решение поставленной задачи. Второе свойство называют силой воли, это то, что заставляет разум действовать самостоятельно исходя из текущих потребностей. 


--------------------
user posted image
обычный день на винграде
PM   Вверх
bankuss
Дата 14.7.2006, 13:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



насчет шахмат заходите сюда http://immortal223.fastbb.ru/  и сюда http://kasparovchess.crestbook.com/

Добавлено @ 13:33 
сам отвечу так - в шахматных программах нет ИИ.
там простой перебор с оценкой получившейся позиции.
чем глубже перебор и точнее оценка, тем сильнее играет программа. + насколько она хорошо умеет "резать" плохие ходы.
самообучение реализовано только в дебютной библиотеке: если некий вариант, разыгрываемый программой привел несколько раз к поражению, то оценка хода, ведущего к этому вариатну уменьшается и уже в следующей партии программа этот ход не выберет.
эндшпили 3-4-5 фигурные уже просчитали до конца - тут программа играет без ошибок, она точно знает какой ход ведет к победе или сохраняет ничью. потихоньку обсчитываются 6-ти фигурные эндшпили - но это очень трудоемкая задача! на данный момент обчитана едва ли половина и она уже занимает в сжатом виде порядка 80Гб!!! (5-ти фигурные 20Гб) но это реально усиливает игру машины в окончаниях и переходе из миттельшпиля в эндшпиль, так что игра стоит свеч (хоть и таким грубым способом).

я сам являюсь автором движка ALChess - сделал чисто из любопытства, поэтому сильной программы не получилось (сейчас думаю переделывать и улучшать) играет на 1 разряд примерно. 
PM MAIL   Вверх
Romikgy
Дата 14.7.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(bankuss @  14.7.2006,  12:23 Найти цитируемый пост)
с оценкой получившейся позиции.

как происходит оценка? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.