Geneti c Алгоритм временных рядов прогноза для создания начальной популяции - PullRequest
0 голосов
/ 30 марта 2020

Я строю генетический c алгоритм, который делает прогноз временных рядов в регрессионном анализе символов c. Я пытаюсь получить алгоритм, чтобы найти уравнение, которое будет соответствовать основной тенденции данных. (прогнозировать ежемесячные продажи пива)

Идея состоит в том, чтобы использовать выражения типа lisp, которые записывают уравнение в дереве. Это позволяет менять ветку на этапе кроссовера / спаривания.

5* (5 +5)

Написано как:

X = '(mul 5 (add 5 5))'
Y = parser(X) 
y = ['mul', 5, ['add', 5, 5]]

Я хочу знать, как создать начальный набор совокупности, в котором отдельные лица автоматически представляют разные выражения. Где «пригодность» связана с тем, насколько хорошо каждое уравнение соответствует основной тенденции.

Например, один человек может быть: '(добавьте 100 (mul x (sin (mul x 3))))' где x - время в месяцах.

Как автоматически генерировать выражения для моего населения? Я понятия не имею, как это сделать, любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 30 марта 2020

Вы можете легко решить эту проблему с помощью рекурсии и генератора случайных чисел random(), который возвращает (псевдо) случайное float между 0 и 1. Вот некоторый псевдокод:

randomExp() {
    // Choose a function(like mul or add):
    func = getRandomFunction() // Just choose one of your functions randomly.
    arg1 = ""
    rand1 = random()
    // Choose the arguments. You may choose other percentages here depending how deep you want it to be and how many 'x' you want to have.
    if(rand1 < 0.2)
        arg1 = randomExp() // Here add a new expression
    else if(rand1 < 0.5)
        arg1 = "x"
    else
        arg1 = randomConstant() // Get a random constant in a predefined range.
    // Do the same for the second argument:
    arg2 = ""
    …
    …
    // Put everything together and return it:
    return "("+func+" "+arg1+" "+arg2+")"
}

Вы Возможно, вы захотите также ограничить глубину рекурсии, поскольку это может вернуть вам теоретически бесконечно длинное выражение.

...