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

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

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:

mimouroven krizovatka 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/20260424144901-krizovatka_simulacia.gif

https://hrubos.tech/blogy/content/images/20260424145032-kruhovy_objazd.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()


Author: AarNoma

The first Slovak cyborg 1 system

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”