Крестики Нолики (Алгоритм проверки перекрестий)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

/dev/random писал(а):
05.05.2010 18:02
BratSinot писал(а):
05.05.2010 17:58
А БЕЗ этого?

Вручную проверять все "хорошие" и "нехорошие" положения. К примеру, в первом случае будет не "i<=6", а "i == 0 || i == 3 || i == 6".
Да, это превратится в головную боль при использовании большого поля. Но ничего не поделаешь, вы сами выбрали работу с одномерным массивом.

Блин... Теперь всю прогу переписывать придется.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Крестики Нолики

Сообщение NickLion »

Пересчитать координаты - строка = i / width; колонка = i % width; и проверять эти координаты.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

NickLion писал(а):
05.05.2010 19:35
Пересчитать координаты - строка = i / width; колонка = i % width; и проверять эти координаты.

Лучше заново написать.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
05.05.2010 16:42
С каких это пор комбинаторика -- не математика?

ну я про "не математический подход".
t.t писал(а):
05.05.2010 16:42
А вот тут Вы явно усложняете. Для 3x3 есть как беспроигрышная стратегия для второго игрока, так и выигрышная для первого (если второй первым ходом допустил ошибку). Причём обе они весьма просты.

моя программа будет проще и короче. спорим? (: хотя и будет использовать немерено памяти... и времени конечно (для нахождения стратегии) мало того, она будет работать не всегда...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

drBatty писал(а):
05.05.2010 21:07
t.t писал(а):
05.05.2010 16:42
А вот тут Вы явно усложняете. Для 3x3 есть как беспроигрышная стратегия для второго игрока, так и выигрышная для первого (если второй первым ходом допустил ошибку). Причём обе они весьма просты.

моя программа будет проще и короче. спорим? (: хотя и будет использовать немерено памяти... и времени конечно (для нахождения стратегии) мало того, она будет работать не всегда...

Мой АИ невозможно выиграть 3х3. Поэтому 3х3 это фигня. Выигрывает тот кто ходит первым, и то при условии что опонент недоразвитый.
По мне идеальный вариант это поле 10х10 и по 5 в ряд. Или по 4 в ряд, я пока еще не решил.

P.S. А переписать прогу было не сложно. Replace правит миром =)

Вообщем переписал прогу на двумерный массив. Сделал вещь типа:

Код: Выделить всё

for((*tempx)=0; (*tempx)!=2; (*tempx)++)
 for((*tempy)=0; (*tempy)!=2; (*tempy)++)
 {
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx][*tempy+1]=='X'&&sk[*tempx][*tempy+2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx+1][*tempy]=='X'&&sk[*tempx+2][*tempy]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx+1][*tempy+1]=='X'&&sk[*tempx+2][*tempy+2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx-1][*tempy-1]=='X'&&sk[*tempx-2][*tempy-2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
 }

Замечания будут? Или все нормально?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Крестики Нолики

Сообщение /dev/random »

BratSinot писал(а):
05.05.2010 21:36
По мне идеальный вариант это поле 10х10 и по 5 в ряд. Или по 4 в ряд, я пока еще не решил.

Для 4 в ряд тоже существует выигрышная стратегия для первого игрока. Причём при большом поле она не просто беспроигрышная, а именно выигрышная. А вот 5 в ряд - это уже нормально. По правде говоря, единственный нормальный вариант: если брать больше 5, то у обоих появляется гарантированно ничейная стратегия.

BratSinot писал(а):
05.05.2010 21:36
Вообщем переписал прогу на двумерный массив. Сделал вещь типа:

Код: Выделить всё

for((*tempx)=0; (*tempx)!=2; (*tempx)++)
 for((*tempy)=0; (*tempy)!=2; (*tempy)++)
 {
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx][*tempy+1]=='X'&&sk[*tempx][*tempy+2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx+1][*tempy]=='X'&&sk[*tempx+2][*tempy]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx+1][*tempy+1]=='X'&&sk[*tempx+2][*tempy+2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
  if(sk[*tempx][*tempy]=='X'&&sk[*tempx-1][*tempy-1]=='X'&&sk[*tempx-2][*tempy-2]=='X') {printf("X WIN\n"); fprintf(fp, "X WIN\n"); esh=0;}
 }

