Вступление
Сегодня (28.11.2024) началось тестирование первой beta-сборки модели машинного обучения Millennium, разработанного под работу с delta-based значениями (в основном для анти-читов).
Как и в других моделях, Millennium принимает табличные данные. На каждый столбец в таблице модель выделяет 4 типажа размышлений - от абстрактного до самого точного, что позволяет модели размышлять как человек. Сама работа с моделью выполнена максимально просто.
Начинаем работу
Можно держать даже несколько моделей, но пока нам это не нужно…
Работа с моделью начинается через класс FactoryML, где можно:
- Создать новую модель
- Загрузить модель из файла (рекомендуется использовать при старте модели, если файл не найден, то создается просто новая модель)
- Выгрузить модель с памяти.
А сама модель представлена в виде класса ModelML, давайте её получим:
ModelML modelMl = FactoryML.loadFromFile(id, fileName);
Если файл не найден, то загрузит пустую модель
Заполним базовыми данными:
ModelML modelMl = FactoryML.loadFromFile(0, model.dat);
Файл модели хранится нативно в .dat.
Теперь мы можем получить нашу модель этим методом:
ModelML modelMl = FactoryML.getModel(0);
Дальше нужно работать с классом ModelML для обучения.
Обучение
Обучение начинается с метода в ModelML:
learnByData(List<ObjectML> o, boolean isMustBeBlocked)
ObjectML хранит в себе массив с числами Double, проще говоря 1 столбец (не менее 50 чисел).
Мы можем обучать модель 2 вещам:
- То, что нормально ( isMustBeBlocked == false )
- То, что должно быть заблокировано ( isMustBeBlocked == true )
Рекомендуется обучать с 1 по 2.
Давайте обучим модель по нашим поворотам yaw / pitch:
boolean learning = true;
boolean hackLearning = false; // true - если обучаем модель тому, как поворачивает Killaura
if (this.rotations.size() >= 60) { // 60 чисел в столбце
ObjectML yaw = new ObjectML(new ArrayList<>());
ObjectML pitch = new ObjectML(new ArrayList<>());
{
for (Vec2 vec2 : this.rotations) {
yaw.getValues().add(vec2.getX());
pitch.getValues().add(vec2.getY());
}
if (learning) {
FactoryML.getModel(0).learnByData(Arrays.asList(yaw, pitch), hackLearning);
FactoryML.getModel(0).saveToFile("model.dat"); // сохранение модели
}
}
При обучении в консоль будет выводиться что-то типо:
После обучения модели обычному поведению, ставим:
boolean hackLearning = true;
И уже обучаем модель работе Killaura, используя разные читы.
Рекомендую:
обучить модель не менее 2000 паттернов обычного поведения.
обучить модель не менее 300 паттернов читерского поведения.
Дальше можно приступить к обнаружению читов.
Обнаружение
Мы обучили модель, у нас есть файл с моделью.
Теперь давайте регулярно передавать модели данные:
if (this.rotations.size() >= 60) {
ObjectML yaw = new ObjectML(new ArrayList<>());
ObjectML pitch = new ObjectML(new ArrayList<>());
{
for (Vec2 vec2 : this.rotations) {
yaw.getValues().add(vec2.getX());
pitch.getValues().add(vec2.getY());
}
if (learning) { // Мы не обучаем модель
FactoryML.getModel(0).learnByData(Arrays.asList(yaw, pitch), hackLearning);
FactoryML.getModel(0).saveToFile("model.dat");
} else { // Поэтому код будет выполняться здесь
ResultML resultML = FactoryML.getModel(0).checkData(Arrays.asList(yaw, pitch));
// дальнейшие операции
}
}
}
В итоге мы получаем результат в ResultML:
public int UNUSUAL; // Необычно (абстрактный уровень)
public int STRANGE; // Странно
public int SUSPECTED; // Подозрительно
public int SUSPICIOUSLY; // Обнаружено (точный уровень)
Мы можем получить эти значения с полученного класса ResultML, а дальше выводы уже делайте по ситуации. На каждый уровень возлагается свой VL.
Это основы работы с моделью Millennium. Возможно, функционал будет дополняться.