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-cas venkovni-teplota (9 + prumerna-teplota-zima) - amplituda-sezony * cos ((zacatecni-den-roku + floor (time / 86400)) mod 365 / 365 * 360) fps prumerna-teplota-pokoje 1 spotreba-radiator-1 / 3600000 spokojenost-1 vypocti-fer-naklady 1 precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 1 / 100)) 0 spokojenost-platba-1 zpetna-vazba-1 prumerna-teplota-pokoje 2 spotreba-radiator-2 / 3600000 spokojenost-2 vypocti-fer-naklady 2 precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 2 / 100)) 0 spokojenost-platba-2 zpetna-vazba-2 prumerna-teplota-pokoje 3 spotreba-radiator-3 / 3600000 spokojenost-3 vypocti-fer-naklady 3 precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 3 / 100)) 0 spokojenost-platba-3 zpetna-vazba-3 prumerna-teplota-pokoje 4 spotreba-radiator-4 / 3600000 spokojenost-4 vypocti-fer-naklady 4 precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 4 / 100)) 0 spokojenost-platba-4 zpetna-vazba-4 (spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000 celkem-ztraty-tepla / 3600000 plot prumerna-teplota-pokoje 1 plot target-temp-1 plot prumerna-teplota-pokoje 2 plot target-temp-2 plot prumerna-teplota-pokoje 3 plot target-temp-3 plot prumerna-teplota-pokoje 4 plot target-temp-4 plot spotreba-radiator-1 / 3600000 plot spotreba-radiator-2 / 3600000 plot spotreba-radiator-3 / 3600000 plot spotreba-radiator-4 / 3600000 precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh) 0 plot (spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000 plot celkem-ztraty-tepla / 3600000 plot spokojenost-platba-1 plot spokojenost-platba-2 plot spokojenost-platba-3 plot spokojenost-platba-4 plot spokojenost-cena-kwh plot zpetna-vazba-1 plot zpetna-vazba-2 plot zpetna-vazba-3 plot zpetna-vazba-4 plot venkovni-teplota plot (9 + prumerna-teplota-zima) - amplituda-sezony * cos ((zacatecni-den-roku + floor (time / 86400)) mod 365 / 365 * 360) plot spotreba-radiator-1 / 3600000 plot spotreba-radiator-2 / 3600000 plot spotreba-radiator-3 / 3600000 plot spotreba-radiator-4 / 3600000 plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 1 / 100)) 0 plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 2 / 100)) 0 plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 3 / 100)) 0 plot precision (((spotreba-radiator-1 + spotreba-radiator-2 + spotreba-radiator-3 + spotreba-radiator-4) / 3600000) * cena-za-kwh * (vypocti-fer-naklady 4 / 100)) 0 plot vypocti-fer-naklady 1 plot vypocti-fer-naklady 2 plot vypocti-fer-naklady 3 plot vypocti-fer-naklady 4 plot 25 plot spokojenost-1 plot spokojenost-2 plot spokojenost-3 plot spokojenost-4 plot ztraty-byt-1 / 3600000 plot ztraty-byt-2 / 3600000 plot ztraty-byt-3 / 3600000 plot 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 ] setup go = 864000]]> spotreba-radiator-1 spotreba-radiator-2 spotreba-radiator-3 spotreba-radiator-4 spokojenost-1 spokojenost-2 spokojenost-3 spokojenost-4 vypocti-fer-naklady 1 vypocti-fer-naklady 2 vypocti-fer-naklady 3 vypocti-fer-naklady 4 celkem-ztraty-tepla prumerna-teplota-pokoje 1 prumerna-teplota-pokoje 2 prumerna-teplota-pokoje 3 prumerna-teplota-pokoje 4 venkovni-teplota setup go = 864000]]> spotreba-radiator-1 spotreba-radiator-2 spotreba-radiator-3 spotreba-radiator-4 spokojenost-1 spokojenost-2 spokojenost-3 spokojenost-4 vypocti-fer-naklady 1 vypocti-fer-naklady 2 vypocti-fer-naklady 3 vypocti-fer-naklady 4 celkem-ztraty-tepla prumerna-teplota-pokoje 1 prumerna-teplota-pokoje 2 prumerna-teplota-pokoje 3 prumerna-teplota-pokoje 4 venkovni-teplota spokojenost-platba-1 spokojenost-platba-2 spokojenost-platba-3 spokojenost-platba-4 setup go = 864000]]> spotreba-radiator-1 spotreba-radiator-2 spotreba-radiator-3 spotreba-radiator-4 spokojenost-1 spokojenost-2 spokojenost-3 spokojenost-4 vypocti-fer-naklady 1 vypocti-fer-naklady 2 vypocti-fer-naklady 3 vypocti-fer-naklady 4 celkem-ztraty-tepla prumerna-teplota-pokoje 1 prumerna-teplota-pokoje 2 prumerna-teplota-pokoje 3 prumerna-teplota-pokoje 4 venkovni-teplota