CodeRacing 2015 [Russia AI Cup] (17 стр)
Я смог обыграть свою машинку на клавиатуре!
Сложный поворот, который невозможно пройти без столкновений или заднего хода. А с задним ходом у моего бота беда :(
Красивая отрисовка симуляции движения :)
На сколько тиков вперед расчет идет?
Да, без такой визуализации я бы вообще не смог отладить езду. Просчёт максимум где-то на 100-150 тиков вперёд идёт.
У меня 4 разных путепостроителя одновременно работают с просчетом на 400 тиков вперёд каждый :)
Я пытался увеличивать глубину просчёта, но тогда мой переборщик либо перестаёт укладываться во времени, либо не находит хороших траекторий. А сделать умный переборщик типа генетического алгоритма - не успел.
У меня набор из 500 траекторий просчитывается на 128 кадров вперёд, но только один раз в 8 кадров. Потом ещё строиться динамическая траектория на 128 кадров вперёд.
Затем лучшая из набора + динамическая траектория + предыдущая траектория симулируются на 256 кадров вперёд и сравниваются. Победившая траектория рулит машинкой следующие 8 кадров.
У меня, пока я еду по просчитанной траектории, считаются 15 траекторий из точки через 15 тиков (каждый тик по одной), через 15 тиков к ним прибавляется еще текущая, они все оцениваются и выбирается одна на следующие 15 тиков.
...Если вдруг кому интересно :)
Доулучшался я. Судя по первым играм - падаю по таймлимиту постоянно :(
Как раз то, о чем я говорил на форуме, что было бы хорошо иметь возможность во время раунда переключиться на более раннюю (стабильную) версию. Особенно учитывая постоянные падения серверов.
Я расстроен и злой. Из-за этих таймлимитов и того, что тип карт, который их вызывает, оказался первым. Судя по темпам, все типы карт, которые умеет делать генератор, за 12 часов не посчитаются. И я почти уверен, что организаторы все оставят как есть.
По больше бы вот таких карт:
Предлагаю всем, кто упал на первой волне карт по таймлимитам написать сообщение администрации с просьбой пересчитать игры с увеличенным таймлимитом: ведь во-первых не все типы карт, которые умеет делать генератор, успеют протестироваться, что даёт сильный вес первым типам, а во-вторых, на них сильно занижен таймлимит и протестировать падения на них было почти невозможно заранее: ведь все обычные карты довольно быстрые, а генератор появился только за сутки до финала, и при создании игр не было возможности выбирать тип. Сейчас тестируется вторая волна, например, где сразу видно, что количество падений уменьшилось. Но и на второй волне падений много :(
sskolot
Только сейчас понял, что ты SKolotienko
Сделал выдералку карт:
+ Показать
− Скрыть
string map_to_str(const vector<vector<model::TileType>>&tiles)
{
string out;
auto W=tiles.size();
auto H=tiles[0].size();
for(int y=0;y<H;y++)
{
for(int x=0;x<W;x++)
{
auto t=tiles[x][y];
#define CONV(T,V)if(t==T)out+=#V;
CONV(EMPTY ,E);
CONV(VERTICAL ,V);
CONV(HORIZONTAL ,H);
CONV(LEFT_TOP_CORNER ,7);
CONV(RIGHT_TOP_CORNER ,9);
CONV(LEFT_BOTTOM_CORNER ,1);
CONV(RIGHT_BOTTOM_CORNER,3);
CONV(LEFT_HEADED_T ,L);
CONV(RIGHT_HEADED_T ,R);
CONV(TOP_HEADED_T ,T);
CONV(BOTTOM_HEADED_T ,B);
CONV(CROSSROADS ,C);
CONV(UNKNOWN ,U);
#undef CONV
}
out+="\n";
}
return IToS(W)+" "+IToS(H)+"\n"+join(split(join(split(out,"E")," "),"U"),".");
}
string wps_to_str(vector<vec2i>&arr)
{
vector<string> out;
for(int i=0;i<arr.size();i++)
{
auto&ex=arr[i];
out.push_back(IToS(ex.x)+" "+IToS(ex.y));
}
return IToS(arr.size())+"\n"+join(out,"\n");
}
string to_str(Direction dir)
{
#define F(DIR)if(dir==DIR)return #DIR;
F(LEFT );
F(RIGHT);
F(UP );
F(DOWN );
#undef F
return "";
}
string world_to_map(const World&world)
{
return map_to_str(world.getTilesXY())+"\n\n"+wps_to_str(get_waypoints(world))+"\n"+to_str(world.getStartingDirection());
}
void MyStrategy::move(const Car&self,const World&world,const Game&game,Move&move)
{
if(world.tick==8800){
file_put_contents("map_427264.txt",world_to_map(world));
}
return;
}
1)Запускаем под repeater`ом.
2)Затем тайлы карты из файла "map_427264.txt" копируем сюда в поле "data": http://adler3d.github.io/test2013/
3)А в поле code вставляем вот это:
+ Показать
− Скрыть
var conv={
" ":"█",
"V":"║",
"H":"═",
"7":"╔",
"9":"╗",
"1":"╚",
"3":"╝",
"R":"╠",
"L":"╣",
"T":"╩",
"B":"╦",
"C":"╬",
".":"█"
};
var arr=POST['data'].split("\n");
var out=[];
for(var i=0;i<arr.length;i++)
{
var ex=arr[i];var s="";
for(var j=0;j<ex.length;j++){s+=conv[ex[j]];}
out.push(s);
}
return out.join("\n");
4)Жмем go.
5)Вставляем тайлы карты обратно в файл и сохраняем его.
Готово.
Ожидаемый результат:
+ Показать
− Скрыть
12 12
██╔═════╗███
██║█████║███
██║█████║███
╔═╝████╔╝███
║╔═════╬╗███
╚╝████╔╩╩╗██
██████║██║██
██████╚═╗║██
██████╔╗║║██
██████╚╬╩╩═╗
█████╔═╝███║
█████╚═════╝
27
6 10
7 10
7 8
6 8
6 9
9 9
9 5
7 5
7 4
1 4
1 5
0 5
0 3
2 3
2 0
8 0
8 3
7 3
7 4
8 4
8 5
6 5
6 7
8 7
8 9
11 9
5 10
RIGHT
Adler
Я тоже сделал
+ Показать
− Скрыть
#!/bin/bash
game=$1
token=`curl -X GET http://russianaicup.ru/game/view/$game | grep -P 'data-token=\"([a-z0-9_])+\"' -o | sed -r 's/.*"(.+)"/\1/'`
curl -X GET http://russianaicup.ru/boombox/data/games/$token > data/$token.data
cat data/$token.data | head -n 1 > json_data/$token.json
./parse.lua json_data/$token.json > maps/genmap_$game.map
#!/usr/bin/lua
filename=...
function readAll(file)
local f = io.open(file, "rb")
local content = f:read("*all")
f:close()
return content
end
JSON = (loadfile "JSON.lua")()
data = JSON:decode(readAll(filename))
tiles = data["tilesXY"]
waypoints = data["waypoints"]
NX = #tiles
NY = #tiles[1]
tilesSym = {
EMPTY = "█",
VERTICAL = "║",
HORIZONTAL = "═",
LEFT_TOP_CORNER = "╔",
RIGHT_TOP_CORNER = "╗",
LEFT_BOTTOM_CORNER = "╚",
RIGHT_BOTTOM_CORNER = "╝",
LEFT_HEADED_T = "╣",
RIGHT_HEADED_T = "╠",
TOP_HEADED_T = "╩",
BOTTOM_HEADED_T = "╦",
CROSSROADS = "╬"
}
print("" .. NX .. " " .. NY)
print()
for y = 1, NY do
line = ""
for x = 1, NX do
line = line .. tilesSym[tiles[x][y]]
end
print (line)
end
print()
print(#waypoints)
for i, k in ipairs(waypoints) do
print("" .. k[1] .. " " .. k[2])
end
print()
print(data["startingDirection"])