Замечания будут? Или все нормально?

Нет, не нормально. Вы опять не проверяете выход за пределы.
В первом случае в начало нужно добавить условие tempx<=N-M (N=3 - размер поля, M=3 - знаков в ряд), во втором tempy<=N-M, в третьем оба, в четвёртом... А в четвёртом у вас вообще ошибка.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

eddy писал(а):
05.05.2010 17:01
t.t писал(а):
05.05.2010 16:42
Для 3x3 есть как беспроигрышная стратегия для второго игрока, так и выигрышная для первого (если второй первым ходом допустил ошибку). Причём обе они весьма просты.
Вот именно, что 3х3 неинтересно. А вот если взять поле, скажем, 10^6x10^6, да рассматривать выигрышными только линии, длиннее, скажем, 10^4 крестиков или ноликов, то задача будет намного интереснее. И простым тупым перебором компьютер будет думать ооочень долго (не при определении, выиграл ли противник, а при выборе, куда поставить свой значок).
Вот мне и интересно: неужели еще нет математического метода решения подобных задач?
Не будет она интереснее. И думать он долго не будет. Для рядов больше пяти существует беспроигрышная стратегия для обоих игроков. Т.е. игра между двумя компьютеными игроками всегда будет заканчиваться вничью. Именно поэтому существует только игра "пять в ряд", но нет игр "шесть в ряд" и т.д.: не потому что "еще нет математического метода решения", а потому что он давно есть.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

