Unë jam duke ndërtuar një sistem në Clojure që konsumon ngjarjet në kohë reale dhe vepron sipas tyre sipas numrit të mesazheve të ngjashme që janë marrë kohët e fundit. Do të doja ta zbatoja këtë duke përdorur një rezultat të fundit të bazuar në ftohjen Njutoniane.
Me fjalë të tjera, kur një ngjarje vjen, unë dua të jem në gjendje t'i caktoj një rezultat midis 1.0 (asnjëherë më parë, ose "temperatura e ambientit" në ekuacionin e Njutonit) dhe 10.0 (e nxehtë e nxehtë, ka ndodhur disa herë në minutën e kaluar ).
Unë kam një ide të paqartë se si duket kjo strukturë e të dhënave - çdo "lloj i ngjarjes" është një çelës harte dhe çdo vlerë e hartës duhet të përmbajë disa vula kohore për ngjarjet e mëparshme dhe ndoshta një mesatare të rrjedhës së "nxehjes" aktuale për këtë lloji i ngjarjes, por nuk mund ta kuptoj plotësisht se si të filloj zbatimin përtej kësaj. Konkretisht, unë kam vështirësi të kuptoj se si të shkoj nga ekuacioni aktual i Njutonit, i cili është shumë i përgjithshëm, dhe ta zbatoj atë në këtë skenar specifik.
A ka dikush ndonjë tregues? A mund të sugjerojë dikush një "algoritëm të rezultateve të fundit" më të thjeshtë për të më filluar, që mund të zëvendësohet nga ftohja Njutoniane në rrugë?
EDIT: Këtu është një kod clojure! Ai i referohet ngjarjeve si letra, por padyshim që mund të ripërdoret për të marrë çdo lloj objekti tjetër.
(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)))))