Tôi đang xây dựng một hệ thống ở Clojure tiêu thụ các sự kiện theo thời gian thực và tác động lên chúng theo số lượng tin nhắn tương tự đã nhận được gần đây. Tôi muốn thực hiện điều này bằng cách sử dụng một điểm số recency dựa trên Newton làm mát.Bản đồ truy cập trong clojure bằng cách sử dụng Newton cooling
Nói cách khác, khi một sự kiện đến, tôi muốn có thể gán cho nó điểm số từ 1.0 (chưa bao giờ xảy ra trước đó hoặc "nhiệt độ môi trường" trong phương trình Newton) và 10.0 (nóng nóng nóng) trong phút vừa qua).
Tôi có ý tưởng mơ hồ về cấu trúc dữ liệu này - mỗi "loại sự kiện" là khóa bản đồ và mọi giá trị bản đồ phải chứa một số dấu thời gian cho các sự kiện trước đó và có thể là mức trung bình hiện tại " nhiệt "cho loại sự kiện đó, nhưng tôi không thể tìm ra cách để bắt đầu thực hiện vượt quá điều đó. Cụ thể là tôi đang gặp khó khăn trong việc tìm ra cách để đi từ phương trình thực tế của Newton, đó là rất chung chung, và áp dụng nó cho kịch bản cụ thể này.
Có ai có bất kỳ con trỏ nào không? Ai đó có thể đề xuất một thuật toán "thuật toán điểm số" đơn giản hơn để tôi bắt đầu, điều đó có thể được thay thế bằng cách làm nguội Newton xuống đường?
EDIT: Đây là một số mã clojure! Nó đề cập đến các sự kiện như các chữ cái nhưng rõ ràng có thể được định hướng lại để lấy bất kỳ loại đối tượng nào khác.
(ns heater.core
(:require [clojure.contrib.generic.math-functions :as math]))
(def letter-recency-map (ref {}))
(def MIN-TEMP 1.0)
(def MAX-TEMP 10.0)
;; Cooling time is 15 seconds
(def COOLING-TIME 15000)
;; Events required to reach max heat
(def EVENTS-TO-HEAT 5.0)
(defn temp-since [t since now]
(+
MIN-TEMP
(*
(math/exp (/
(- (- now since))
COOLING-TIME))
(- t MIN-TEMP))))
(defn temp-post-event [temp-pre-event]
(+ temp-pre-event
(/
(- MAX-TEMP temp-pre-event)
EVENTS-TO-HEAT)))
(defn get-letter-heat [letter]
(dosync
(let [heat-record (get (ensure letter-recency-map) letter)]
(if (= heat-record nil)
(do
(alter letter-recency-map conj {letter {:time (System/currentTimeMillis) :heat 1.0}})
MIN-TEMP)
(let [now (System/currentTimeMillis)
new-temp-cooled (temp-since (:heat heat-record) (:time heat-record) now)
new-temp-event (temp-post-event new-temp-cooled)]
(alter letter-recency-map conj {letter {:time now :heat new-temp-event}})
new-temp-event)))))
+1 cho một câu hỏi hay. Tôi sẽ quan tâm để xem câu trả lời bạn nhận được. –
+1 quá. Và chỉ cần thêm thẻ 'thuật toán'. – 4e6