Страница 1 из 1

Управление роботом. Миниконкурс.

СообщениеДобавлено: 02.01.2012 (Пн) 10:53
Mikle
Предлагаю немного посоревноваться в искусстве управления роботом.
Краткое описание:
Робот представляет собой три массивных колеса (изображение в 2D), соединённых невесомыми пружинами, внизу расположена земля, имеется сила тяжести, трение. Столкновения колёс между собой и с землёй абсолютно неупругие.
Радиус колеса - 32 (в пикселях), длина ненагруженных пружин - 150, земля находится на уровне -32, то есть колесо, касающееся земли, находится на уровне 0.
ЭТО ВСЁ УЖЕ НАПИСАНО! Ваша задача - написать robot.dll.
Программа, визуализирующая робота, обращается к robot.dll, которая экспортирует единственную ф-цию RTICK. Единственный параметр ф-ции - указатель на структуру, содержащую текущее значения координат и скоростей колёс, а так же усилия, приложенные к пружинам.
Задача - заставить робота двигаться вправо, цель - за минуту уйти как можно дальше.
Ф-ция RTICK вызывается 60 раз в секунду.
Тут уже готовая программа и исходник robot.dll на C++:
http://www.gamedev.ru/files/?id=74460
Можно этот исходник брать за основу. Естественно, на VB6 писать dll можно (и нужно!), просто этот пример я сделал для других сайтов, где далеко не все знакомы с VB.
Текущий результат, который пока можно считать рекордом - 3688.

Немного подробностей. Единицы все условные:
Масса колеса - 1.
Время - 1 "тик", то есть примерно 1/60 сек.
Расстояние - пиксели.
Соответственно скорость - пиксели за тик.
Единица силы - та величина, при которой за 1 тик тело массой в 1 ускоряется на 1.
Ускорение св. падения - 0.1.
Трение об воздух - каждый тик скорость каждого шара умножается на 0.997.
К-т жёсткости пружины - 6/150 (по Гуку).
Сила трения покоя и движения - 3 * сила_сжатия_тел.
Можно только влиять на три пружины, сила от -3 до 3, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает. Пружина с индексом №0 соединяет колёса №0 и №1, пружина с индексом №1 соединяет колёса №1 и №2, пружина с индексом №2 соединяет колёса №2 и №0.

