مختصری در مورد مسابقات هوش مصنوعی گوگل

مجموعه مسابقات بین‌المللی هوش مصنوعی گوگل (Google AI Challenge) از سال 2009 و در دانشگاه Waterloo Computer Science Club آغاز شدند. این مسابقات در ابتدا مختص دانشجویان دانشگاه مذکور بود، اما در سال 2010 با حمایت گوگل از این مسابقات، شرکت در آنها برای تمام برنامه‌نویسان دنیا امکان‌پذیر شد.

این مسابقات تا کنون در سه دوره برگزار شده‌اند:

1 – سال 2009، طراحی هوش مصنوعی بازی سنگ-کاغذ-قیچی (Rock-Paper-Scissors)
2 – سال 2010، طراحی هوش مصنوعی برای بازی Maze به صورت رقابتی (Tron Lightcycles)

 

حقیقتا با وجود جذابیت موضوعات این مسابقات، وقت و حوصله شرکت در آنها را نداشتم تا اینکه مطلب “مسابقه هوش مصنوعی گوگل” از وبلاگ “نوشته‌های یک برنامه‌نویس” را مطالعه نمودم. هر چند که اکنون زمان ثبت نام شرکت‌کنندگان جدید در این مسابقه به پایان رسیده و تقریبا نتایج مسابقه مشخص شده است، اما ممکن است انتشار این مطلب به دوستانی که قصد دارند در آینده در این مسابقه شرکت کنند، کمک کند.
مسابقات این دوره از زبانهایی مانند LISP، JAVA، CPP، Python و C# پشتیبانی می‌کند. در وبسایت مسابقات برای هر یک از زبانهای ذکر شده، Starter Pack های مجزایی، شامل سورسهای اولیه و اطلاعات مورد نیاز وجود دارد. برای شرکت در این مسابقات تنها کافی است که یک حساب کاربری جدید ایجاد کرده و پس از دریافت بسته‌های راهنما و مطالعه قوانین شرکت در مسابقه، کد موتور برنامه را طراحی نموده و فایلهای آن را بر روی سرور بارگزاری نمایید.
پس از آن با کامپایل برنامه، ایمیلی حاوی اتمام کامپایل یا خطای رخ داده دریافت خواهید کرد.
پس از قرار گرفتن ربات مربوطه بر روی سرور، زمانبندی مسابقات آن مشخص شده و در برابر آنها اجرا خواهد شد. نتیجه مسابقات به صورت آنلاین ثبت شده و انیمیشن هر مسابقه نیز به وسیله یک محیط شبیه‌سازی شده در HTML5 بر روی سایت قابل رویت است. از جمله قوانین مسابقه، میتوان به محدودیت زمانی 1 ثانیه‌ای برای پاسخ دهی ربات، عدم استفاده از Multithreading و دیگر روشهای غیر مجاز مثل استفاده از فایلها و  پروسس‌ها و غیره اشاره نمود. در صورت عبور از هر یک از قوانین مربوطه در هر کدام از مبارزات، ربات خاطی سریعا بازنده اعلام می‌گردد. مهمترین ویژگیهای آخرین سری مسابقه که به شبیه‌سازی بازی جنگ ستارگان پرداخته، به شرح زیر است:
شرح بازی:
تعدادی سیاره در یک نقشه فضایی وجود دارد که مالکیت آنها یا در اختیار شماست، یا دشمن شما و یا انکه هنوز تسخیر نشده‌اند.
هر سیاره دارای تعدادی سفینه جنگنده است که با ارسال آنها به سیارات دشمن، در صورتی که تعداد سفینه‌های ارسال شده، بیشتر از سفینه‌های موجود در سیاره مقصد باشند، آن سیاره تسخیر می‌گردد. در غیر این صورت نیز فقط تعداد سفینه‌های ارسال شده، از تعداد سفینه‌های موجود در آن سیاره کسر می‌گردد. از زمان ارسال سفینه‌ها تا برخورد آنها با هدف، با توجه به فاصله میان دو سیاره، مدت زمانی صرف خواهد شد که در هر حرکت، سفینه‌ها یک خانه به سمت مقصد حرکت خواهند نمود.

