Programim dhe zhvillim, javascript, python, php, html

Harta e fundit në clojure duke përdorur ftohjen Njutoniane

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)))))
04.10.2011

  • +1 për një pyetje të mrekullueshme. Do të jem i interesuar të shoh përgjigjet që do të merrni. 04.10.2011
  • +1 gjithashtu. Dhe sapo shtova etiketën algorithm. 04.10.2011

Përgjigjet:


1

Në mungesë të ndonjë ngjarjeje, zgjidhja e ekuacionit të ftohjes është zbërthimi eksponencial. Thuaj se T_0 është temperatura në fillim të një periudhe ftohjeje dhe dt është hapi kohor (i llogaritur nga koha e sistemit ose çfarëdo tjetër) që kur e vlerësuat temperaturën të jetë T_0:

T_no_events(dt) = T_min + (T_0 - T_min)*exp(- dt / t_cooling)

Meqenëse ngjarjet tuaja janë impulse diskrete dhe ju keni një temperaturë maksimale, dëshironi një raport të caktuar për ngjarje:

T_post_event = T_pre_event + (T_max - T_pre_event) / num_events_to_heat

Disa shënime:

  • t_cooling është koha që gjërat të ftohen me një faktor 1/e = 1/(2.718...).

  • num_events_to_heat është numri i ngjarjeve që kërkohen për të pasur një efekt të krahasueshëm me T_max. Ndoshta duhet të jetë një vlerë pozitive mesatarisht e madhe (të themi 5.0 ose më shumë?). Vini re se nëse num_events_to_heat==1.0, çdo ngjarje do të rivendosë temperaturën në T_max, e cila nuk është shumë interesante, kështu që vlera duhet të jetë së paku më e madhe se një.

  • Teorikisht, si ngrohja ashtu edhe ftohja nuk duhet të arrijnë kurrë temperaturat maksimale dhe minimale, respektivisht (duke supozuar se parametrat janë vendosur si më sipër dhe se po filloni diku në mes). Sidoqoftë, në praktikë, natyra eksponenciale e procesit duhet të afrohet mjaftueshëm, pasi nuk ka dallim ...

  • Për ta zbatuar këtë, ju duhet vetëm të ruani vulën kohore dhe temperaturën e përditësimit të fundit. Kur merrni një ngjarje, bëni një hap ftohjeje, më pas një ngjarje ngrohjeje dhe përditësoni me temperaturën dhe vulën e re kohore.

  • Vini re se pyetjet vetëm për lexim nuk kërkojnë përditësim: thjesht mund të llogaritni ftohjen që nga përditësimi i fundit.

04.10.2011
  • t_cooling është një konstante kohore - koha për të ftohur në 36.8% të delta origjinale. Kjo është një përgjigje e shkëlqyer. Ai tregon një zotërim të mirë të fizikës së ftohjes së një mase pikë dhe e zbaton atë në një mënyrë të re. 04.10.2011
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..