Доброй ночи!
Решил немного поиграться в тестовые проекты и попробовать решить задачу, при помощи нейросети.
Скажу сразу, что да, я понимаю, что эту задачу можно решить просто алгоритмически - написав скрипт который будет давать в целом тот же результат. Но это же не так интересно + хочется изучить какую-то новую технологию :)
Я хочу научить сеть выбирать оптимального пользователя для задачи.
Так как, работаю я обычно с JS - реализовывать тоже буду на нем же.
Brain.js показался самым простым и доступным решением, которым я и воспользовался. Если есть альтернативы, с радостью рассмотрю ссылочки на них.
Задачу я себе поставил вот такую:
Сеть должна выбрать из коллекции пользователей того, который максимально будет подходить к выполнению задачи по 8 параметрам.
Собственно пользователь выглядит примерно так:
const user = {
// Данные юзера
id: 1,
name: 'Вася Пупкин',
// Тип пользователя
type: 'Content',
// Категория его работы
category: 'Games',
// Основные направления по тегам
tags: ['tag1', 'tag2'],
// Количество всех заявок
allApplications: 31,
// Количество закрытых заявок
doneApplications: 28,
// В каких заявках уже участвует
alreadyChoosen: [1,2,3],
// Сообщил о конфликтах
conflicts: [1,2],
// Был снят с таких заявок
fierd: [3],
}
Дальше у меня приходит объект к которому, собственно сеть и должна выбрать исполнителя. Он будет выглядеть вот так:
const application = {
// Данные заявки
id: 1,
name: 'И как ты до такого докатился?!',
data: '...',
// Собственно поля которые есть у каждого пользователя
type: 'Content',
category: 'Games',
tags: ['tag1', 'tag2', 'tag3']
}
Соответственно, дальше стоит вопрос обучения сети.
Если я правильно понимаю механику работы, то мне нужно составить коэффициенты по каждому из параметров и на выход дать бал в виде нужного юзера.
Примерно так:
const users = [...];
const applications = [...]
const trainingData = applications.map( application => {
return {
input: {
users: users.map( user => ({
// Каждый метод возвращает совпадение юзера по данному условию от 0 до 1
type: getTypeCoefficient( user, application),
category: getCategoryCoefficient( user, application ),
tags: getTagsCoefficient( user, application ),
allApplications: getAppAppsCoefficient( user ),
doneApplications: getDoneAppsCoefficient( user ),
alreadyChoosen: isAlreadyChoosen( user, application),
conflicts: isHaveConflicts( user, application),
// Насколько вообще возможно объяснить сети, что если например пользователь сам себя удалил с заявки
// что дальше все остальные пункты не особо имеют значения? Просто передавать только одно условие в
// инпут этого юзера?
fired: isFired( user, application )
}))
},
output: {
// Допустим, что для обучения есть массив данных в которых уже выбран релевантный юзер
[getValidUserForApplication( application )]: 1
}
}
});
net.train( trainingData );
// Пока не работает :)
net.run({
users: [...users]
});
Если получится этот пункт, хочу сюда еще прикрутить БД, чтобы пользователь сам мог научить сеть выбирать правильного исполнителя. И посмотреть насколько хорошо оно будет работать при выборке, например в 1000 правильных комбинаций?
Собственно, насколько вообще релевантно использовать нейронные сети для таких задач и в правильном ли направлении я двигаюсь?)