با گذشت زمان تعداد سفینه‌های سیاره‌هایی که در تسخیر یکی از طرفین مسابقه باشند، با توجه به وسعتشان افزایش می‌یابد. هر چقدر که وسعت سیاره بیشتر باشد، گام افزایش آن نیز بیشتر خواهد بود. هر بازی کننده در هر حرکت، می‌تواند تعدادی از سفینه‌های هر کدام از سیاره‌هایش را به یک سیاره دیگر (خودی /دشمن / تسخیر نشده) ارسال نماید. هدف از ارسال سفینه به یک سیاره خودی، افزایش تعداد سفینه‌های آن و مقاومت در مقابل حمله دشمن است.

حداکثر زمان اجرای بازی 200 حرکت بوده و در پایان آن، بازیکنی که سفینه‌های بیشتری داشته باشد پیروز خواهد شد. همچنین امکان نتیجه مساوی (DRAW) و یا پیروزی در زمان کمتر هم با تسخیر تمام سیارات دشمن وجود دارد.

محتوای پکیج C#:

PlanetWars.cs: فایل حاوی پارسر فرامین بازی.
MyBot.cs: فایل اصلی که حاوی کد ربات طراحی شده است.
Planet.cs: تعاریف سیاره.
Fleet.cs: تعاریف سفینه.

امکان تغییر و شخصی‌سازی تمام فایلهای فوق وجود دارد، اما فایل اصلی که حاوی روال اجرایی ربات است، Mybot.cs می‌باشد که دارای دو روال main و DoTurn است. روال DoTurn مکانی است که کد اصلی ربات طراحی شده و لزوما باید اجرای آن کمتر از 1 ثانیه به طول بی‌انجامد.

نکته: شیوه ارتباط رباتها با سرور به صورت ارسال فرامین کنسول است که از قبل تعریف شده اند.

اشیاء قابل استفاده:

Pw: حاوی تنظیمات بازی
Planets، MyPlanets، EnemyPlanets، NeutralPlanets، NotMyPlanets: لیستهای مختلفی از سیاره‌ها.
Fleets، MyFleets ، EnemyFleets، NeutralFleets: لیستهای مختلفی از سفینه‌های در حال ارسال.

توابع مهم:

IssueOrder: تابع اصلی برنامه که جهت ارسال سفینه در یک حرکت مورد استفاده قرار می‌گیرد.
Distance: محاسبه فاصله بین دو سیاره.

مثال:

Planet dest = pw.EnemyPlanets()[0];
Planet source = pw.MyPlanets()[0];
int count = pw.MyPlanets()[0].GrowthRate();
pw.IssueOrder(source, dest, count);
طراحی کدهای ربات کار چندان مشکلی نیست، اما رعایت محدودیت 1 ثانیه‌ای برای پاسخ دهی به سرور، زمانی که از استراتژی‌های نسبتا هوشمند استفاده کنید، کار دشواری است.

بنده دو ربات مختلف برای این مسابقه طراحی کردم که اولی با یک استراتژی بسیار ساده (حملات متعدد)، در حال حاضر در رتبه 15 باتهای ایرانی قرار دارد. دومی که ربات بسیار قدرتمندی است، هنوز بهینه سازی نشده و گاهی اوقات مشکل دارد. (با روش سویچ مداوم بین دو حالت دفاعی و هجومی و محاسبه قدرت حملات حریف)

امیدوارم با این پیش‌زمینه، در آینده ایرانیهای بیشتری در این مسابقات شرکت کنند.

دریافت کد ربات اول   دریافت کد ربات دوم    صفحه نتایج بازیهای ایران    صفحه نتایج جهانی

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

3 Comments

  1. خیلی خیلی عالی بود
    من واقعا علاقه مند شدم برم سمتش
    مسابقه جدید از کی شروع میشه؟

  2. کد روبات دومتان خیلی جالب است.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


× 6 = 30