2B Trafik Sıkışıklığı


17

Biham-Middleton-Levine trafik modeli modelleri trafik basitleştirilmiş bir kendini organize hücresel otomat olduğunu.

Rastgele bir başlangıç ​​pozisyonuna sahip bir kafes üzerindeki noktalarla temsil edilen bir dizi arabadan oluşur, burada her araba iki tipten biri olabilir: sadece aşağıya doğru hareket eden (bu makalede mavi olarak gösterilen) ve sadece sağda (bu makalede kırmızı ile gösterilmiştir). İki tür araba sırayla hareket ediyor. Her turda, ilgili tipteki tüm arabalar, başka bir araba tarafından engellenmedikleri takdirde bir adım ilerler.

Göreviniz bu modeli bir animasyon olarak görselleştirmek. İşte bazı iyi gösteriler.

resim açıklamasını buraya girin

Giriş

Yoğunluğu temsil eden 0 ile 1 arasında bir kayan nokta sayısı ve görüntülenen ızgara yüksekliğini ve genişliğini temsil eden iki tam sayı. Girişlerin geçerli olduğunu ve bir işleve ait parametrelerin veya kullanıcı girişinden okunan değerlerin her ikisinin de iyi olduğunu varsayın.

Örnek: 0.38 144 89(yukarıdaki resme karşılık gelir)

Çıktı

Bu modelin animasyonunu gösteren en az 80x80 ızgara. Başlangıçta, arabalar, ızgara giriş yoğunluğuna ulaşana kadar, yarım kırmızı ve yarım mavi ile rastgele bir şekilde yerleştirilir (bu, istediğiniz gibi yuvarlatılmış toplam ızgara karelerinin yoğunluk katlarıdır). Yoğunluk bu değer olmalıdır , yani her hücreyi olasılık olarak yoğunlukla dolduramazsınız. Her adım için, bir tür araba aşağı veya sağa hareket eder ve kenarı geçerse etrafını sarar. Hareket eden araç türü her adımı değiştirir. Animasyonu görüntülenebilir hale getirmek için, her adım arasında en az 10 ms olmalıdır.

kurallar

  • Arabalar, birbirlerinden ve arka plandan ayırt edilebilir oldukları sürece herhangi bir renk veya sembol olabilir ve her araba türü aynı renk veya semboldür.

  • Hem konsol hem de grafik çıktısına izin verilir. Konsol çıktısı için, yazdırılabilir herhangi bir sembol uygundur, ancak çıktı bir karakter ızgarası olmalıdır.

  • Ekran görüntünüz veya gif'iniz yoksa lütfen ne tür çıktılar ürettiğinizi belirtin.

  • Simülasyon sonsuza dek sürmelidir.

Çıktı biraz karmaşıktır, bu nedenle herhangi bir sorunuz varsa lütfen yorum yapın.


Animasyonun ne kadar yavaş veya hızlı çalışması gerektiği konusunda herhangi bir kısıtlama var mı?
xnor

Belki de hareket eden araba türünün her bir adımı değiştirdiğini belirtmeye değer.
Greg Martin

@xnor Her döngü için en az 5 veya 10 ms düşünüyordum, ancak bunun ölçülmesinin zor olup olmayacağından emin değilim.
qwr

3
Yoğunluk yoğunluk anlamına mı sahip olduğu değer olması, ya da sadece bir olasılık d doldurulacak her bir piksel ettiğini? Ayrıca, otomobillerin rengini rastgele mi atamalıyız? Rastgele ise, sadece her iki renkte de 50-50 şansları varsa tekrar olur mu?
JAD

1
@JarkoDubbeldam Yoğunluk bu değer olmalıdır. Her renkte 50-50 şansları var. Ancak geç cevap verdim, böylece cevaplar farklı olabilir. Arabalar yukarı veya sola hareket edebilir.
qwr

Yanıtlar:


5

R, 350 338 293 291 273 268 264 bayt

function(d,x,y){f=function(w){v=length(w);for(j in which(w>0&!w[c(2:v,1)]))w[c(j,j%%v+1)]=0:1;w};m=matrix(sample(c(rep(1,q<-floor(d*y*x/2)),rep(-1,q),rep(0,x*y-2*q))),x);p=animation::ani.pause;o=image;a=apply;repeat{o(m<-t(a(m,1,f)));p();o(m<--1*a(-1*m,2,f));p()}}

Ungolfed:

function(d,x,y){
  q=floor(d*y*x/2)

  m=matrix(sample(c(rep(1,q),rep(-1,q),rep(0,x*y-2*q))),x)

  f=function(w){
    v=length(w)
    for(j in which(w>0&!w[c(2:v,1)])){
      w[c(j,j%%v+1)]=0:1
    }
    w
  }


  library(animation)
  repeat{
    m=t(apply(m,1,f))
    image(m)
    m=-1*apply(-1*t(m),2,f))
    ani.pause()
    image(m)  
    ani.pause()
  }
}