Могу, при необходимости, дать исходник физики, но вряд ли это нужно. Мне кажется, что будет и проще, и интереснее сделать так, чтобы робот сам динамически принимал решение.
Более подходящего раздела для этой темы не нашёл.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 02.01.2012 (Пн) 18:51
Хакер
[ :( ]
Из раза в раз — твоя программа не имеет окна, не отображается в таскбаре, и нужно последовательно сворачивать 1000 окон в системе, чтобы найти там ушедшее на почти самый задний план окно твоей программы.
[ / :( ]

Подобного рода конкурсы мне по нраву. Всё-таки переношу в народный треп. Где можно выкладывать «прошивки» работов и мериться результатами и смореть самый последний рекорд?

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 02.01.2012 (Пн) 19:33
Proxy
Пока не могу найти время попробовать, но заинтересовало. Вообще люблю подобного рода "игрушки".
А может стоит создать где-нибудь раздел, посвящённый подобного рода мероприятиям (где нужно написать ИИ и подключить как dll)?
Я когда-то давно писал такие шахматы для игры двух ИИ, просто функция получения игровой ситуации и функция хода, могло проверить ход на корректность, но ИИ я так и не написал, можно было только через эдакую консольку ходы делать, на том проект и заглох. В целом ничего не мешает возобновить.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 02.01.2012 (Пн) 21:20
Mikle
Хакер писал(а):твоя программа не имеет окна, не отображается в таскбаре

Про таскбар забыл :)
Хакер писал(а):Всё-таки переношу в народный треп.

И хорошо, тут народу больше!
Хакер писал(а):Где можно выкладывать «прошивки» работов и мериться результатами и смореть самый последний рекорд?

Прямо здесь, наверное. Вот тема на GameDev.ru:
http://www.gamedev.ru/code/forum/?id=156656
Там уже порог в 40000 побили. Но нам, наверное, интересны свои результаты.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 1:59
Хакер
Такое ощущение, что у тебя в физике глюки, зависящие от системного времени. То, что работало два часа назад, не работает сейчас. Хотя речи быть не может о том, что я поменял что-то в своём коде. У «воспроизвожу» ответы из записанного текстового файла. Текстовый файл никто не менял.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 8:47
Mikle
У меня накопилось уже много разных dll, ни одна из них так себя не ведёт.
Время моя программа не опрашивает, есть целочисленный счётчик вызовов ф-ции RTICK, его я и использую в качестве времени. Есть один вызов Sleep, но он только для задержки, на рассчётные параметры он не влияет. RND я не использую. Если бы были глюки - они должны были бы всё равно повторяться.
Могу предположить два варианта:
1. Твоя программа зависит от времени. Но, если ты воспроизводишь записанные в файл команды, это исключается.
2. Запуск на разных процессорах. Я уже встречал ситуацию, когда AMD и Intel по разному округляли float.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 9:02
Хакер
Но и у меня нет заклада на времени. И процессор я не менял.
Я записывал ответы функци RTICK для удачных «решений» в файл вот так:
Код: Выделить всё
sresult = sresult + CStr(tickind) + " " + CStr(r.Force(1)) + " " + CStr(r.Force(2)) + " " + CStr(r.Force(3)) + vbNewLine


в таком формате
Код: Выделить всё
82 -0,3 -0,3 -0,25
94 -0,6 -0,6 -0,5
96 -0,9 -0,9 -0,75
98 -1,2 -1,2 -1
99 -1,5 -1,5 -1,25
101 -1,8 -1,8 -1,5
103 -2,1 -2,1 -1,75
104 -2,4 -2,4 -2
106 -2,7 -2,7 -2,25
107 -3 -3 -2,5
115 3 3 -3


Два файла содержат «программу управления роботом» для результатов 36k и 39k.

Потом по мере улучшения треугольник начал вести себя как-то странно. Какую-то способность к самовозбуждению приобрёл, колбасит его, «узлы» начинают двигаться очень быстро и напоминают броуновское движение.

Тогда я решил «проиграть» ранее записанный файл. Ну и что? Робот вёл себя просто неадекватно, прыгал вверх, вних, делал какие-то непонятные кульбиты. Такое впечатление, что где-то ошибка вычисления. Или сила иногда не ограничивается тройкой. Или где-то принципиальная ошибка вычисления физики.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 9:47
Mikle
А можно для опытов твою dll-проигрыватель с текстовым файлом?

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 11:06
Хакер
Почему если RTICK имеет такой вид:
Код: Выделить всё
r.Force(1) = -3
r.Force(2) = -3
r.Force(3) = -3


То фигура падает со вращением по часовой стрелке, если изначально она падает без какого-либо вращение. Имхо, это и есть одно из проявлений неправильной физики.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 17:35
Mikle
Физика, конечно, не идеальна. Всё дело в направлении цикла рассчёта коллизий для колёс - сначала проверяем 0-й с 1-м, потом 1-й со 2-м, потом 2-й с 0-м. Каждая пара рассчитывается достаточно корректно, я пробовал менять направление рассчёта - тогда при таком старте закручивает в другую сторону. Это проявляется при столкновениях колёс между собой.
Но, в любом случае, это не зависит от времени.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 17:50
Хакер
Почему бы нельзя организовать расчёт «одновременно», а не итеративно. Да, как раз при столкновении колёс друг-об-друга на больших скоростях и проявляются сверхстранные эффекты.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 18:09
Mikle
Хакер писал(а):Почему бы нельзя организовать расчёт «одновременно», а не итеративно.

Всё можно, просто делать два прохода рассчёта - в первый рассчитывать воздействия, во второй их вносить. Я поздно заметил.
Но можно вполне считать такое поведение реалией нашего виртуального мира, это не сильно мешает программировать поведение робота. И, повторяю, это никак не зависит от времени в системе.
Тем более не хочу вносить изменения, так как народ уже вовсю соревнуется, Apati с GcUp сделал 47852:
http://gcup.ru/go?http://rghost.ru/35723396
К тому времени, как эта задача "выдохнется", постараюсь подготовить новую, более корректную физически.

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 03.01.2012 (Вт) 18:52
Хакер
Mikle писал(а):И, повторяю, это никак не зависит от времени в системе.

Пусть так.

Mikle писал(а):Тем более не хочу вносить изменения, так как народ уже вовсю соревнуется, Apati с GcUp сделал 47852:

Возможно на правильной физике будет ещё больший результат. Но вообще: в чём прикол соревноваться на неадекватной физике? :)

Re: Управление роботом. Миниконкурс.

СообщениеДобавлено: 04.01.2012 (Ср) 21:09
Mikle
Мой рекорд - 53053:
http://www.gamedev.ru/files/?id=74548