Advanced: Тема повышенной сложности или важная.
Mikle
Сделай всетки длл для обучения нейронки, тоже интересно поучаствовать.
Adler
классно, молодец.
susageP
> Сделай всетки длл для обучения нейронки, тоже интересно поучаствовать.
боюсь, нейронка тут не спасёт. в смысле я не знаю метода обучения, который бы сошёлся на такой плохой целевой функции. благо, на нейронках свет клином не сошёлся и существует куча других, нормальных методов.
Adler
> всё верно. Только перехваченные данные потом ещё в файл записываются.
Ну я так и понял, потому что библиотек нигде нет. А было бы неплохо хранить их в отдельной папке рядом и вызывать перед запуском. А так всё жестко зашито.
Merrewend
> Сделай, пожалуйста, версию без ограничения по времени. Смотрел бы и смотрел как
> робот кочевряжится.
Тут проблема в том, что через некоторое время точности float начнёт не хватать, начнутся дёрганья, чем дальше - тем сильнее.
susageP
> Сделай всетки длл для обучения нейронки, тоже интересно поучаствовать.
Сделаю следующее задание, всё будет.
Suslik
> лол, почему мой робот - самый обдолбанный?
А мой в начале убегает, и больше его не показывают :(
Suslik
> боюсь, нейронка тут не спасёт. в смысле я не знаю метода обучения, который бы
> сошёлся на такой плохой целевой функции. благо, на нейронках свет клином не
> сошёлся и существует куча других, нормальных методов.
Ну мне интересен именно этот метод. и если будут предоставлены методы для комфортного обучения с удовольствием поучаствую.
Mikle
> Сделаю следующее задание, всё будет.
только спроси какие методы, когда будешь делать:)
Mikle
> А мой в начале убегает, и больше его не показывают :(
не переживай, и твой метод всё равно очень далёк от оптимального.
susageP
> Ну мне интересен именно этот метод. и если будут предоставлены методы для комфортного обучения с удовольствием поучаствую.
я гонял свою программу на вот таком коде:
PROCESS_INFORMATION procInfo; STARTUPINFOW startInfo = { 0 }; startInfo.cb = sizeof(startInfo); CreateProcess( TEXT( "RCheck.exe"), 0, 0, 0, 0, 0, 0, 0, &startInfo, &procInfo); WaitForInputIdle( procInfo.hProcess, 100000); wchar_t className[1024]; HWND hWnd = 0; hWnd = FindWindow( TEXT( "ThunderRT6FormDC"), 0); wchar_t wndText[1024]; int val = 0; do { GetWindowText( hWnd, wndText, 1024); }while( swscanf_s( wndText, TEXT( "%d"), &val) != 1); while( !TerminateProcess( procInfo.hProcess, 0)); return float( -val);
Suslik
У тебя под конец есть момент, когда робот фактически бежит не прыгая. Если бы заставить его сразу так бежать - было бы, наверное, за 70000.
Mikle
я параметры практически не крутил(а их в методе хватает). плюс я ищу только семейство решений, которые я назвал квазипериодическими(на соседних интервалах времени решения различаются незначительно) - такие решения лучше всего ищутся именно в реалтайм, моделируя процесс на период вперёд. а мне приходится запускать процесс rcheck, моделировать весь отрезок времени(несколько сотен периодов), считывать значение, убивать процесс. при этом то, что происходит после расчёта требуемого мне отрезка времени, вносит ещё и погрешность, ухудшающую сходимость. короче я постараюсь покрутить параметры повнимательней в другом конкурсе, более подходящем для адаптивных решений, если он будет. с радостью посоревнуюсь с нейросетевиками и, возможно, подключу свои нейросети для сравнения.
Suslik
Т.е. алгоритм такой что просто проверяет с текущего T до T+dT - расстояние при заданых силах, выбирает наибольшее расстояние - записывает в файл, и продолжает с той точки? Хитро однако =)
Suslik
Вот так вроде не должно мигать, но я ещё не проверял.
PROCESS_INFORMATION procInfo; STARTUPINFOW startInfo = { 0 }; startInfo.cb = sizeof(startInfo); startInfo.dwFlags = STARTF_USESHOWWINDOW; // (1) startInfo.wShowWindow = SW_HIDE; // (2) CreateProcess( TEXT( "RCheck.exe"), 0, 0, 0, 0, 0, 0, 0, &startInfo, &procInfo); WaitForInputIdle( procInfo.hProcess, 100000); wchar_t className[1024]; HWND hWnd = 0; hWnd = FindWindow( TEXT( "ThunderRT6FormDC"), 0); wchar_t wndText[1024]; int val = 0; do { GetWindowText( hWnd, wndText, 1024); }while( swscanf_s( wndText, TEXT( "%d"), &val) != 1); while( !TerminateProcess( procInfo.hProcess, 0)); return float( -val);
fzr125
> Т.е. алгоритм такой что просто проверяет с текущего T до T+dT - расстояние при заданых силах, выбирает наибольшее расстояние - записывает в файл, и продолжает с той точки? Хитро однако =)
нет. если так считать, то робот быстро прыгнет вперёд(локальный минимум на период dt) и уткнётся носом в землю(локальный минимум на отрезке T + dt не является локальным минимумом на отрезке T + 2*dt).
Я на каждом шаге ищу периодическое решение, используя предыдущее решение как начальное приближение. Таким образом решение постоянно находится периодическое, но так как оно постоянно пересчитывается, оно периодическим, вообще говоря, не является. Если решение найти один раз и не пересчитывать, то через N-ное количество шагов оно "развалится", так как невозможно идеально точно предсказать поведение робота. Если решение искать не периодическое и/или не пересчитывать, то сходиться будет гораздо медленнее(уже не риалтайм). В описанном же подходе обычно находится вполне сносное решение уже по прошествии пары-тройки периодов(то есть около трёх секунд "попыток" пойти в реальном времени).
GCC, с деф-файлом так и не заработало.
GCC 4.5.2, Code::Blocks.
Шаблон такой:
extern "C" __declspec(dllexport) void RTICK(robot *a) { }
nervous1025
> GCC, с деф-файлом так и не заработало.
def-файл:
LIBRARY "robot.dll" EXPORTS RTICK = RTICK@4
__declspec(dllexport) void __stdcall RTICK(robot* R) {...}
nervous1025
В Code::Blocks в настройки проекта в опции линкера допиши
-Wl,--kill-at
-Wl,--def=robot.def
Тема в архиве.