3 bağımsız değişken alan işlev: dyoğunluk ve boyut olarak x,y. qher renkteki araba sayısıdır. mbaşlangıçta rastgele sayıda araba ve boş alan alarak doldurulmuş arabalarla birlikte matristir. Otomobil ya vardır 1ya -1, boş alandır 0.

folarak kodlanmış arabalara bakarak arabaları bir satır hareket ettiren bir işlevdir 1. Aracın 1s olup olmadığını kontrol ederek hareket edip edemeyeceğini kontrol eder 0. Hangi arabalara bağlı olarak her satır veya sütunda applykoşmak fiçin kullanıyoruz .

f1arabaların hareketini idare eder, arabaları hareket ettirmek için -1, matrisi devrederiz, hareket yönünü değiştiririz, matrisi çarparız -1, böylece -1arabalar araba olur 1ve vv ve sonuçtaki matris tekrar dönüştürülür.

Bu image, üç değer için 3 varsayılan renk kullanarak çizim oluşturmak için kullanılır. animation1 fps olan varsayılan seçenekleri kullanarak animasyonları işlemek için paketi kullanır .

0.38, 144, 89:

GIF bağlantısı

0.2, 144, 89:

GIF bağlantısı

0.53, 144, 89:

GIF bağlantısı


Animasyonunuz gerçekten harika görünüyor - hangi yoğunluğu kullandınız? Her şey çok fazla boş alanla hızlı bir şekilde sıkıştı gibi görünüyor
QWR

@qwr aslında beni rahatsız eden bir şeydi. Programımda her şey, bağladığınız örnekten daha düşük yoğunluklarda sıkışıyor. Ben arsa için kullanılan kesin parametreleri hatırlayamıyorum, ama çok iyi 0.38 144 89örnek olabilir.
JAD

Kare ızgaralarla oynamak jasondavies.com/bml/#0.35/100/100 sıkışmak için 0.35 yoğunluğum var ama neredeyse her zaman ince çapraz çizgiler yerine bir kalın 45 derece çizgi. Çizgileriniz daha dikey göründüğünden, iki tür otomobille ilgili bir
şeylerin

Sorunu şimdi görüyorum. Cara sadece başka bir araba tarafından engellenmedikleri takdirde ilerleyebilir. Vikipedi örneklerinde tüm hareketli arabaların önünde bir boşluk var. Ancak animasyonunuzda arabalar bir çizgi olarak hareket eder. İlginç.
qwr

Ah, bunu yapardı.
JAD

5

Mathematica 237 228 203 198 181 bayt

