#!/usr/bin/perl
use AI::NNFlex::Backprop;
use AI::NNFlex::Feedforward;
use AI::NNFlex::Dataset;
use Term::ReadKey;
ReadMode 4; # Turn off controls keys
# Генерация чисел
sub next_num
{
# От 0 до 36
return int(rand(37));
}
# Черное?
sub is_black
{
$element = shift;
if (grep {$_ eq $element} (2, 4, 6, 8, 10, 11, 13 ,15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35)) {
return 1;
}
return 0;
}
# Красное?
sub is_red
{
$element = shift;
if (grep {$_ eq $element} (1, 3 ,5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36)) {
return 1;
}
return 0;
}
# Создаем сеть
my $network = AI::NNFlex::Backprop->new(
learningrate=>.0001,
fahlmanconstant=>0,
randomweights=>1,
momentum=>0.3,
bias=>0);
# Вход
$network->add_layer(nodes=>37,
activationfunction => "sigmoid");
# Скрытый слой
$network->add_layer(nodes=>37,
activationfunction => "sigmoid");
# Выход
$network->add_layer(nodes=>1,
activationfunction => "sigmoid");
$network->init();
# Начальные данные - требуется 37 чисел, как в первом слое
# Данные приводятся к числам с плавающей запятой от 0 до 1
my $init_data = [];
for ( my $i = 0; $i < 37; $i++ ) {
push (@{$init_data}, next_num() / 36);
}
$output_num = next_num();
my $dataset = AI::NNFlex::Dataset->new([
$init_data, [$output_num / 36],
]);
# Баланс
my $balance = 0;
# Спины
my $spin = 1;
# Главный цикл - выход из него по ЛЮБОЙ клавише
while (not defined ($key = ReadKey(-1))) {
my $err = 10;
# Обучаем за 20 итераций
for ( my $i = 1; $i <= 20; $i++ ) {
$err = $dataset->learn($network);
}
# Удаляем первое число из массива
shift(@{$init_data});
# Вставляем в конец то число, которое было на выходе
push(@{$init_data}, $output_num / 36);
# Получаем следующее ("дилер крутит рулетку")
$output_num = next_num();
# Получаем прогноз нейронной сети
$next_num = int($network->run($init_data)->[0] * 36);
if ($next_num != 0) {
# Мы ставим на красное или черное. На ноль никогда не ставим
if (is_red($next_num) && is_red($output_num)) {
$balance += 1;
} elsif (is_black($next_num) && is_black($output_num)) {
$balance += 1;
} else {
$balance -= 1;
}
}
print "Error = $err. Num: " . $next_num . ". Dealer num: " . $output_num . ". Spin $spin. Balance: $balance\n";
# Пересоздаем тренировочные данные
$dataset = AI::NNFlex::Dataset->new([
$init_data, [$output_num / 36],
]);
# На следующий спин!
$spin++;
}