Pozrime si na grafe čas cca 150s alebo 150frame, to je jedno na tomto grafe https://hrubos.tech/blogy/content/images/20260424144300-kruhovy_objazd.gif.png a to je oproti 80s predošlého grafu dvojnásobok času, kým nastane zápcha. Teda predošlý graf bol:
Teda vidíme ^^^ , že aj na mimo úrovňovej križovatke je čas zápchy len polovičný: https://hrubos.tech/blogy/content/images/20260424144601-krizovatka_simulacia.gif.png
Ukážem obidve simulácie live, len každá má gif cca 18MB, tak kým sa načítajú chvíľu čakajte, tu sú gify aj linky:

https://hrubos.tech/blogy/content/images/20260424144901-krizovatka_simulacia.gif

https://hrubos.tech/blogy/content/images/20260424145032-kruhovy_objazd.gif
Teda, ak máš kruhový objazd rovnako so 4 privádzačmi tam a späť, je už 2x výhodnejší pre zápchy. A ako ho ešte vylepšiť? No aj kruháč by mal mať 2 pruhy vonkajší a vnútorný pre zaraďovanie sa, ale nemusí, už táto simulácia s obyčajným kruháčom je takmer dvojnásobne výhodnejšia.
Zdroj pre úvahu bol článok pravda: https://ekonomika.pravda.sk/krajina/clanok/800005-mali-zatocit-s-kolonami-no-v-mestach-spustili-dopravne-peklo-krizovatku-v-ktorej-slovaci-zmatkuju-susedia-prerabaju/
Moja úvaha o X3D CPU a mimoúrovňovom zapojení sa potvrdila, ak má prúd kratšiu cestu X3D, tak sa spotrebuje alebo vygeneruje menej tepla.
Za pomoc ďakujem GPT, príkazy som mu dával ja, on generoval julia lang kód:
# Julia Lang: 3D mimoúrovňová križovatka -> 2D model + MP4 animácia
using Pkg
Pkg.add(["Plots", "Random", "Statistics"])
using Plots, Random, Statistics
gr()
# -----------------------------
# PARAMETRE
# -----------------------------
const FPS = 20
const SECONDS = 40
const FRAMES = FPS * SECONDS
const DT = 0.15
const ROADLEN = 100.0
const CAPACITY = 40 # max áut v systéme pre 100%
const SPAWN_RATE = 0.55 # pravdepodobnosť príchodu auta / smer / frame
const SPEED = 1.8
# 3D mimoúrovňová križovatka sa zjednoduší na 2D uzly bez kolízií:
# horizontal road (W<->E) a vertical road (S<->N)
# rampy = bypass cez oblúky (bez semaforu)
mutable struct Car
x::Float64
y::Float64
dx::Float64
dy::Float64
lane::Symbol
end
cars = Car[]
passed = 0
history_count = Int[]
history_util = Float64[]
function spawncars!()
if rand() < SPAWN_RATE
push!(cars, Car(-ROADLEN, 0, SPEED, 0, :WE))
end
if rand() < SPAWN_RATE
push!(cars, Car(ROADLEN, 5, -SPEED, 0, :EW))
end
if rand() < SPAWN_RATE
push!(cars, Car(0, -ROADLEN, 0, SPEED, :SN))
end
if rand() < SPAWN_RATE
push!(cars, Car(5, ROADLEN, 0, -SPEED, :NS))
end
end
function step!()
global passed
spawncars!()
remove_idx = Int[]
for (i,c) in enumerate(cars)
c.x += c.dx*DT*10
c.y += c.dy*DT*10
if abs(c.x) > ROADLEN+10 || abs(c.y) > ROADLEN+10
push!(remove_idx, i)
passed += 1
end
end
for i in reverse(remove_idx)
deleteat!(cars, i)
end
cnt = length(cars)
util = min(100, 100cnt / CAPACITY)
push!(history_count, cnt)
push!(history_util, util)
end
anim = @animate for f in 1:FRAMES
step!()
p1 = plot(xlim=(-110,110), ylim=(-110,110), aspect_ratio=:equal,
legend=false, title="2D model križovatky (frame $f)")
# cesty
plot!(p1, [-110,110], [0,0], lw=8)
plot!(p1, [-110,110], [5,5], lw=8)
plot!(p1, [0,0], [-110,110], lw=8)
plot!(p1, [5,5], [-110,110], lw=8)
# autá ako krúžky
if !isempty(cars)
scatter!(p1, [c.x for c in cars], [c.y for c in cars], ms=5)
end
util = history_util[end]
cnt = history_count[end]
p2 = plot(1:length(history_util), history_util, ylim=(0,100),
title="Vyťaženie %", xlabel="frame", ylabel="%", legend=false)
hline!(p2, [100], ls=:dash)
p3 = plot(1:length(history_count), history_count,
title="Počet áut", xlabel="frame", ylabel="auta", legend=false)
plot(p1,p2,p3, layout=@layout([a{0.55w} [b;c]]), size=(1200,700),
plot_title="Aktuálne autá: $cnt | Vyťaženie: $(round(util,digits=1))% | Prešlo: $passed")
end
mp4(anim, "krizovatka_simulacia.gif", fps=FPS)
println("Hotovo: krizovatka_simulacia.mp4")
println("Stlač Enter pre koniec...")
readline()
# Julia Lang: Kruhový objazd so 4 privádzačmi (jeden obojsmerný) + MP4 animácia
using Pkg
Pkg.add(["Plots", "Random", "Statistics"])
using Plots, Random, Statistics
gr()
const FPS=20; const SECONDS=40; const FRAMES=FPS*SECONDS
const DT=0.12; const R=35.0; const ROAD=110.0; const CAPACITY=36
const SPAWN=0.45; const SPEED=1.7
mutable struct Car
mode::Symbol # :inbound :circle :outbound
arm::Int # 1=N 2=E 3=S 4=W
target::Int
pos::Float64
ang::Float64
end
cars=Car[]; passed=0; hc=Int[]; hu=Float64[]
arm_angle(a)= a==1 ? pi/2 : a==2 ? 0.0 : a==3 ? 3pi/2 : pi
function spawn!()
for a in 1:4
if rand()<SPAWN
t=rand(setdiff(1:4,[a]))
push!(cars,Car(:inbound,a,t,ROAD,arm_angle(a)))
end
end
end
function xy(c::Car)
if c.mode==:circle
return (R*cos(c.ang), R*sin(c.ang))
elseif c.mode==:inbound
ang=arm_angle(c.arm); return (c.pos*cos(ang), c.pos*sin(ang))
else
ang=arm_angle(c.target); return (c.pos*cos(ang), c.pos*sin(ang))
end
end
function step!()
global passed
spawn!(); rem=Int[]
for (i,c) in enumerate(cars)
if c.mode==:inbound
c.pos -= SPEED
if c.pos <= R+2
c.mode=:circle; c.ang=arm_angle(c.arm)
end
elseif c.mode==:circle
c.ang -= 0.055 # clockwise
targ=arm_angle(c.target)
d=abs(mod(c.ang-targ+pi,2pi)-pi)
if d<0.08
c.mode=:outbound; c.pos=R+2
end
else
c.pos += SPEED
if c.pos>ROAD
push!(rem,i); passed+=1
end
end
end
for i in reverse(rem) deleteat!(cars,i) end
cnt=length(cars); util=min(100,100*cnt/CAPACITY)
push!(hc,cnt); push!(hu,util)
end
anim=@animate for f in 1:FRAMES
step!()
p1=plot(xlim=(-120,120),ylim=(-120,120),aspect_ratio=:equal,legend=false,title="Kruhový objazd")
# roads
plot!(p1,[-8,8],[R,ROAD],lw=8)
plot!(p1,[-8,8],[-R,-ROAD],lw=8)
plot!(p1,[R,ROAD],[-8,8],lw=8)
plot!(p1,[-R,-ROAD],[-8,8],lw=8)
# extra opposite lanes = obojsmerný severný privádzač
plot!(p1,[-18,-2],[R,ROAD],lw=8)
plot!(p1,[-18,-2],[-R,-ROAD],lw=8)
th=range(0,2pi,length=240)
plot!(p1,R*cos.(th),R*sin.(th),lw=8)
if !isempty(cars)
pts=[xy(c) for c in cars]
scatter!(p1,[p[1] for p in pts],[p[2] for p in pts],ms=5)
end
p2=plot(1:length(hu),hu,ylim=(0,100),legend=false,title="Vyťaženie %")
p3=plot(1:length(hc),hc,legend=false,title="Počet áut")
plot(p1,p2,p3,layout=@layout([a{0.55w} [b;c]]),size=(1200,700),plot_title="Autá $(hc[end]) | Vyťaženie $(round(hu[end],digits=1))% | Prešlo $passed")
end
mp4(anim,"kruhovy_objazd.gif",fps=FPS)
println("Hotovo: kruhovy_objazd.mp4")
println("Stlač Enter pre koniec...")
readline()

Comments “Dnes riešime dopravu v Bratislave. Niekto navrhol mimo úrovňové kríženie. Mňa však zaujalo ako AMD rieši X3D CPU á pozerajte, čo sa stane, ak tam dáte kruhový objazd”