(b=RandomSample@ArrayReshape[Table[{0,i=2},##/2],{1##2},1]~Partition~#2;Dynamic@Colorize[i=-i;b=CellularAutomaton[{193973693,{3,{a=0{,,},{3,9,1},a}},{1,1}},b];If[i>0,b,2-b]])&

Çıktı bir dinamiktir Image. Arka plan açık yeşildir ve arabalar yönlerine bağlı olarak siyah veya macentadır.

açıklama

b=RandomSample@ArrayReshape[Table[{i=1,2},##/2],{1##2},1]~Partition~#2

Başlangıç ​​kartını oluşturun:

Table[{0,i=2},##/2]

Set iiçin 2. Bir oluşturma Listbölgesinin {0, 2}uzunluğu olan kat, (yoğunluk x genişlik x yükseklik / 2) (nedeniyle ikiye bölünür {0, 2}uzunluk-2).

ArrayReshape[ ... ,{1##2},1]

Ortaya çıkan 2-B'yi List(2 x bir şey) 1-B'ye List(uzunluk = genişlik * yükseklik) yeniden şekillendirin. Tampon 1yeterince değerler bulunmuyorsa.

RandomSample@ ...

(Pseudo-) sonucu rastgele sıralar.

... ~Partition~#2

Sonuçta ortaya çıkan bölüm (genişlik).

b= ...

Bunu saklayın b.


Dynamic@Colorize[i=-i;b=CellularAutomaton[{193973693,{3,{a=0{,,},{3,9,1},a}},{1,1}},b];If[i>0,b,2-b]]

Şunu oluşturun Dynamic Image:

i=-i;

İşaretini çevirin i.

b=CellularAutomaton[{193973693,{3,{a=0{,,},{3,9,1},a}},{1,1}},b]

Transpozite için kural 193973693ve komşu ağırlıkları ile hücresel otomat uygulayın . Buna eşit olarak ayarlayın .{{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}bb

If[i>0,b,2-b]

Eğer iolumlu, bırakın byalnız. Değilse, devrik b( 2-çünkü ben CellularAutomatonbiraz golfed orada ). Esasen, bu bdiğer tüm yinelemeleri de aktarır (aktarımı geri almak için)

Colorize[ ... ]

Diziyi renkli renge dönüştürün Image.

Dynamic@ ...

İfadeyi yapın Dynamic. yani yukarıdaki işlevler tekrar tekrar çalıştırılır.

Çıktı

0.35, 192, 1082000 kare (büyütülmüş 2x) için örnek bir çıktı (girişler :).

https://i.imgur.com/zmSyRut.mp4


Hah, yerleşik kullanımı kullanmaktan daha mı uzun ?!
Adám

3

Dyalog APL , 190 108 115 112 bayt

Çözüm

S←{⍉⍣⍺⊢d[⍺]↑d[⍺]↓⍉↑(⍺⊃'(↓+) ' '(→+) ')⎕R' \1'↓(,⍨,⊢)⍉⍣⍺⍉⎕←⍵⊣⎕DL÷4}
{1S 0S⍵}⍣≡' ↓→'[d⍴{⍵[?⍨⍴⍵]}c1 2⍴⍨⌊⎕×c←×/d←⎕]

Çevrimiçi TryAPL (çevrimiçi kısıtlamalar nedeniyle biraz değiştirildi):

  1. S⎕IO←0 işlevini ayarlayın , tanımlayın ve ardından rastgele% 38 14 × 29 ızgara, G tanımlayın ve görüntüleyin .

  2. Bir hamle yap.

  3. Sağa bir hamle yapın.

  4. 2. adıma gidin.

    Trafik
    Yoğunluğu garanti etmeyen önceki algoritmanın animasyonu.

açıklama

S←{doğrudan S işlevini tanımlayınız (burada sağdan sola açıklanmıştır):

÷4 4'ün karşılıklı (0.25)

⎕DL bu kadar saniye bekleyin (geçen süreyi döndürür)

⍵⊣ ⍵ (doğru argüman; ızgara) lehine bunu atın

⎕← çıktı

 devrik

⍉⍣⍺ ⍺ (sol argüman; 0 = aşağı, 1 = sağ) ise tekrar transpoze edin

( fonksiyon trenini uygulayın (burada soldan sağa açıklanmıştır):

  ,⍨ kendisine eklenen argüman

  , eklenmiş

   kendisi

)

 matrisi liste listesine böl

( normal ifadeyi ara (burada soldan sağa açıklanmıştır):

  ⍺⊃ ⍺ (0 = aşağı / ilk, 1 = sağ / saniye) temelinde aşağıdakilerden birini seçin

  '(↓+) ' '(→+) ' aşağı ve sol ok dizileri ve ardından bir boşluk

)⎕R' \1' boşlukla ve ardından bulunan diziyle değiştir

 liste listesini matrise karıştır

 devrik

d[⍺]↓ ⍺ (sol bağımsız değişken) 0 (aşağı) ise "yükseklik" satırlarını veya ⍺ 1 (sağ) ise "genişlik" satırlarını bırakın

d[⍺]↑ o zaman bu kadar satır al

 geçiş (ayırıcı görevi görür)

⍉⍣⍺ pose (sol argüman; 0 = aşağı, 1 = sağ)

}


' ↓→'[ dizeyi dizine ekleyin (burada sağdan sola açıklanır):

 sayısal girdi (boyutlar)

d← bunu d' ye ata

×/ boyutları çarp (hücre sayısını bulur)

c← bunu c'ye ata

⎕× bunu sayısal girişle (yoğunluk) çarpın

 aşağı yuvarlama

1 2⍴⍨ bu uzunluğa kadar döngüsel olarak bir ve iki tekrarlayın

c↑ bunu uzunluk c'ye kadar uzatın, sıfırlarla doldurun

d⍴yeniden şekillendirmek  için d (boyutlar) kullanın

{ bu anonim işlevi buna uygulayın (burada soldan sağa açıklanmıştır):

  ⍵[ tarafından indekslenen doğru argüman (sıfırlar, olanlar ve ikişer liste)

   ?⍨ karıştırılmış endeksler

   ⍴⍵ argümanın uzunluğu

  ]

}

]

{ aşağıdaki anonim işlevi uygulayın (sağdan sola açıklanır):

0S⍵ uygulamak S 0 sol argüman olarak (aşağı) ve sağ argüman olarak ızgara ile

1S bununla sağ argüman olarak S'yi sol argüman olarak 1 (sağ) ile uygulayın

}⍣≡ birbirini izleyen iki yineleme aynı olana kadar (trafik sıkışması)

notlar

  1. ⎕IO←0Birçok sistemde varsayılan olan gerektirir .

  2. (Yükseklik, genişlik) ve sonra yoğunluk için sorulur.

  3. Herhangi bir yerleşik otomat kullanmaz.

  4. Yerleşik normal ifade desteğini kullanır.

  5. Trafik sıkışıklığı varsa durur (hiçbir araba hareket edemez).

  6. Sağa doğru hareket eden arabaları, aşağı doğru hareket eden arabaları ve boşlukların boş yolları temsil ettiği karakter matrislerini çıktılar .

  7. Yukarıdaki gibi, oturuma 4 Hz'de çıkar, ancak frekans değiştirilerek ayarlanabilir ÷4; örneğin ÷33 Hz ve .3³⁄₁₀ Hz.

  8. ]Box on -s=max -f=onÖnce yürütülürse neler olduğunu görmek daha kolaydır .

  9. Gerekli dağıtım artık garanti edilmektedir ve iki tip araba tam olarak 50-50'de meydana gelir ve yuvarlama için tasarruf edin.


İlk kart oluşturma, giriş yoğunluğuna sahip bir kart garanti etmez. Sanırım OP'nin buna izin verip vermemenin tercihi.
JungHwan Min

Oh, @JarkoDubbeldam bunu zaten sordu.
JungHwan Min

@JungHwanMin Nasıl yani? Yoğunluk d olsun. Her pozisyon 0 ile 1 arasında bir değer alır. 0 ve between arasında bir , a olur . Eğer ᵈ⁄₂ ve d arasında ise a olur . D ile 1 arasında boş kalır.
Adam

Aşırı bir durum şu olurdu: her pozisyon bir şekilde değeri alır 0(çünkü (sahte) -sadece rastgele (sahte )- bağımsız olarak; çok imkansız ama mümkün). Sonra tahta s ile dolu .
JungHwan Min

@JungHwanMin Ah, ne demek istediğini anlıyorum.
Adam

1

Java (Java için 624 Bayt + 18 Bayt. * = 642 Bayt)

static void k(double b,final int c,final int d){final int[][]a=new int[c+1][d+1];int i=0,j;for(;i<c;i++){for(j=0;j<d;j++){a[i][j]=Math.random()<b?Math.random()<0.5?1:2:0;}}Frame e=new Frame(){public void paint(Graphics g){setVisible(1>0);int i=0,j;for(;i<c;i++){for(j=0;j<d;j++){g.setColor(a[i][j]==2?Color.BLUE:a[i][j]==1?Color.RED:Color.WHITE);g.drawLine(i,j,i,j);}}for(i=c-1;i>=0;i--){for(j=d-1;j>=0;j--){if(a[i][j]==1&&a[i][(j+1)%d]==0){a[i][(j+1)%d]=1;a[i][j]=0;}else if(a[i][j]>1&&a[(i+1)%c][j]==0){a[(i+1)%c][j]=2;a[i][j]=0;}}}}};e.show();while(1>0){e.setSize(c,d+i++%2);try{Thread.sleep(400L);}catch(Exception f){}}}

Ungolfed:

static void k(double b,final int c,final int d){
        final int[][]a=new int[c+1][d+1];
        int i=0,j;
        for(;i<c;i++) {
            for(j=0;j<d;j++) {
                a[i][j]=Math.random()<b?Math.random()<0.5?1:2:0;
            }
        }

        Frame e=new Frame(){
            public void paint(Graphics g){
                setVisible(1>0);
                int i=0,j;
                for(;i<c;i++) {
                    for(j=0;j<d;j++) {
                        g.setColor(a[i][j]==2?Color.BLUE:a[i][j]==1?Color.RED:Color.WHITE);
                        g.drawLine(i,j,i,j);
                    }
                }
                for(i=c-1;i>=0;i--) {
                    for(j=d-1;j>=0;j--) {
                        if(a[i][j]==1&&a[i][(j+1)%d]==0){
                            a[i][(j+1)%d]=1;a[i][j]=0;
                        }else if(a[i][j]>1&&a[(i+1)%c][j]==0){
                            a[(i+1)%c][j]=2;a[i][j]=0;
                        }
                    }
                }
            }
        };
        e.show();
        while(1>0){e.setSize(c,d+i++%2);try{Thread.sleep(400L);}catch(Exception f){}}
    }

Resim:

resim açıklamasını buraya girin


Java'ya aşina değilsiniz, ancak kırmızı, mavi ve beyaz kullanabileceğiniz renkler için en kısa isimler mi? (belki gri bir seçenektir, bir bayt ve beyazı kurtarır)
JAD

Ekran görüntüsü, burada tarif ettiğimle
qwr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.