BratSinot писал(а):
05.05.2010 17:58
/dev/random писал(а):
05.05.2010 17:51
Использовать ДВЕ координаты (x и y), а не одну (i)
А БЕЗ этого?
Если Вы хотите преодоьлевать искусственные сложности, то преодолевайте их своими силами. Если Вы хотите посторонней помощи, то не отказывайтесь так настойчиво от советов использовать простые решения.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
05.05.2010 21:07
t.t писал(а):
05.05.2010 16:42
А вот тут Вы явно усложняете. Для 3x3 есть как беспроигрышная стратегия для второго игрока, так и выигрышная для первого (если второй первым ходом допустил ошибку). Причём обе они весьма просты.
моя программа будет проще и короче. спорим? (: хотя и будет использовать немерено памяти... и времени конечно (для нахождения стратегии) мало того, она будет работать не всегда...
Программа, которая будет работать медленно, прожорливо и не всегда, будет проще и короче, чем полная реализация точной выигрышной стратегии? О чём тут спорить? (: Уберите хотя бы "не всегда" -- будет хоть какой-то предмет для разговора.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

/dev/random писал(а):
05.05.2010 22:27
Нет, не нормально. Вы опять не проверяете выход за пределы.
В первом случае в начало нужно добавить условие tempx<=N-M (N=3 - размер поля, M=3 - знаков в ряд), во втором tempy<=N-M, в третьем оба, в четвёртом... А в четвёртом у вас вообще ошибка.

Чего? Если будет N-M, оно будет 0 равняется, т.к. N==M==3.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 07:46
Программа, которая будет работать медленно, прожорливо и не всегда, будет проще и короче, чем полная реализация точной выигрышной стратегии? О чём тут спорить? (: Уберите хотя бы "не всегда" -- будет хоть какой-то предмет для разговора.

не уберу. все уже много лет успешно используют ГА. они проще. а часто - решение находится намного быстрее, и оно иногда более оптимальное, чем выбранное "чистым математическим подходом". Особенно это проявляется в таких задачах -
"чисто-математический" подход является источником сложно-выявляемых ошибок, как у нашего ТС. А если решить задачу более простым способом - ошибок было-бы меньше. В данном конкретном случае объём памяти и быстродействие не играет никакой роли, а вот алгоритмические ошибки - играют...

И ещё почему не уберу: все уже много лет используют qsort, не смотря на то, что она иногда жутко тупит, тормозит, и переполняет стек (что ведёт к сбоям, зависаниям, и даже к уязвимостям). многие просто об этом не знают (:
А в большинстве практических случаев - это просто, надёжно, и быстро.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 12:08
t.t писал(а):
06.05.2010 07:46
Программа, которая будет работать медленно, прожорливо и не всегда, будет проще и короче, чем полная реализация точной выигрышной стратегии? О чём тут спорить? (: Уберите хотя бы "не всегда" -- будет хоть какой-то предмет для разговора.
не уберу. все уже много лет успешно используют ГА. они проще. а часто - решение находится намного быстрее, и оно иногда более оптимальное, чем выбранное "чистым математическим подходом". Особенно это проявляется в таких задачах -
"чисто-математический" подход является источником сложно-выявляемых ошибок, как у нашего ТС. А если решить задачу более простым способом - ошибок было-бы меньше. В данном конкретном случае объём памяти и быстродействие не играет никакой роли, а вот алгоритмические ошибки - играют...

И ещё почему не уберу: все уже много лет используют qsort, не смотря на то, что она иногда жутко тупит, тормозит, и переполняет стек (что ведёт к сбоям, зависаниям, и даже к уязвимостям). многие просто об этом не знают (:
А в большинстве практических случаев - это просто, надёжно, и быстро.
Есть категория задач, где реализация существующего алгоритма по определению проще, чем метод перебора. Крестики-нолики как раз из таких задач. А алгоритмические проблемы топикстартера проистекают исключительно из им же придуманной искусственной сложности: использования одномерного массива для двумерной задачи. А Ваше допущение "будет работать не всегда" для задачи, которая решается для любого случая даже на забытых ныне программируемых калькуляторах, выглядит немного смешно. Равно как и сравнение с qsort.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 12:25
А Ваше допущение "будет работать не всегда" для задачи, которая решается для любого случая даже на забытых ныне программируемых калькуляторах, выглбядит немного смешно. Равно как и сравнение с qsort.

согласен... но у меня вообще-то не перебор, как раз перебор - у вас. перед написанием алгоритма вы перебрали все варианты, и свели их все к нескольким случаям. Ваш алгоритм как раз и базируется на переборе. В данной задаче вовсе нет никакой стратегии, у вас просто заранее заготовленные ходы, которые дают верное решение. В данном случае вариантов мало, и этот подход даёт результаты. В других случаях нужна именно стратегия, куда и как делать ходы (в зависимости от ситуации, которая может быть и неизвестной при написании программы). Метод случайного выбора с историей (вероятность выбора зависит от прошлых исходов) даёт результат даже в неизвестных ситуациях - мой алгоритм всегда сделает какой-то ход, пусть даже и не оптимальный. Ваш алгоритм не сможет справится с неизвестной задачей - он "чисто-математический".
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 12:25
А алгоритмические проблемы топикстартера проистекают исключительно из им же придуманной искусственной сложности: использования одномерного массива для двумерной задачи.

с двухмерными тоже не очень (:

для ТС: чтение из массива с выходом за границу может привести (по стандарту) к чему угодно. например к форматированию всех жёстких дисков (: Это язык такой... Что Си, что Си с плюсами... Нужно либо менять язык, либо проверять, либо создать такой алгоритм, который заведомо не выйдет за границу...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 12:36
t.t писал(а):
06.05.2010 12:25
А Ваше допущение "будет работать не всегда" для задачи, которая решается для любого случая даже на забытых ныне программируемых калькуляторах, выглбядит немного смешно. Равно как и сравнение с qsort.
согласен... но у меня вообще-то не перебор, как раз перебор - у вас. перед написанием алгоритма вы перебрали все варианты, и свели их все к нескольким случаям. Ваш алгоритм как раз и базируется на переборе.
Не совсем так. Впрочем, подробное объяснение этого алгоритма мне кажется уже избыточным для этой темы.

drBatty писал(а):
06.05.2010 12:36
В данной задаче вовсе нет никакой стратегии, у вас просто заранее заготовленные ходы, которые дают верное решение. В данном случае вариантов мало, и этот подход даёт результаты. В других случаях нужна именно стратегия, куда и как делать ходы (в зависимости от ситуации, которая может быть и неизвестной при написании программы). Метод случайного выбора с историей (вероятность выбора зависит от прошлых исходов) даёт результат даже в неизвестных ситуациях - мой алгоритм всегда сделает какой-то ход, пусть даже и не оптимальный. Ваш алгоритм не сможет справится с неизвестной задачей - он "чисто-математический".
С точки зрения научной терминологии это всё равно стратегия; даже если её разработка базировалась на переборе всех возможных исходов (как в случае 3x3; но стратегия существует и для "пять в ряд"). Но суть не в этом. Одно из неотъемлемых свойств стратегии (по определению, именно как научного термина) -- полнота, т.е. принципиальное отсутствие неразрешимых позиций. Если такие позиции возможны, это не стратегия. Поэтому в сложных играх (например, в шахматах или го) стратегии не существует. И соответственно, если Вы уже заговорили о вероятнростном методе с памятью предыдущих исходов, то по сравнению с ним реализация почти любой игровой стратегии будет проще; уж для "пять в ряд" -- точно.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Kopilov
Сообщения: 955
ОС: [K]Ubuntu, Debian

Re: Крестики Нолики

Сообщение Kopilov »

drBatty писал(а):
06.05.2010 12:08
Все уже много лет успешно используют ГА. они проще.

Простите, а что такое ГА в данном контексте? В этом списке, вероятно, отсутствует. Тут подходящей темы тоже не видно.

Наверно, какие-то алгоритмы, но какие?

Вроде, нашёл.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 13:37
Если такие позиции возможны, это не стратегия. Поэтому в сложных играх (например, в шахматах или го) стратегии не существует.

это почему это?! не существует оптимальной стратегии, тут согласен. Но можно с лёгкостью создать допустимую, хотя и не оптимальную - достаточно взять любую, и в случае неразрешимой позиции выбирать случайный ход. Тогда неразрешимых не будет. Или "сделать случайный но допустимый ход" по Вашему - не стратегия? (:
t.t писал(а):
06.05.2010 13:37
И соответственно, если Вы уже заговорили о вероятнростном методе с памятью предыдущих исходов, то по сравнению с ним реализация почти любой игровой стратегии будет проще; уж для "пять в ряд" -- точно.

угу. потому-что вариантов много, и приходится сильно усложнять алгоритм. только в обычных КН можно сделать "в лоб"... Это верно. Я просто хотел сказать, что всегда возможно не только "чистое" решение, и иногда оно даже работает (:

и qsort я тоже потому упомянул - это "грязное" решение, оно тоже работает не всегда. но тем не мение, его используют почти все и почти всегда.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

Kopilov писал(а):
06.05.2010 15:17
Простите, а что такое ГА в данном контексте?

генетические алгоритмы. в данном случае организмами являются решения, например для этой позиции
1|2|3
4|X|6
7|8|9
имеется 8 организмов-ходов. в процессе работы вероятность выживания каждого организма изменяется, и выживают сильнейшие - 1,3,7, и 9. Остальные ведут к проигышу, и потому вымирают. Через какое-то время, наш ГА будет выбирать только сильнейшие ходы, причём с равной вероятностью. ИМХО это очень простой частный случай ГА, на практике всё конечно намного сложнее и запутанее, и требует огромных ресурсов ):
Обычно используется не только вероятность выживания, но и скрещивание, например двуполое, как у нас :)

PS: совсем забыл вставить почти: следует читать: "почти вымирают", "почти всегда" и т.д... Ну и конечно "почти всегда решение находится"... Впрочем, часто вероятность того, что решение НЕ найдётся намного ниже, чем вероятность конца света. Именно потому ГА можно успешно использовать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

/*для ТС: чтение из массива с выходом за границу может привести (по стандарту) к чему угодно. например к форматированию всех жёстких дисков (: Это язык такой... Что Си, что Си с плюсами... Нужно либо менять язык, либо проверять, либо создать такой алгоритм, который заведомо не выйдет за границу...*/
Вы часто видели операционные системы где это легко сделать? Я кроме dos'а не видел.

/dev/random писал(а):
05.05.2010 22:27
Нет, не нормально. Вы опять не проверяете выход за пределы.
В первом случае в начало нужно добавить условие tempx<=N-M (N=3 - размер поля, M=3 - знаков в ряд), во втором tempy<=N-M, в третьем оба, в четвёртом... А в четвёртом у вас вообще ошибка.

Чего? Если будет N-M, оно будет 0 равняется, т.к. N==M==3.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

BratSinot писал(а):
06.05.2010 15:52
Вы часто видели операционные системы где это легко сделать? Я кроме dos'а не видел.

ну это ваши проблемы. точнее проблемы пользователей ваших программ. вы только свой код никому не показывайте...

PS: кстати, в любой другой системе возникнет системное прерывание - обычно странички в памяти просто не существует. и программа аварийно завершится (точнее её ось завершит). Любой пользователь очеровательной и божественной оси с этим прекрасно знаком - "память ХХХХХ не может быть read", и любой пользователь сказал много ласковых и нежных слов таким "разработчикам"... Если вас не волнует мнение своих пользователей - пишите так дальше...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 15:33
t.t писал(а):
06.05.2010 13:37
Если такие позиции возможны, это не стратегия. Поэтому в сложных играх (например, в шахматах или го) стратегии не существует.
это почему это?! не существует оптимальной стратегии, тут согласен. Но можно с лёгкостью создать допустимую, хотя и не оптимальную - достаточно взять любую, и в случае неразрешимой позиции выбирать случайный ход. Тогда неразрешимых не будет. Или "сделать случайный но допустимый ход" по Вашему - не стратегия? (:
Не по-моему, а по определению. Я уже написал, что использую это слово как чёткий научный термин. Также написал, что в определении этого термина присутствует требование полноты. Т.е. "беспроигрышной стратегией" можно назвать набор правил, который _всегда_ приводит к выигрышу либо ничьей, при _любых_ ходах противника. Если есть вероятностный элемент, это не стратегия по определению.

drBatty писал(а):
06.05.2010 15:33
t.t писал(а):
06.05.2010 13:37
И соответственно, если Вы уже заговорили о вероятнростном методе с памятью предыдущих исходов, то по сравнению с ним реализация почти любой игровой стратегии будет проще; уж для "пять в ряд" -- точно.
угу. потому-что вариантов много, и приходится сильно усложнять алгоритм. только в обычных КН можно сделать "в лоб"... Это верно. Я просто хотел сказать, что всегда возможно не только "чистое" решение, и иногда оно даже работает (:

и qsort я тоже потому упомянул - это "грязное" решение, оно тоже работает не всегда. но тем не мение, его используют почти все и почти всегда.
Конечно, "грязное" решение тоже возможно. С этим я и не спорил. Но эта задача -- не тот случай, когда использование такого решения хоть чем-то оправдано.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 15:42
Kopilov писал(а):
06.05.2010 15:17
Простите, а что такое ГА в данном контексте?
генетические алгоритмы. в данном случае организмами являются решения, например для этой позиции
1|2|3
4|X|6
7|8|9
имеется 8 организмов-ходов.
Да не 8, а 2; что же Вы о симметрии всё время забываете? Уж для ГА-то набор элементов всегда пытаются свести к минимуму для повышения эффективности обучения.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Крестики Нолики

Сообщение /dev/random »

BratSinot писал(а):
06.05.2010 15:52
Чего? Если будет N-M, оно будет 0 равняется, т.к. N==M==3.

В данном случае - да. Но вы хотели задел на будущее, чтобы можно было работать с большими полями. К примеру, если на поле 10x10 нужно поставить 5 в ряд, то N-M=5.

Кстати, вы нашли ошибку в четвёртом условии?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

BratSinot писал(а):
06.05.2010 15:52
/*для ТС: чтение из массива с выходом за границу может привести (по стандарту) к чему угодно. например к форматированию всех жёстких дисков (: Это язык такой... Что Си, что Си с плюсами... Нужно либо менять язык, либо проверять, либо создать такой алгоритм, который заведомо не выйдет за границу...*/
Вы часто видели операционные системы где это легко сделать? Я кроме dos'а не видел.
Что сделать? Попытаться прочитать невыделенную память? С чего Вы взяли, что этоь возможхно только в DOS?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Крестики Нолики

Сообщение BratSinot »

/dev/random писал(а):
06.05.2010 17:16
В данном случае - да. Но вы хотели задел на будущее, чтобы можно было работать с большими полями. К примеру, если на поле 10x10 нужно поставить 5 в ряд, то N-M=5.

А, теперь понял.

Кстати, вы нашли ошибку в четвёртом условии?

А что её там искать?

Код: Выделить всё

if(sk[*tempx][*tempy]=='X'&&sk[*tempx+1][*tempy-1]=='X'&&sk[*tempx+2][*tempy-2]=='X')

Просто писал, когда плохо соображал, вот и пропустил.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 16:23
Не по-моему, а по определению. Я уже написал, что использую это слово как чёткий научный термин. Также написал, что в определении этого термина присутствует требование полноты. Т.е. "беспроигрышной стратегией" можно назвать набор правил, который _всегда_ приводит к выигрышу либо ничьей, при _любых_ ходах противника. Если есть вероятностный элемент, это не стратегия по определению.

http://ru.wikipedia.org/wiki/Стратегия_(математика)
В теории игр стратегия игрока в игре или деловой ситуации — это полный план действий при всевозможных ситуациях, способных возникнуть. Стратегия определяет действие игрока в любой момент игры и для каждого возможного течения игры, способного привести к каждой ситуации.

я не говорил, что моя стратегия оптимальная, и что она (тем более) - беспроигрышная. Да она не оптимальная, и в некоторых случаях не приводит к выигрышу, даже если это и возможно. Это не лучшая стратегия, и тем не менее, это стратегия. ИМХО. Да, есть элемент случайности, ну и что? Случайное действие разве не действие?
И как быть с оптимальной стратегией игры в орлянку? Насколько я знаю, это именно случайная стратегия - если ваши действия не случайны, противник сможет их вычислить и выиграет. Или у вас есть другая стратегия?
t.t писал(а):
06.05.2010 16:30
Да не 8, а 2; что же Вы о симметрии всё время забываете? Уж для ГА-то набор элементов всегда пытаются свести к минимуму для повышения эффективности обучения.

нет, не забываю. в данном случае это не играет никакой роли - просто программа получается даже не простой, а совсем примитивной. Это если без симметрии. К тому-же, так играть намного интереснее - ваш вариант будет навязывать только 1 вариант. И так КН тупая игра, а с вашей оптимизацией... (:

ЗЫЖ правила игры в орлянку забыл привести, может кто не в курсе...
итак: я подкидываю монетку, и пока она летит, вы говорите - орёл или решка. угадали - вам доллар, не угадали - мне. причём, я могу играть нечестно, с кривой монеткой, которая почти всегда падает орлом вверх. ну или кидать аккуратно, чтоб выпала нужной мне стороной. так вот, оптимальная для меня стратегия - это честная монетка. иначе вы быстро догадаетесь, и меня разорите :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Крестики Нолики

Сообщение drBatty »

t.t писал(а):
06.05.2010 17:27
Что сделать? Попытаться прочитать невыделенную память? С чего Вы взяли, что этоь возможхно только в DOS?

это возможно в любой ОС, причём такого не следует допускать в любом случае - искать такие баги - сущий ад.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
i18n
Сообщения: 192

Re: Крестики Нолики

Сообщение i18n »

С этой "орлянкой" явно некоторая путаница, освежая свои скудные познания в теории игр, попробую сформулировать в более формализованном виде. По сути речь идет о простейшей игре двух лиц с нулевой суммой. Элементы платежной матрицы равны соответственно: a_{11}=1, a_{12}=-1, a_{21}=-1, a_{22}=1. Нижняя цена игры равна -1, верхняя цена игры равна 1. Седловой точки нет, поэтому решение нужно искать в области смешанных стратегий. Далее, по известным формулам (см. например, Ю.Н. Кузнецов, В.И. Кузубов, А.Б. Волощенко Математическое программирование М: Высшая школа, 1980) находим, что оптимальная стратегия игрока A это (1/2;1/2) и оптимальная стратегия игрока B это (1/2;1/2). Цена игры, соответственно, равна нулю. Вот такая история.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 19:18
t.t писал(а):
06.05.2010 16:23
Не по-моему, а по определению. Я уже написал, что использую это слово как чёткий научный термин. Также написал, что в определении этого термина присутствует требование полноты. Т.е. "беспроигрышной стратегией" можно назвать набор правил, который _всегда_ приводит к выигрышу либо ничьей, при _любых_ ходах противника. Если есть вероятностный элемент, это не стратегия по определению.
http://ru.wikipedia.org/wiki/Стратегия_(математика)
В теории игр стратегия игрока в игре или деловой ситуации — это полный план действий при всевозможных ситуациях, способных возникнуть. Стратегия определяет действие игрока в любой момент игры и для каждого возможного течения игры, способного привести к каждой ситуации.
я не говорил, что моя стратегия оптимальная, и что она (тем более) - беспроигрышная. Да она не оптимальная, и в некоторых случаях не приводит к выигрышу, даже если это и возможно. Это не лучшая стратегия, и тем не менее, это стратегия. ИМХО. Да, есть элемент случайности, ну и что? Случайное действие разве не действие?
То, что Вы привели, -- не определение термина, а попытка объяснить его научно-популярным языком. Точного определения термина "стратегия" я в сети не нашёл (иначе бы привёл ссылку), а наизусть я его помню плохо: всё-же теорию игр нам вообще не преподавали. Требование полноты в этом определении я упоминал уже дважды. Впрочем, в приведенном объяснении это требование тоже присутствуепт, хотя и не столь точно сформулировано (выделение моё):
В теории игр стратегия игрока в игре или деловой ситуации — это полный план действий при всевозможных ситуациях, способных возникнуть. Стратегия определяет действие игрока в любой момент игры и для каждого возможного течения игры, способного привести к каждой ситуации.


drBatty писал(а):
06.05.2010 19:18
И как быть с оптимальной стратегией игры в орлянку? Насколько я знаю, это именно случайная стратегия - если ваши действия не случайны, противник сможет их вычислить и выиграет. Или у вас есть другая стратегия?
Это не стратегия. Стратегия даёт _гарантированный_ результат. По определению. Если в алгоритме есть вероятнростный элемент, то этот алгоритм -- не стратегия. Если игра по своим правилам основана на вероятностях событий, то для такой игры стратегии не существует по определению. Могут существовать алгоритмы, максимизирующие матожидание выигрыша -- но это не стратегии.

drBatty писал(а):
06.05.2010 19:18
t.t писал(а):
06.05.2010 16:30
Да не 8, а 2; что же Вы о симметрии всё время забываете? Уж для ГА-то набор элементов всегда пытаются свести к минимуму для повышения эффективности обучения.
нет, не забываю. в данном случае это не играет никакой роли - просто программа получается даже не простой, а совсем примитивной. Это если без симметрии. К тому-же, так играть намного интереснее - ваш вариант будет навязывать только 1 вариант. И так КН тупая игра, а с вашей оптимизацией... (:
Если существет несколько ходов, признанных "одинаковыми" (точного термина не помню) с точки зрения ГА, то один из них обычно выбирается случайно и равновероятно. Подчеркну, что этот случайный выбор не является элементом стратегии: ведь с точки зрения стратегии все эти равновепроятные ходы _одинаковы_.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Крестики Нолики

Сообщение t.t »

drBatty писал(а):
06.05.2010 19:23
t.t писал(а):
06.05.2010 17:27
Что сделать? Попытаться прочитать невыделенную память? С чего Вы взяли, что этоь возможхно только в DOS?
это возможно в любой ОС, причём такого не следует допускать в любом случае - искать такие баги - сущий ад.
Да, именно к этому я и подводил.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: