Можно получить доступ к следу от Объекта исключения. Видеть весь след:
p e.backtrace
Это будет содержать массив файлов и номеров строки для стека вызовов. Для простого сценария как тот в Вашем вопросе это просто содержало бы одну строку.
["/Users/dan/Desktop/x.rb:4"]
, Если Вы хотите номер строки, можно исследовать первую строку следа и извлечь значение после двоеточия.
p e.backtrace[0].split(":").last
В общем, да, вы можете сделать мозг умнее, используя методы генетических алгоритмов.
Случайность или мутация играет важную роль в генетическом программировании.
Мне нравится этот учебник, Генетические алгоритмы: крутое имя и чертовски просто .
(В примерах используется Python, но понять их несложно)
If you want to approach this problem like a genetic algorithm, you will need an entire population of "brains". Then evaluate them against each other, either every combination or use a tournament style. Then select the top X% of the population and use those as the parents of the next generation, where offspring are created via mutation (which you have) or genetic crossover (e.g., swap rows or columns between two "brains").
Also, if you do not see any evolutionary progress, you may need more than just win/loss, but come up with some kind of point system so that you can rank the entire population more effectively, which makes selection easier.
Взгляните на Neuro Evolution of Augmenting Tologies (NEAT). Причудливый акроним, который в основном означает эволюцию нейронных сетей - как их структуру (топологию), так и веса соединений. Я написал реализацию .Net под названием SharpNEAT, которую вы, возможно, захотите посмотреть. В SharpNEAT V1 также есть эксперимент «крестики-нолики».