Швидка нейронна мережа для кожного

Необхідно написати систему, яка зможе приймати рішення за персонажа, який може зустріти одного або декілька ворогів. Системі може бути відомо:

здоров'я персонажа в процентах;

Відповідь має бути у вигляді одного з дій:

ховатися (для раптової атаки);

нічого не робити.

Для навчання складемо таблицю #xAB; уроків # xBB ;:

Здоров'я пістолет Вороги Дія

50% 1 + 1 Атакувати

90% 1 2 Атакувати

80% 0 1 Атакувати

30% 1 + 1 Ховатися

60% 1 2 Ховатися

40% 0 1 Ховатися

Тепер навчимо нашу ІНС і збережемо її в файл:

public static void main (String [] args)

// Для складання нової ІНС необхідно створить список шарів

List layerList = new ArrayList();

layerList.add (Layer.create (3, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));

layerList.add (Layer.create (16, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));

layerList.add (Layer.create (4, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));

Fann fann = new Fann (layerList);

// Створюємо тренера і визначаємо алгоритм навчання

Trainer trainer = new Trainer (fann);

/ * Проведемо навчання взявши уроки з файлу, з максимальним кількістю

циклів 100000, показуючи звіт кожну 100ю ітерацію і добиваємося

помилки менше 0.0001 * /

trainer.train (new File ( "train.data"). getAbsolutePath (), 100000, 100, 0.0001f);

ІНС складається з шарів нейронів. Перший шар - це нейрони #xAB; рецептори # xBB; або нейрони вхідних даних. Останній шар нейронів вихідних даних. Все решта - це приховані шари. У нашому випадку перший шар має 3 нейрона:

рівень здоров'я (0.1-1.0);

наявність зброї (1-є, 0-нету);

Об'єкт класу Fann це і є нейронна мережа, яка створюється на основі створених раніше шарів.

Об'єкт класу тренер инкапсулирует алгоритми навчання нейронної мережі переданої при створенні тренера. Після навчання не забуваємо зберегти її в файл.

Для перевірки нашого навчання скористаємося наступним кодом:

public static void main (String [] args)

Fann fann = new Fann ( "ann");

1. Кількість умов може бути не статичним. Тобто наприклад, в деяких випадках нам не важлива наявність пістолета - результат від нього не залежить. Відповідно потрібно це якось враховувати і спростити алгоритм. Це збільшить швидкість прийняття рішення.

2. Що робити, якщо є такі, що суперечать один одному уроки? На вскидку, рішення можна вибирати виходячи з теорії ймовірності: наприклад, якщо при однакових вхідних умовах 2 рази ми повинні "атакувати" і 1 раз "бігти", то функція повинна в 66.6% випадків повернути "атакувати". Тобто потрібна рандомних!

3. Система не враховує накопичений досвід (кількість уроків). Припустимо, у нас був всього 1 урок, який при наявності пістолета і двох супротивників повертав "атакувати" і 1000 уроков "бігти". Тобто більше уроків з пістолетом взагалі не було. І ось коли виникне ситуація: є пістолет і всього 1 противник - функція може повернути "бігти", так як зсув буде в сторону "бігти". Ми запам'ятаємо цей досвід і ще більше посилимо положення. У підсумку наш бот буде схильний до боягузтва.

А якщо спрощено - то вся завдання зводиться до знаходження такої функції F

для набору відомих (x) = y

Всякі там новомодні слівця типу "нейронні мережі" і "штучний розум" - зводяться до звичайної задачі апроксимації! ))

Розкрити гілка 1

Нейросеть не зовсім так працюють, їй згодовують хмару даних всіх ситуацій, а вона підлаштовує і змінює себе, щоб догодити всім случаям.І структура у неї буде простіше, ніж у одній функціі.Нейросеть-купа нейронів-програм, у кожного нейрона по кілька входів , зв'язків з іншими нейронами, і один вихід, що йде до іншого нейрону.Структурно і з боку розрахунків це-простіше, ІМХО.

Схожі статті