Еще один способ решить эту проблему - использовать генетические алгоритмы .Ваша популяция будет начинаться как случайные операторы, вставленные между элементами вашего массива.
Пусть S
будет число, которое вам нужно получить.Ваша фитнес-функция может быть |S - Value(E[i])|
, где Value(E[i])
- это значение после оценки i
-ого выражения в вашем населении.
Ваш оператор мутации может просто поменять один оператор на другой, и ваша функция кроссовераможно комбинировать операторы слева от выражения с операторами справа от другого выражения.
Возможно, вы сможете найти более сложные функции, которые работают лучше, генетические алгоритмы требуют некоторой работы по угадыванию для достижения наилучших результатов.
Я понятия не имею, как это можно сравнить с грубой силой, но это другое решение, и я думаю, что это выделит вас на собеседовании, поскольку каждый сможет увидеть решение с помощью грубой силы.
Если вам нужно только достаточно хорошее решение (что-то не совсем S
, но достаточно близко), то это определенно должно быть быстрее, чем грубая сила.В нескольких реализованных мною генетических алгоритмах я заметил, что они быстро приближаются к решению, близкому к оптимальному, но довольно медленны, а иногда даже застревают, если вам нужно оптимальное решение.