Я намагаюся написати розв’язувач у C # .NET для гри, відомої як Flowerz. Для ознайомлення, ви можете відтворити його на MSN тут: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Я пишу це для розваги, а не для будь-якого типу завдання чи будь-якої роботи, пов'язаної. Через це єдиним обмеженням є мій комп'ютер (ядро Intel i7, з 8 ГБ оперативної пам’яті). Щодо мене не потрібно бігати більше ніде.
Коротше кажучи, правила такі:
- Там черга заповнена кольоровими квітами. Його довжина довільна
- Не можна впливати на чергу
- Черга генерується на початку рівня
- Квітки мають один або два кольори.
- Якщо є два кольори, то є зовнішній і внутрішній колір. У випадку двох кольорів зовнішній колір використовується для відповідності.
- Якщо є сірник, то зовнішній колір зникає, і квітка тепер є одноколірною квіткою такого ж кольору, як внутрішня квітка
- Мета гри - створити матчі з трьох (або більше) одного кольору
- Коли квітка одного кольору є частиною сірника, її видаляють з ігрового поля, створюючи порожній простір
- Можна зіставити одноколірну квітку проти зовнішнього кольору двоколірної квітки. У цьому випадку одноколірна квітка зникає, зовнішній колір двоколірної квітки зникає, а внутрішній колір залишається
- Ви виграєте раунд, коли черга порожня, і залишилось хоча б одне порожнє місце
- Можливі каскадні матчі. Каскад - це коли три (або більше) зовнішніх квіток зникають, і коли їх внутрішні кольори утворюють інший ланцюжок з 3 (або більше квіток).
- Ігрове поле завжди 7x7
- Деякі простори на полі вкриті скелями
- Ви не можете розмістити квіти на скелях
- Черга також може містити лопату, яку можна використовувати для переміщення будь-якої розміщеної квітки на незайнятий простір
- Ви повинні використовувати лопату, але насправді не потрібно переміщати квітку: цілком законно розмістити її прямо там, де вона прийшла
- У черзі також може бути кольоровий метелик. Коли ви використовуєте цього метелика на квітці, то квітка набуває кольору метелика
- Застосування метелика до квітки з двома кольорами призводить до того, що квітка набуває лише одного кольору, а саме кольору метелика
- Можна пустити метелика на порожній простір або на квітку, яка вже має цей колір
- Очищення поля не виграє гру
Мета вирішувача проста: знайти спосіб спорожнити чергу з якомога більше пробілів на ігровому полі. В основному, AI грає гру для мене. Вихід solver - це список із знайденими рухами. Мене не цікавить оцінка, але в тому, щоб вижити якомога довше, тому мене цікавлять кроки, які залишають якомога більше відкритих просторів.
Зайве говорити, що простір пошуку швидко зростає, чим більша кількість черги стає, тому груба сила не підлягає. Черга починається з 15, і зростає з 5 кожні два-три рівні, якщо я добре пам’ятаю. І, звичайно, розміщення першої квітки на (0,0), а другу на (0,1) відрізняється від розміщення першого на (1,0), а другого на (0,0), особливо коли поле вже заселене квітами з більш раннього раунду. Таке просте рішення може змінити його чи ні.
У мене такі питання:
- Що це за проблема? (подумайте, що продавець подорожей, рюкзак чи якась інша комбінаторна проблема). Знаючи це, це може зробити мій Google-фу кращим моментом.
- Який алгоритм може швидко дати мені хороші результати?
Щодо останнього: Спочатку я спробував написати власний евристичний алгоритм (в основному: як би я його вирішив, якби я знав чергу?), Але це призводить до безлічі крайових випадків та підрахунку балів, які я можу пропустити.
Я думав про використання генетичного алгоритму (тому що я, принаймні, знаю, як це використовувати ...), але у мене виникають певні проблеми з вирішенням питання щодо бінарного представлення дошки. Тоді виникає проблема кросовера, але це можна вирішити за допомогою впорядкованого оператора кросовера або подібного типу операцій.
Я здогадуюсь, що розв’язувач повинен завжди знати конфігурацію плати та чергу, яку вона намагається спорожнити.
Я знаю ще декілька інших евристичних алгоритмів, таких як нейронні мережі та нечіткі логічні системи, але мені бракує досвіду, щоб знати, який із них найкраще застосувати, чи є інші, які краще підходять для виконання задачі.