Танчики

Dasar

Задача первого Russian AI Cup называется CodeTanks. Участникам предлагается, используя предоставленный API, написать искусственный интеллект для управления взводом (от одного до трех) танков. Написать свою стратегию совсем просто — достаточно базовых знаний программирования.
Стратегии нескольких авторов сражаются на поле битвы. В каждом бою участвует шесть танков. В зависимости от числа противников возможны следующие варианты:
•шесть противников — по одному танку от каждого,
•три противника — по два танка от каждого,
•дуэль — по три танка от каждого.

Цель каждой стратегии — набрать как можно больше очков, уничтожая вражеские танки и защищая свои. Для этого танки могут ездить по игровому полю, стрелять, собирать бонусы. Все участники имеют возможность создать свое сражение, чтобы изучать самых сильных противников и продумывать свою тактику для победы.
http://russianaicup.ru/p/codeTanks

matvey61

в world of tanks решили добавить ботов?

Barbie29

Чота у них всё под вендовые среды разработки заточено.. И про многоязыковость непонятно - это что танчики на плюсах будут биться с танчиками на джаве? Да последние ещё не успеют проинициализироваться к тому моменту когда танчики на сях их порвут..

stm5872449

И про многоязыковость непонятно - это что танчики на плюсах будут биться с танчиками на джаве? Да последние ещё не успеют проинициализироваться к тому моменту когда танчики на сях их порвут..
На google ai challenge вроде это никому не мешало.

fufa58

Я так понимаю, результаты последнего google ai challenge говорят о том, что проблемы со скоростью инициализации не у jav'ы :smirk:

nata_chira

там же не реалтайм вроде? :confused:

elenangel

обычно на обработку хода дается ограниченное время.

Dasar

У них хитрое выделение времени. С одной стороны боту на один тик выделяется до 2с времени, а с другой стороны - суммарно выделяется времени 50мс * кол-во тиков.
Или другими словами: обычно надо отвечать за 50мс, но изредка (например, при инициализации) можно потупить с ответом до 2с

katrin2201

И еще на цпу зачем-то отдельно ограничение в 20мс.
Видимо предполагается, что можно еще между танчиками синхронизироваться...

Dasar

Не глядя, со всех ног несясь к цели и стреляя в ближайшего, я конечно в 600-ку вошел, но на грани вылета.

nikola1956

я конечно в 600-ку вошел
Тоже решил поучаствовать! :)
Ан-нет, не все так просто. Со своей стратегией смог подняться только чуть выше 2100. :(
Вроде бы бонусы собираю, по танкам стреляю, быстро езжу между сторонами поля. Но этого мало ...
Может быть у кого-нибудь из форумчан есть идеи, как гарантировано усилить стратегию? Программировать-то не сложно, но вот идей мне хватает ...
Думал, добавить модуль, чтобы уворачиваться от снарядов, но уверенности нет, что это окажется сильно полезным. :confused:

yroslavasako

Может быть у кого-нибудь из форумчан есть идеи, как гарантировано усилить стратегию? Программировать-то не сложно, но вот идей мне хватает ...
стрелять на упреждение? Составлять статистическую модель поведения противника, или хотя бы для начала просто считать, что если танк едет прямо и перед ним есть бонус, то до него доедет

nikola1956

стрелять на упреждение?
Кстати, да, эту фишку добавить очень несложно! Спасибо! :)
Но по моим наблюдениям промах из-за отсутствия упреждения бывает не очень часто, около 20% случаев.

Dasar

Вроде бы бонусы собираю, по танкам стреляю, быстро езжу между сторонами поля. Но этого мало ...
В целом, этого достаточно. Мой танк с этими стратегиями дополз до ~250 места.
Основная проблема у меня сейчас в нестабильности выигрыша. Танк тупой, препятствий и стенок не замечает, и если в начале боя где застрянет, то его в этот момент решетят остальные.
Для себя дальнейшее усовершенствование вижу в аккуратном объезде препятствий.
ps
Вообще, стоит обратить внимание на то, чтобы езда действительно была быстрой (большая часть танков ездит медленно), для этого стоит понимать, что в данной игре движение ускоряющееся (в той или иной мере), и это использовать.
> Думал, добавить модуль, чтобы уворачиваться от снарядов, но уверенности нет, что это окажется сильно полезным.
полезен в конце, при дуэлях на дальних дистанциях

nikola1956

Большое спасибо за ценнейшие замечания! :)
Мне надо будет лучше использовать ускорение при движении танка.

Dasar

еще, кстати, отмечу, что основная цель - набрать очки, а не выжить.

katrin2201

Можно попробовать что-то вроде этого: раз и два.
Оцениваете точки на поле как-то так:
- Точка на пути пули - большой минус ей.
- Точка находится в тылу чужого танка - плюс ей.
ну итд
И выбираете траекторию с хорошей скоростью, проходящую по хорошим точкам.

nikola1956

Благодаря ценным советам участников раздела Development, дополз в район 360 места. Но сейчас это не так важно, так как проходной уровень в первый тур повысили с 600-го до 900-го места. Теперь интересны результаты первого тура, который начнется в ночь с пятницы на субботу.

kedr1983

