Nano Hash - криптовалюты, майнинг, программирование

императив к функционалу: столкновение n тел

Я новичок в функциональном программировании, но знаком с императивным программированием. У меня возникли проблемы с переводом фрагмента кода cpp, связанного с одновременным обновлением двух объектов (контекст представляет собой симуляцию n-тел).

Примерно так на С++:

for (Particle &i: particles) {
  for (Particle &j: particles) {
     collide(i, j) // function that mutates particles i and j
  }
}

Я перевожу это на Ocaml с неизменяемыми объектами и неизменяемыми списками. Сложность в том, что мне нужно заменить два объекта одновременно. Пока у меня это:

List.map (fun i ->
  List.map (fun j ->
    let (new_i, new_j) = collide(i, j) in // function that returns new particles i, j
    // how do i update particles with new i, j?
  ) particles
) particles

Как заменить оба объекта в списке одновременно?


  • Как именно выглядит C++? Действительно ли collide мутирует обе частицы? Если да, действительно ли вы хотите столкнуть все пары дважды (один раз как collide(a, b) и один раз как collide(b, a))? Также вы хотите столкнуть частицу с самой собой? 02.06.2020

Ответы:


1

Функциональный эквивалент императивного кода так же прост, как:

let nbody f xs =
  List.map (fun x -> List.fold_left f x xs) xs

Это немного более общее, так как я абстрагировал функцию столкновения и сделал ее параметром. Функция f принимает два тела и возвращает состояние первого тела под воздействием второго тела. Например, мы можем реализовать следующую символическую функцию collide,

let symbolic x y = "f(" ^ x ^ "," ^ y ^ ")"

чтобы мы могли видеть результат и ассоциативность применения функции столкновения,

# nbody symbolic [
    "x"; "y"; "z"
];;
- : string list =
["f(f(f(x,x),y),z)"; "f(f(f(y,x),y),z)"; "f(f(f(z,x),y),z)"]

Итак, первый элемент выходного списка — это результат столкновения x с самим x, потом с y, потом с z. Второй элемент является результатом столкновения y с x, y и z. И так далее.

Очевидно, что тело не должно сталкиваться с самим собой, но это можно легко исправить, либо изменив функцию collide, либо отфильтровав входной список до List.fold и удалив текущий вычисляемый элемент. Это оставлено в качестве упражнения.

02.06.2020

2

List.map возвращает новый список. Функция, которую вы предоставляете List.map, может преобразовать элементы из одного типа в другой или просто применить некоторую операцию к тому же типу.

Например, предположим, что вы начинаете со списка целочисленных кортежей.

let int_tuples = [(1, 3); (4, 3); (8, 2)];;

и давайте предположим, что ваша функция обновления принимает целочисленный кортеж и удваивает целые числа:

let update (i, j) = (i * 2, j * 2) (* update maybe your collide function *)

Если вы сейчас сделаете:

let new_int_tuples = List.map update int_tuples

Ты получишь

(* [(2, 6); (8, 6); (16, 4)] *)

Надеюсь это поможет

02.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..