0 [
set pomerny-vykon (vykon-radiatoru / pocet-policek)
]
; kontrola zda topit
ifelse prumerna-teplota < ciliova-teplota [
let dodane-teplo pomerny-vykon * dt
set zmena-energie zmena-energie + dodane-teplo
set pcolor orange
if aktualni-byt = "1" [ set spotreba-radiator-1 spotreba-radiator-1 + dodane-teplo ]
if aktualni-byt = "2" [ set spotreba-radiator-2 spotreba-radiator-2 + dodane-teplo ]
if aktualni-byt = "3" [ set spotreba-radiator-3 spotreba-radiator-3 + dodane-teplo ]
if aktualni-byt = "4" [ set spotreba-radiator-4 spotreba-radiator-4 + dodane-teplo ]
]
[
set pcolor white
]
]
]
]
; sireni tepla mezi patchi
ask links [
let t1 [teplota] of end1
let t2 [teplota] of end2
let k1 [tepelna-vodivost] of end1
let k2 [tepelna-vodivost] of end2
let k (k1 + k2) / 2
let rozdil-teplot t1 - t2
let vykon-prenosu k * rozdil-teplot
let tok-tepla vykon-prenosu * dt
; ztraty
let id1 [ [id] of patch-here ] of end1
let id2 [ [id] of patch-here ] of end2
; pocitani ztrat tepla do bilance
if id1 != "S" and id2 = "S" [ if tok-tepla > 0 [ set celkem-ztraty-tepla celkem-ztraty-tepla + tok-tepla ] ]
if id1 = "S" and id2 != "S" [ if tok-tepla < 0 [ set celkem-ztraty-tepla celkem-ztraty-tepla - tok-tepla ] ]
;ztraty pro byty
let pk1 [id-mistnost] of end1
let pk2 [id-mistnost] of end2
if member? pk1 "1234" and pk2 = "X" and tok-tepla > 0 [
if pk1 = "1" [ set ztraty-byt-1 ztraty-byt-1 + tok-tepla ]
if pk1 = "2" [ set ztraty-byt-2 ztraty-byt-2 + tok-tepla ]
if pk1 = "3" [ set ztraty-byt-3 ztraty-byt-3 + tok-tepla ]
if pk1 = "4" [ set ztraty-byt-4 ztraty-byt-4 + tok-tepla ]
]
if member? pk2 "1234" and pk1 = "X" and tok-tepla < 0 [
if pk2 = "1" [ set ztraty-byt-1 ztraty-byt-1 - tok-tepla ]
if pk2 = "2" [ set ztraty-byt-2 ztraty-byt-2 - tok-tepla ]
if pk2 = "3" [ set ztraty-byt-3 ztraty-byt-3 - tok-tepla ]
if pk2 = "4" [ set ztraty-byt-4 ztraty-byt-4 - tok-tepla ]
]
ask end1 [ set zmena-energie zmena-energie - tok-tepla ]
ask end2 [ set zmena-energie zmena-energie + tok-tepla ]
]
aktualizuj-venkovni-teplotu
; aplikovani zmen
ask turtles [
set energy energy + zmena-energie
set teplota energy / (hmotnost * tepelna-kapacita)
]
; aktualizace labelu jednou za X ticku pro snizeni zateze
if ticks mod 120 = 0 [
ask turtles [
set plabel precision (teplota - 273.15) 1
]
]
obarvi-turtles
aktualizuj-spokojenost
aktualizuj-chovani
set time time + dt
set fps-tick-counter fps-tick-counter + 1
if fps-tick-counter >= 30 [
let elapsed timer - fps-last-time
if elapsed > 0 [ set fps fps-tick-counter / elapsed ]
set fps-last-time timer
set fps-tick-counter 0
]
update-plots
tick
; zastaveni simulace
if time >= delka-sezony-dnu * 86400 [
stop
user-message "Simulace dokončena"
]
end
; obarveni turtles ve stylu termokamery
to obarvi-turtles
ask turtles [
if radiator [
set shape "square"
]
; prevod na C
let teplota-celsia teplota - 273.15
; obarveni podle teploty
set color barva-termokamery teplota-celsia
]
end
to load-file
if not file-exists? "data.csv" [
user-message "Soubor data.csv nebyl nalezen!"
stop
]
file-open "data.csv"
; Začneme vykreslovat odshora (nejvyšší Y souřadnice v NetLogu)
let aktualni-y max-pycor
while [not file-at-end?] [
let radek (csv:from-row file-read-line ";")
let aktualni-x min-pxcor
foreach radek [ znak ->
if aktualni-x <= max-pxcor and aktualni-y >= min-pycor [
ask patch aktualni-x aktualni-y [
;preovod na string
let hodnota (word znak)
if member? "S" hodnota [set id "S"]
if member? "X" hodnota [set id "X"]
if member? "1" hodnota [set id "1"]
if member? "2" hodnota [set id "2"]
if member? "3" hodnota [set id "3"]
if member? "4" hodnota [set id "4"]
if member? "R" hodnota [set id "R"]
]
]
set aktualni-x aktualni-x + 1
]
set aktualni-y aktualni-y - 1
]
file-close
obarvi-mistnosti
end
to obarvi-mistnosti
ask patches with [ id = "S" ] [set pcolor sky]
ask patches with [ id = "X" ] [set pcolor gray]
ask patches with [ id = "1" ] [set pcolor red]
ask patches with [ id = "2" ] [set pcolor blue]
ask patches with [ id = "3" ] [set pcolor green]
ask patches with [ id = "4" ] [set pcolor (orange + 2)]
ask patches with [ id = "R" ] [set pcolor white]
end
; formatovani casu
to-report formatuj-cas
let elapsed-days floor (time / 86400)
let hodiny floor ((time mod 86400) / 3600)
let minuty floor ((time mod 3600) / 60)
; Výpočet kalendářního datumu od počátečního data
let d zacatecni-den + elapsed-days
let m zacatecni-mesic
let delky-mesicu [31 28 31 30 31 30 31 31 30 31 30 31]
while [d > item (m - 1) delky-mesicu] [
set d d - item (m - 1) delky-mesicu
set m m + 1
if m > 12 [ set m 1 ]
]
report (word d "." m ". " hodiny " h, " minuty " m")
end
to-report prumerna-teplota-pokoje [byt-id]
let mistnost-patches turtles with [id-mistnost = (word byt-id) and not radiator]
if not any? mistnost-patches [ report 0 ]
report precision (mean [teplota - 273.15] of mistnost-patches) 1
end
; spravedlive naklady
to-report vypocti-fer-naklady [byt-id]
let celkova-plocha count turtles with [member? id-mistnost "1234" and not radiator]
let plocha-bytu count turtles with [id-mistnost = (word byt-id) and not radiator]
let celkova-spotreba (spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4)
if celkova-spotreba = 0 [ report 0 ]
let spotreba-bytu 0
if byt-id = 1 [ set spotreba-bytu spotreba-radiator-1 ]
if byt-id = 2 [ set spotreba-bytu spotreba-radiator-2 ]
if byt-id = 3 [ set spotreba-bytu spotreba-radiator-3 ]
if byt-id = 4 [ set spotreba-bytu spotreba-radiator-4 ]
; Výpočet: (Plocha bytu / Celková plocha) * Základní_Podíl + (Moje spotřeba / Celková spotřeba) * Spotřební_Podíl
let fer-podil ( (plocha-bytu / celkova-plocha) * podil-zakladni-slozka ) + ( (spotreba-bytu / celkova-spotreba) * podil-spotrebni-slozka )
report precision (fer-podil * 100) 1 ; v procentech
end
; Pomocná funkce pro výpočet spokojenosti jednoho pokoje
to-report spocitej-spokojenost-bytu[byt-id cilova-teplota]
let mistnost-patches turtles with [id-mistnost = byt-id and not radiator]
; Pojistka, pokud by místnost neexistovala
if not any? mistnost-patches [ report 0 ]
; Získáme reálnou průměrnou teplotu ve stupních Celsia
let prumerna-teplota mean [teplota - 273.15] of mistnost-patches
; Spočítáme absolutní rozdíl mezi realitou a cílem
let rozdil abs (prumerna-teplota - cilova-teplota)
; Výpočet: 100 % mínus penalizace (10 % za každý 1 °C rozdílu)
let vysledek 100 - (rozdil * 10)
; Omezíme výsledek, aby nešel do mínusu nebo nad 100
if vysledek < 0 [ set vysledek 0 ]
if vysledek > 100 [ set vysledek 100 ]
report vysledek
end
to aktualizuj-spokojenost
set spokojenost-1 spocitej-spokojenost-bytu "1" target-temp-1
set spokojenost-2 spocitej-spokojenost-bytu "2" target-temp-2
set spokojenost-3 spocitej-spokojenost-bytu "3" target-temp-3
set spokojenost-4 spocitej-spokojenost-bytu "4" target-temp-4
set spokojenost-platba-1 spocitej-spokojenost-platby 1
set spokojenost-platba-2 spocitej-spokojenost-platby 2
set spokojenost-platba-3 spocitej-spokojenost-platby 3
set spokojenost-platba-4 spocitej-spokojenost-platby 4
set spokojenost-cena-kwh spocitej-spokojenost-ceny
end
; 5 Kč = 100 %, 20 Kč = 0 %
to-report spocitej-spokojenost-ceny
let referencni-cena 5.0
let maximalni-cena 20.0
let vysledek 100 - ((cena-za-kwh - referencni-cena) / (maximalni-cena - referencni-cena)) * 100
report max (list 0 (min (list 100 vysledek)))
end
to-report spocitej-spokojenost-platby [byt-id]
let total-spotreba spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4
if total-spotreba = 0 [ report 100 ]
let spotreba-bytu 0
if byt-id = 1 [ set spotreba-bytu spotreba-radiator-1 ]
if byt-id = 2 [ set spotreba-bytu spotreba-radiator-2 ]
if byt-id = 3 [ set spotreba-bytu spotreba-radiator-3 ]
if byt-id = 4 [ set spotreba-bytu spotreba-radiator-4 ]
let spotreba-podil (spotreba-bytu / total-spotreba) * 100
let naklady-podil vypocti-fer-naklady byt-id
; Kladný přeplatek = platí více než spotřeboval -> nespokojenost
let preplatek naklady-podil - spotreba-podil
let vysledek 100 - max (list 0 (preplatek * 5))
; Zpetna vazba snizuje teplotu => nespokojenost
; -1 °C snížení = -10 % spokojenosti
let zpetna-vazba-bytu 0
if byt-id = 1 [ set zpetna-vazba-bytu zpetna-vazba-1 ]
if byt-id = 2 [ set zpetna-vazba-bytu zpetna-vazba-2 ]
if byt-id = 3 [ set zpetna-vazba-bytu zpetna-vazba-3 ]
if byt-id = 4 [ set zpetna-vazba-bytu zpetna-vazba-4 ]
set vysledek vysledek - (zpetna-vazba-bytu * 10)
if vysledek < 0 [ set vysledek 0 ]
if vysledek > 100 [ set vysledek 100 ]
report vysledek
end
; prevod teploty na barvu termokamery
to-report barva-termokamery [ teplota-celsia ]
let min-t 5
let max-t 25
if teplota-celsia < min-t [ set teplota-celsia min-t ]
if teplota-celsia > max-t [ set teplota-celsia max-t ]
let t (teplota-celsia - min-t) / (max-t - min-t)
let r 0 let g 0 let b 0
ifelse t < 0.25 [
let pomer (t / 0.25)
set r round (255 * pomer)
set g 0
set b 255
] [
ifelse t < 0.5 [
let pomer ((t - 0.25) / 0.25)
set r 255
set g 0
set b round (255 - (255 * pomer))
] [
ifelse t < 0.75 [
let pomer ((t - 0.5) / 0.25)
set r 255
set g round (255 * pomer)
set b 0
] [
let pomer ((t - 0.75) / 0.25)
set r 255
set g 255
set b round (255 * pomer)
]
]
]
report (list r g b)
end
; vypocet venkovni teploty pro danou hodinu a den roku
to aktualizuj-venkovni-teplotu
let hodina ((time mod 86400) / 3600)
let den-roku (zacatecni-den-roku + floor (time / 86400)) mod 365
; Roční cyklus pro ČR: průměr 9°C, nejchladněji ~15. ledna (den 14), nejteplejší ~15. července (den 195)
; prumerna-teplota-zima = odchylka od normálu (0 = normální rok, záporné = chladnější)
; amplituda-sezony = roční amplituda v °C (výchozí 12)
let sezonni-prumer (9 + prumerna-teplota-zima) - amplituda-sezony * cos (den-roku / 365 * 360)
; Denní cyklus: výkyv +-5°C, maximum ve 14:00
let amplituda-den 5.0
set venkovni-teplota sezonni-prumer + amplituda-den * cos ((hodina - 14) * 15)
let venkovni-teplota-kelvin venkovni-teplota + 273.15
ask turtles-on patches with [id = "S"] [
set energy hmotnost * tepelna-kapacita * venkovni-teplota-kelvin
set zmena-energie 0
]
end
; nastaveni target-temp podle harmonogramu a zpetne vazby
to aktualizuj-termostaty
; den v týdnu, Po = 0, Ne = 6
let den-v-tydnu (floor (time / 86400) + zacatecni-den-tydne) mod 7
let hodina floor ((time mod 86400) / 3600)
let je-vikend? (den-v-tydnu = 5 or den-v-tydnu = 6)
if not manualni-rezim-1 [
ifelse je-vikend? [
ifelse hodina >= 8 and hodina < 22
[ set target-temp-1 22.0 ]
[ set target-temp-1 18.0 ]
] [
ifelse (hodina >= 6 and hodina < 8) or (hodina >= 15 and hodina < 22)
[ set target-temp-1 21.0 ]
[ set target-temp-1 18.0 ]
]
set target-temp-1 max (list 15 (target-temp-1 - zpetna-vazba-1))
]
if not manualni-rezim-2 [
ifelse je-vikend? [
ifelse hodina >= 8 and hodina < 22
[ set target-temp-2 20.0 ]
[ set target-temp-2 17.0 ]
] [
ifelse (hodina >= 19 and hodina < 22)
[ set target-temp-2 20.0 ]
[ set target-temp-2 17.0 ]
]
set target-temp-2 max (list 15 (target-temp-2 - zpetna-vazba-2))
]
if not manualni-rezim-3 [
ifelse je-vikend? [
ifelse hodina >= 7 and hodina < 20
[ set target-temp-3 23.0 ]
[ set target-temp-3 19.0 ]
] [
ifelse (hodina >= 6 and hodina < 8) or (hodina >= 13 and hodina < 20)
[ set target-temp-3 23.0 ]
[ set target-temp-3 19.0 ]
]
set target-temp-3 max (list 15 (target-temp-3 - zpetna-vazba-3))
]
if not manualni-rezim-4 [
ifelse je-vikend? [
ifelse hodina >= 7 and hodina < 22
[ set target-temp-4 24.0 ]
[ set target-temp-4 20.0 ]
] [
ifelse (hodina >= 6 and hodina < 8) or (hodina >= 18 and hodina < 22)
[ set target-temp-4 24.0 ]
[ set target-temp-4 20.0 ]
]
set target-temp-4 max (list 15 (target-temp-4 - zpetna-vazba-4))
]
end
; zpětná vazba na náklady, jednou za den
to aktualizuj-chovani
if not zpetna-vazba [ stop ]
; aktualizace jednou za den
if floor (time / 86400) <= floor ((time - dt) / 86400) [ stop ]
let celkova-plocha count turtles with [member? id-mistnost "1234" and not radiator]
let celkova-spotreba (spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4)
if celkova-spotreba = 0 [ stop ]
let spotreby (list spotreba-radiator-1 spotreba-radiator-2 spotreba-radiator-3 spotreba-radiator-4)
let i 1
foreach spotreby [ spotreba-bytu ->
let plocha count turtles with [id-mistnost = (word i) and not radiator]
let podil-plochy plocha / celkova-plocha
let podil-spotreby spotreba-bytu / celkova-spotreba
let prebytek podil-spotreby - podil-plochy
; tolerance 5%
if i = 1 [
ifelse prebytek > 0.05
[ set zpetna-vazba-1 min (list (zpetna-vazba-1 + citlivost-na-naklady * 0.5) 6.0) ]
[ set zpetna-vazba-1 max (list (zpetna-vazba-1 - 0.2) 0.0) ]
]
if i = 2 [
ifelse prebytek > 0.05
[ set zpetna-vazba-2 min (list (zpetna-vazba-2 + citlivost-na-naklady * 0.5) 6.0) ]
[ set zpetna-vazba-2 max (list (zpetna-vazba-2 - 0.2) 0.0) ]
]
if i = 3 [
ifelse prebytek > 0.05
[ set zpetna-vazba-3 min (list (zpetna-vazba-3 + citlivost-na-naklady * 0.5) 6.0) ]
[ set zpetna-vazba-3 max (list (zpetna-vazba-3 - 0.2) 0.0) ]
]
if i = 4 [
ifelse prebytek > 0.05
[ set zpetna-vazba-4 min (list (zpetna-vazba-4 + citlivost-na-naklady * 0.5) 6.0) ]
[ set zpetna-vazba-4 max (list (zpetna-vazba-4 - 0.2) 0.0) ]
]
set i i + 1
]
end
to uloz-stav
let soubor user-new-file
if soubor = false [ stop ]
; Řádek 1: globální stav simulace (s identifikátorem verze)
let g (list
"STAV_V1"
time
spotreba-radiator-1 spotreba-radiator-2 spotreba-radiator-3 spotreba-radiator-4
celkem-ztraty-tepla
ztraty-byt-1 ztraty-byt-2 ztraty-byt-3 ztraty-byt-4
zpetna-vazba-1 zpetna-vazba-2 zpetna-vazba-3 zpetna-vazba-4
spokojenost-1 spokojenost-2 spokojenost-3 spokojenost-4
spokojenost-platba-1 spokojenost-platba-2 spokojenost-platba-3 spokojenost-platba-4
spokojenost-cena-kwh
)
; Sestavení seznamu řádků: globals + jeden řádek na turtla (xcor ycor energy)
let radky (list g)
ask turtles [
set radky lput (list xcor ycor energy) radky
]
csv:to-file soubor radky
user-message (word "Stav uložen do: " soubor)
end
to nacti-stav
let soubor user-file
if soubor = false [ stop ]
let data csv:from-file soubor
; Ověření formátu souboru
let g item 0 data
if item 0 g != "STAV_V1" [
user-message "Chyba: Neplatný formát souboru (očekáváno STAV_V1)."
stop
]
; Reinicializace světa (zachová nastavení sliderů)
setup
; Obnovení globálních proměnných simulace
set time item 1 g
set spotreba-radiator-1 item 2 g
set spotreba-radiator-2 item 3 g
set spotreba-radiator-3 item 4 g
set spotreba-radiator-4 item 5 g
set celkem-ztraty-tepla item 6 g
set ztraty-byt-1 item 7 g
set ztraty-byt-2 item 8 g
set ztraty-byt-3 item 9 g
set ztraty-byt-4 item 10 g
set zpetna-vazba-1 item 11 g
set zpetna-vazba-2 item 12 g
set zpetna-vazba-3 item 13 g
set zpetna-vazba-4 item 14 g
set spokojenost-1 item 15 g
set spokojenost-2 item 16 g
set spokojenost-3 item 17 g
set spokojenost-4 item 18 g
set spokojenost-platba-1 item 19 g
set spokojenost-platba-2 item 20 g
set spokojenost-platba-3 item 21 g
set spokojenost-platba-4 item 22 g
set spokojenost-cena-kwh item 23 g
; Posun tick counteru na správnou hodnotu (setup volá reset-ticks)
tick-advance (time / dt)
; Obnovení energie a teploty každého turtla podle pozice
foreach but-first data [ radek ->
let tx item 0 radek
let ty item 1 radek
let te item 2 radek
ask turtles-on patch tx ty [
set energy te
set teplota energy / (hmotnost * tepelna-kapacita)
]
]
; Aktualizace venkovní teploty a zobrazení
aktualizuj-venkovni-teplotu
obarvi-turtles
display
update-plots
user-message "Stav úspěšně načten."
end]]>formatuj-casvenkovni-teplota(9 + prumerna-teplota-zima) - amplituda-sezony * cos ((zacatecni-den-roku + floor (time / 86400)) mod 365 / 365 * 360)fpsprumerna-teplota-pokoje 1spotreba-radiator-1 / 3600000spokojenost-1vypocti-fer-naklady 1precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 1 / 100)) 0spokojenost-platba-1zpetna-vazba-1prumerna-teplota-pokoje 2spotreba-radiator-2 / 3600000spokojenost-2vypocti-fer-naklady 2precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 2 / 100)) 0spokojenost-platba-2zpetna-vazba-2prumerna-teplota-pokoje 3spotreba-radiator-3 / 3600000spokojenost-3vypocti-fer-naklady 3precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 3 / 100)) 0spokojenost-platba-3zpetna-vazba-3prumerna-teplota-pokoje 4spotreba-radiator-4 / 3600000spokojenost-4vypocti-fer-naklady 4precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 4 / 100)) 0spokojenost-platba-4zpetna-vazba-4(spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000celkem-ztraty-tepla / 3600000plot prumerna-teplota-pokoje 1plot target-temp-1plot prumerna-teplota-pokoje 2plot target-temp-2plot prumerna-teplota-pokoje 3plot target-temp-3plot prumerna-teplota-pokoje 4plot target-temp-4plot spotreba-radiator-1 / 3600000plot spotreba-radiator-2 / 3600000plot spotreba-radiator-3 / 3600000plot spotreba-radiator-4 / 3600000precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh) 0plot (spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000plot celkem-ztraty-tepla / 3600000plot spokojenost-platba-1plot spokojenost-platba-2plot spokojenost-platba-3plot spokojenost-platba-4plot spokojenost-cena-kwhplot zpetna-vazba-1plot zpetna-vazba-2plot zpetna-vazba-3plot zpetna-vazba-4plot venkovni-teplotaplot (9 + prumerna-teplota-zima) - amplituda-sezony * cos ((zacatecni-den-roku + floor (time / 86400)) mod 365 / 365 * 360)plot spotreba-radiator-1 / 3600000plot spotreba-radiator-2 / 3600000plot spotreba-radiator-3 / 3600000plot spotreba-radiator-4 / 3600000plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 1 / 100)) 0plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 2 / 100)) 0plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 3 / 100)) 0plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 4 / 100)) 0plot vypocti-fer-naklady 1plot vypocti-fer-naklady 2plot vypocti-fer-naklady 3plot vypocti-fer-naklady 4plot 25plot spokojenost-1plot spokojenost-2plot spokojenost-3plot spokojenost-4plot ztraty-byt-1 / 3600000plot ztraty-byt-2 / 3600000plot ztraty-byt-3 / 3600000plot ztraty-byt-4 / 3600000## CO MODEL DĚLÁ?
Model simuluje spravedlivé rozdělení nákladů na vytápění v bytovém domě se čtyřmi byty. Cílem je ukázat, jak fyzikální vlastnosti bytů (poloha, plocha, tepelné ztráty) a chování obyvatel (termostatové nastavení, manuální ovládání topení) ovlivňují skutečnou spotřebu tepla a jak lze tuto spotřebu spravedlivě přepočítat na náklady jednotlivých bytů.
Model vychází z české legislativy (vyhláška č. 269/2015 Sb.) rozdělující náklady na základní složku (40 % podle plochy) a spotřební složku (60 % podle skutečné spotřeby).
## JAK MODEL FUNGUJE?
Dům je reprezentován mřížkou 33×33 políček (patches). Každé obsahuje jeden turtle s fyzikálními vlastnostmi:
- **teplota** – aktuální teplota v Kelvinech
- **hmotnost** a **tepelna-kapacita** – určují tepelnou setrvačnost
- **tepelna-vodivost** – určuje rychlost přenosu tepla mezi sousedy
Každý tick (= 10 sekund) se provede:
1. **Difúze tepla** – pro každou hranu mezi sousedními buňkami se vypočte tok P = k × ΔT a přenese se Q = P × dt tepla.
2. **Regulace radiátorů** – pokud teplota místnosti klesne pod spodní práh termostatu, radiátor se zapne; při dosažení horního prahu se vypne.
3. **Venkovní teplota** – kopíruje kosinusový denní cyklus (maximum ve 14:00).
4. **Statistiky** – akumuluje se spotřeba každého bytu a průběžně se přepočítávají náklady.
Rozvržení místností je načteno ze souboru `data.csv` (byty 1–4, zdi X, venkovní prostor S, radiátory R).
## JAK MODEL POUŽÍVAT?
**Spuštění simulace:**
1. Klikněte **setup** – načte se rozvržení domu z `data.csv` a nastaví se počáteční teploty.
2. Klikněte **go** – spustí se simulační smyčka.
3. Stisknutím **go** znovu simulaci zastavíte.
**Tlačítka:**
- **setup** – inicializuje model (načte `data.csv`, nastaví počáteční teploty).
- **go** – spustí/zastaví simulační smyčku.
- **uloz-stav / nacti-stav** – uloží a obnoví stav světa do/ze souboru `stav`.
**Slidery:**
- **delka-sezony-dnu** – počet dní topné sezóny (10–200, výchozí 100).
- **odchylka-teploty** – posun venkovní teploty oproti výchozímu průměru (−15 až +15 °C); záporné hodnoty simulují chladnější zimu.
- **amplituda-sezony** – amplituda sezónního kolísání teploty (0–20 °C).
- **zacatecni-den-tydne** – den v týdnu na začátku sezóny (0 = pondělí … 6 = neděle).
- **zacatecni-den / zacatecni-mesic** – datum začátku sezóny.
- **target-temp-1..4** – nastavení termostatu pro každý byt (5–30 °C).
**Switche:**
- **manualni-rezim-1..4** – přepínač manuálního ovládání pro každý byt; při zapnutí ignoruje časový rozvrh termostatu a používá hodnotu `target-temp`.
**Výstupy (grafy a monitory):**
- Teplotní vizualizace mřížky – barva agentů odpovídá teplotě (modrá = chladno, červená = teplo).
- Grafy spotřeby a spokojenosti pro každý byt.
- Tabulka fair-share nákladů na konci nebo průběžně.
## NA CO SI DÁT POZOR?
- Byty v rozích domu (byt 1 a 4) mají větší tepelné ztráty do venkovního prostoru než byty uprostřed.
- Při výrazně chladném počasí (nižší venkovní teplota) se spotřeba výrazněji liší mezi byty.
- Spokojenost obyvatel (spokojenost-1..4) klesá, pokud teplota v bytě trvale leží mimo cílové rozmezí.
## CO ZKUSIT?
- Nastavte **manualni-rezim** pro jeden z bytů a snižte cílovou teplotu – sledujte, jak se změní jeho podíl na nákladech a zda to ovlivní sousední byty.
- Spusťte BehaviorSpace experiment s různými hodnotami venkovní teploty a sledujte, jak počasí ovlivňuje celkové náklady i jejich rozdělení.
- Zkuste nastavit jeden byt na velmi nízkou teplotu (netopit) – jak se projeví tepelný přenos od sousedů a jak ho algoritmus zohledňuje?
## ROZŠÍŘENÍ MODELU
- **Více podlaží** – model lze rozšířit na 3D mřížku (2D mřížka × výška) s přenosem tepla ve třetím rozměru.
- **Proměnné počasí** – místo kosinusového cyklu načíst reálná meteorologická data ze souboru CSV.
- **Dynamické chování obyvatel** – obyvatelé mohou měnit termostatové nastavení v reakci na průběžné informace o spotřebě (feedback-loop vliv informovanosti).
- **Tepelná izolace** – přidat slider pro tloušťku/kvalitu izolace obvodových zdí a simulovat vliv renovace.
## ZAJÍMAVÉ PRVKY NETLOGU
- **Links** pro přenos tepla – difúze je implementována přes vytvořené linky mezi sousedními patchi, ne přes vestavěný `diffuse`. To umožňuje přesnější kontrolu.
- **Načítání CSV** – rozvržení domu se načítá z externího souboru pomocí `csv:from-file`, což usnadňuje experimenty s různými půdorysy bez úpravy kódu.
- **Uložení/obnovení stavu** – `export-world` / `import-world` se používá k checkpointování simulace.
## PŘÍBUZNÉ MODELY
- **Heat Diffusion** – z NetLogo Models Library; základ pro pochopení difúze tepla na mřížce.
- **Energy** (Models Library) – modelování energetické bilance budovy.
setup repeat 75 [ go ]setupgo= 864000]]>spotreba-radiator-1spotreba-radiator-2spotreba-radiator-3spotreba-radiator-4spokojenost-1spokojenost-2spokojenost-3spokojenost-4vypocti-fer-naklady 1vypocti-fer-naklady 2vypocti-fer-naklady 3vypocti-fer-naklady 4celkem-ztraty-teplaprumerna-teplota-pokoje 1prumerna-teplota-pokoje 2prumerna-teplota-pokoje 3prumerna-teplota-pokoje 4venkovni-teplotasetupgo= 864000]]>spotreba-radiator-1spotreba-radiator-2spotreba-radiator-3spotreba-radiator-4spokojenost-1spokojenost-2spokojenost-3spokojenost-4vypocti-fer-naklady 1vypocti-fer-naklady 2vypocti-fer-naklady 3vypocti-fer-naklady 4celkem-ztraty-teplaprumerna-teplota-pokoje 1prumerna-teplota-pokoje 2prumerna-teplota-pokoje 3prumerna-teplota-pokoje 4venkovni-teplotaspokojenost-platba-1spokojenost-platba-2spokojenost-platba-3spokojenost-platba-4setupgo= 864000]]>spotreba-radiator-1spotreba-radiator-2spotreba-radiator-3spotreba-radiator-4spokojenost-1spokojenost-2spokojenost-3spokojenost-4vypocti-fer-naklady 1vypocti-fer-naklady 2vypocti-fer-naklady 3vypocti-fer-naklady 4celkem-ztraty-teplaprumerna-teplota-pokoje 1prumerna-teplota-pokoje 2prumerna-teplota-pokoje 3prumerna-teplota-pokoje 4venkovni-teplota