Помнится, в бородатых 2004-2005 Fenek подходил ко мне. Говорит:
— В Си шаришь?
— А че такое?
— Да вот надо запрогать стратегию танков на Сях. Есть литература какая?
Я тогда ему классическую книжку презентовал.
Чем закончились его игры с танками, не знаю. Но вот этот пост удивил. Значит идея AI-танков все еще живет. :)

Anna74

[проходя мимо] есть ли там возможность воткнуть случайность твоей траектории-направления-ускорения и т.п. Слышал так реальные ракеты летают, чтобы их труднее было противоракетой сбить.

nikola1956

есть ли там возможность воткнуть случайность твоей траектории-направления-ускорения и т.п.
Нет, в этой игре снаряды и ракеты — не управляемые.

nats

Поздравляю. :) Моя стратегия за день только на сто мест поднялась. Так и стоит в районе 1900. :confused:

nikola1956

Поздравляю
Спасибо! Странно, но моя стратегия (старая) за эти сутки поднялась еще на 100 мест (теперь она в районе 260 места).

nats

Жалко, что рейтинговые бои идут не так часто. Были бы хотя бы с интервалом в 40-45 минут, а то 70-80 минут, ИМХО многовато.

nats

Под каким ником участвуешь? :)))

Anna74

но сам танк-то наверно управляемый, можно свою траекторию случайной сделать, чтобы в тебя труднее попасть было, чтобы противник твою траекторию предсказать не сильно мог

zorin29

Никто не станет тратить ресурсы на разгадывание твоей траектории, если она не вообще тривиальная. Случайность не добавит ничего.

elenangel

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

Kent1331

ну как у Вас дела?

elenangel

лично у нас - хреново, болтаемся на 900 +-100 месте, а вообще финал закончился, еще неделю песочница работает.

fufa58

я в самом начале на коленке набросал нечто, что после пары апгрейдов болтается сейчас в районе 700го места, но у меня работы до жопы было, я ещё числа 6го забил.
Товарисч с работы в первых 150, но он забил после того, как пару недель назад правила сильно поменяли (и логику на несколько танков он даже не писал вроде)

Dasar

место ~600
код такой:

using System;
using Com.CodeGame.CodeTanks2012.DevKit.CSharpCgdk.Model;
using System.Linq;

namespace Com.CodeGame.CodeTanks2012.DevKit.CSharpCgdk
{
public sealed class MyStrategy : IStrategy
{
public void Move(Tank self, World world, Move move)
{

var enemyTanks = world.Tanks.Where(_tank => !_tank.IsTeammate)
.Where(_tank => _tank.HullDurability > 0 && _tank.CrewHealth > 0)
.ToArray();

if (world.Tick < 300)
{
move.LeftTrackPower = -0.8;
move.RightTrackPower = -1;
}
else
{
var bonus = world.Bonuses.OrderBy(_bonus => self.GetDistanceTo(_bonus)).FirstOrDefault();
if (bonus != null)
{
var angle = self.GetAngleTo(bonus);
if (angle > Math.PI / 6)
{
move.LeftTrackPower = 1;
move.RightTrackPower = -1;

}
else if (angle < -Math.PI / 6)
{
move.LeftTrackPower = -1;
move.RightTrackPower = 1;

}
else if (angle > Math.PI / 36)
{
move.LeftTrackPower = 1;
move.RightTrackPower = 0.98;
}
else if (angle < -Math.PI / 36)
{
move.LeftTrackPower = 0.98;
move.RightTrackPower = 1;
}
else
{
move.LeftTrackPower = 1.0D;
move.RightTrackPower = 1.0D;
}
}
else
{
move.LeftTrackPower = 1.0D;
move.RightTrackPower = 0.8D;
}
}

var tank = enemyTanks
.OrderByDescending(_tank => Math.Abs(self.GetTurretAngleTo(_tank)) < self.TurretTurnSpeed * self.RemainingReloadingTime)
.ThenBy(_tank => self.GetDistanceTo(_tank))
.FirstOrDefault();

if (tank != null)
{
var enemy_angle = self.GetTurretAngleTo(tank);

var angleDelta = enemy_angle;
move.TurretTurn = angleDelta;

if (angleDelta <= self.TurretTurnSpeed && angleDelta >= -self.TurretTurnSpeed)
move.FireType = FireType.PremiumPreferred;

}
}

public TankType SelectTank(int tankIndex, int teamSize)
{
return TankType.Medium;
}
}
}

elenangel

var enemyTanks = world.Tanks.Where(_tank => !_tank.IsTeammate) .Where(_tank => _tank.HullDurability > 0 && _tank.CrewHealth > 0) .ToArray();
вот же ж шарп читерный язык!
if (world.Tick < 300) { move.LeftTrackPower = -0.8; move.RightTrackPower = -1; }
ха, я тоже так делал, только до 150 тика и -0.75 -1

agaaaa

ха, я тоже так делал, только до 150 тика и -0.75 -1
Зачем это? :)

Dasar

Зачем это? :)
чтобы не лезть в центр огня от всех других танков и одновременно уйти с линии огня противоположного танка.
Оставить комментарий
Имя или ник:
Комментарий: