Kẹt giao thông 2D


17

Các mô hình giao thông Biham-Middleton-Levine là một automaton tế bào tự tổ chức các mô hình đơn giản hóa giao thông.

Nó bao gồm một số ô tô được biểu thị bằng các điểm trên một mạng có vị trí xuất phát ngẫu nhiên, trong đó mỗi ô tô có thể là một trong hai loại: những ô tô chỉ di chuyển xuống dưới (hiển thị màu xanh lam trong bài viết này) và những ô tô chỉ di chuyển về phía bên phải (hiển thị màu đỏ trong bài viết này). Hai loại xe thay phiên nhau di chuyển. Trong mỗi lượt, tất cả các xe cho loại tương ứng tiến thêm một bước nếu chúng không bị xe khác chặn.

Nhiệm vụ của bạn là hình dung mô hình này như một hình ảnh động. Dưới đây là một số minh chứng tốt.

nhập mô tả hình ảnh ở đây

Đầu vào

Một số dấu phẩy động giữa 0 và 1 biểu thị mật độ và hai số nguyên biểu thị chiều cao và chiều rộng của lưới được hiển thị. Giả sử đầu vào là hợp lệ và các tham số cho một chức năng hoặc đọc từ đầu vào của người dùng đều ổn.

Ví dụ: 0.38 144 89(tương ứng với hình trên)

Đầu ra

Một lưới, ít nhất là 80x80, hiển thị hình ảnh động của mô hình này đang chạy. Khi bắt đầu, ô tô được đặt ngẫu nhiên trên lưới cho đến khi lưới đạt mật độ đầu vào, với một nửa màu đỏ và một nửa màu xanh (đó là mật độ nhân với tổng số ô vuông lưới, được làm tròn theo ý bạn). Mật độ phải là giá trị này, có nghĩa là bạn không thể điền vào mỗi ô với mật độ là xác suất. Đối với mỗi bước, một loại ô tô di chuyển xuống dưới hoặc sang phải, quấn quanh nếu chúng đi qua mép. Các loại xe di chuyển xen kẽ từng bước. Để làm cho hình ảnh động có thể xem được, phải có ít nhất 10 ms giữa mỗi bước.

Quy tắc

  • Những chiếc xe có thể là bất kỳ màu sắc hoặc biểu tượng nào miễn là chúng có thể phân biệt được với nhau và nền, và mỗi loại xe là cùng màu hoặc biểu tượng.

  • Bảng điều khiển và đầu ra đồ họa đều được cho phép. Đối với đầu ra giao diện điều khiển, bất kỳ biểu tượng có thể in nào cũng được, nhưng đầu ra phải ở dạng lưới các ký tự.

  • Vui lòng chỉ định loại đầu ra bạn đã tạo nếu bạn không có ảnh chụp màn hình hoặc gif.

  • Các mô phỏng phải chạy mãi mãi.

Đầu ra hơi phức tạp, vì vậy nếu bạn có bất kỳ câu hỏi nào, xin vui lòng bình luận.


Bất kỳ hạn chế về cách chậm hoặc nhanh chóng hoạt hình phải chạy?
xnor

Có lẽ nó đáng để xác định rằng loại xe di chuyển xen kẽ mỗi bước.
Greg Martin

@xnor Tôi đã suy nghĩ ít nhất 5 hoặc 10 ms mỗi vòng lặp, nhưng tôi không thực sự chắc chắn liệu điều đó có khó đo lường không.
qwr

3
Có mật độ có nghĩa là mật độ được giá trị đó, hoặc chỉ là mỗi điểm ảnh có một khả năng d để được lấp đầy? Ngoài ra, chúng ta có phải chỉ định màu sắc của những chiếc xe một cách ngẫu nhiên hay không? Nếu ngẫu nhiên, một lần nữa liệu có ổn không nếu họ chỉ có 50-50 cơ hội là màu?
JAD

1
@JarkoDubbeldam Mật độ phải là giá trị đó. Họ có 50-50 cơ hội được mỗi màu. Tuy nhiên tôi đã trả lời muộn để câu trả lời có thể khác nhau. Ô tô có thể di chuyển lên hoặc sang trái.
qwr

Câu trả lời:


5

R, 350 338 293 291 273 268 264 byte

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()}}

Ung dung:

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()
  }
}

Hàm có 3 đối số: dmật độ và kích thước x,y. qlà số lượng xe trong mỗi màu. mlà ma trận với ô tô, ban đầu được lấp đầy bằng cách lấy một loại ngẫu nhiên số lượng ô tô và khoảng trống. Ô tô là 1hoặc -1, không gian trống là 0.

flà một chức năng di chuyển những chiếc xe một hàng, nhìn vào những chiếc xe được mã hóa là 1. Nó kiểm tra nếu chiếc xe có thể di chuyển bằng cách kiểm tra 1s theo sau 0. Chúng tôi sử dụng applyđể chạy ftrên mỗi hàng hoặc cột, tùy thuộc vào những chiếc xe.

fxử lý việc di chuyển của 1ô tô, để di chuyển -1ô tô, chúng ta hoán vị ma trận, chuyển hướng di chuyển, nhân ma trận -1, để -1ô tô trở thành 1ô tô, và vv và ma trận kết quả được biến đổi một lần nữa.

Điều này sử dụng imageđể tạo cốt truyện, sử dụng 3 màu mặc định cho ba giá trị. Sử dụng animationgói để xử lý các hình ảnh động bằng các tùy chọn mặc định, là 1 khung hình / giây.

0.38, 144, 89:

Liên kết với GIF

0.2, 144, 89:

Liên kết với GIF

0.53, 144, 89:

Liên kết với GIF


Hoạt hình của bạn trông rất tuyệt - bạn đã sử dụng mật độ nào? Có vẻ như toàn bộ sự việc bị kẹt khá nhanh với rất nhiều khoảng trống
qwr

@qwr đó thực sự là một cái gì đó đã làm phiền tôi. Trong chương trình của tôi, toàn bộ điều ùn tắc ở mật độ thấp hơn trong ví dụ bạn liên kết. Tôi không thể nhớ các tham số chính xác được sử dụng cho cốt truyện, nhưng nó rất có thể là 0.38 144 89từ ví dụ.
JAD

Chơi xung quanh với các ô vuông tôi có mật độ 0,35 để gây nhiễu jasondavies.com/bml/#0.35/100/100 nhưng hầu như luôn luôn là một dòng 45deg dày thay vì các đường chéo mỏng. Vì các đường của bạn trông thẳng đứng hơn nên tôi nghĩ có gì đó với hai loại ô tô đã tắt
qwr

Tôi thấy vấn đề bây giờ. Cara chỉ có thể tiến lên nếu họ không bị xe khác chặn. Vì vậy, trong các ví dụ Wikipedia, tất cả các xe ô tô đang di chuyển đều có một khoảng trống phía trước chúng. Nhưng trong hoạt hình của bạn những chiếc xe di chuyển như một dòng. Hấp dẫn.
qwr

Ah, điều đó sẽ làm điều đó.
JAD

5

Mathicala, 237 228 203 198 181 byte

(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]])&

Đầu ra là một động Image. Nền là màu xanh lá cây nhạt, và những chiếc xe có màu đen hoặc đỏ tươi, tùy thuộc vào hướng của chúng.

Giải trình

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

Tạo bảng ban đầu:

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

Đặt ithành 2. Tạo một Listcủa {0, 2}, có chiều dài là sàn (mật độ * chiều rộng * chiều cao / 2) (chia hai vì {0, 2}là chiều dài-2).

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

Định hình lại kết quả 2-D List(2 x gì đó) thành 1-D List(length = width * height). Pad 1nếu không có đủ giá trị.

RandomSample@ ...

(Pseudo-) sắp xếp ngẫu nhiên kết quả.

... ~Partition~#2

Phân vùng dẫn đến chiều dài (chiều rộng).

b= ...

Lưu trữ mà trong b.


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

Tạo một Dynamic Image:

i=-i;

Lật dấu hiệu của i.

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

Áp dụng các thiết bị tự động di động với quy tắc 193973693và trọng số lân cận {{0, 0, 0}, {3, 9, 1}, {0, 0, 0}}để bchuyển đổi. Đặt bbằng.

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

Nếu ilà tích cực, để lại bmột mình. Nếu không, hoán vị b( 2-có vì tôi đã chơi golf CellularAutomatonmột chút). Về cơ bản, điều này hoán chuyển bmọi lần lặp khác (để hoàn tác chuyển vị)

Colorize[ ... ]

Chuyển đổi các mảng thành một màu sắc Image.

Dynamic@ ...

Tạo biểu thức Dynamic. tức là các chức năng trên được chạy liên tục.

Đầu ra

Đây là một đầu ra mẫu (đầu vào 0.35, 192, 108:) cho 2000 khung hình (phóng to 2x).

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


Huh, sử dụng tích hợp lâu hơn không sử dụng?!
Adám

3

APL Dyalog , 190 108 115 112 byte

Giải pháp

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

TryAPL trực tuyến (sửa đổi một chút vì các hạn chế trực tuyến):

  1. Set ⎕IO←0, xác định các chức năng S , và sau đó xác định và hiển thị một ngẫu nhiên 38% 14 × 29 lưới, G .

  2. Làm cho một di chuyển xuống.

  3. Thực hiện một di chuyển sang phải.

  4. Chuyển đến bước 2.

    Giao thông
    Hoạt ảnh của thuật toán trước, không đảm bảo mật độ.

Giải trình

S←{xác định hàm trực tiếp S (giải thích ở đây từ phải sang trái):

÷4 đối ứng của 4 (0,25)

⎕DL chờ đợi nhiều giây (trả về thời gian đã trôi qua thực tế)

⍵⊣ loại bỏ rằng có lợi cho ⍵ (đối số đúng; lưới)

⎕← đầu ra mà

 hoán vị

⍉⍣⍺ hoán đổi trở lại nếu (đối số bên trái; 0 = xuống, 1 = phải)

( áp dụng chức năng đào tạo (giải thích ở đây từ trái sang phải):

  ,⍨ đối số nối vào chính nó

  , gắn vào

   chinh no

)

 chia ma trận thành danh sách

( regex tìm kiếm (giải thích ở đây từ trái sang phải):

  ⍺⊃ chọn một trong hai cái sau dựa trên (0 = xuống / đầu tiên, 1 = phải / giây)

  '(↓+) ' '(→+) ' chuỗi mũi tên xuống và trái theo sau là khoảng trắng

)⎕R' \1' thay thế bằng một khoảng trắng theo sau là chuỗi tìm thấy

 trộn danh sách các danh sách thành ma trận

 hoán vị

d[⍺]↓ thả các hàng "height" nếu (đối số bên trái) là 0 (xuống) hoặc "width" hàng nếu ⍺ là 1 (phải)

d[⍺]↑ sau đó lấy nhiều hàng

 đi qua (đóng vai trò là dải phân cách)

⍉⍣⍺ hoán vị nếu ⍺ (đối số bên trái; 0 = xuống, 1 = phải)

}


' ↓→'[ lập chỉ mục chuỗi với (giải thích ở đây từ phải sang trái):

 đầu vào số (kích thước)

d← gán nó cho d

×/ nhân kích thước (tìm số lượng ô)

c← gán nó cho c

⎕× nhân số đó với đầu vào số (mật độ)

 làm tròn xuống

1 2⍴⍨ lặp lại theo chu kỳ một và hai cho đến khi chiều dài đó

c↑ kéo dài cho đến khi chiều dài c , đệm với số không

d⍴ sử dụng d (kích thước) để định hình lại

{ áp dụng chức năng ẩn danh này cho điều đó (giải thích ở đây từ trái sang phải):

  ⍵[ đối số đúng (danh sách số không, số và twos) được lập chỉ mục bởi

   ?⍨ các chỉ số xáo trộn lên đến

   ⍴⍵ độ dài của đối số

  ]

}

]

{ áp dụng hàm ẩn danh sau (giải thích từ phải sang trái):

0S⍵ áp dụng S với 0 (xuống) làm đối số bên trái và lưới làm đối số bên phải

1S với đó là đối số bên phải, áp dụng S với 1 (bên phải) làm đối số bên trái

}⍣≡ cho đến khi hai lần lặp lại liên tiếp giống hệt nhau (kẹt xe)

Ghi chú

  1. Yêu cầu ⎕IO←0, được mặc định trên nhiều hệ thống.

  2. Nhắc cho (chiều cao, chiều rộng), và sau đó cho mật độ.

  3. Không sử dụng bất kỳ máy tự động tích hợp.

  4. Có sử dụng hỗ trợ regex tích hợp.

  5. Dừng nếu có kẹt xe (không có xe nào có thể di chuyển).

  6. Xuất ra ma trận ký tự trong đó đại diện cho ô tô di chuyển sang phải, đại diện cho ô tô di chuyển xuống và không gian là những con đường trống.

  7. Như trên, nó xuất ra phiên ở tần số 4 Hz, nhưng tần số có thể được điều chỉnh bằng cách thay đổi ÷4; ví dụ ÷3là 3 Hz và .3là ³⁄₁₀ Hz.

  8. Sẽ dễ dàng hơn để xem những gì đang xảy ra nếu thực hiện ]Box on -s=max -f=onđầu tiên.

  9. Việc phân phối theo yêu cầu hiện được đảm bảo và hai loại ô tô xảy ra trong đúng 50-50, tiết kiệm cho việc làm tròn.


Thế hệ ban đầu của bạn không đảm bảo một bảng có mật độ đầu vào. Tôi đoán đó là lựa chọn của OP có cho phép điều đó hay không.
JungHwan Min

Ồ, @JarkoDubbeldam đã hỏi điều đó rồi.
JungHwan Min

@JungHwanMin Làm sao vậy? Đặt mật độ là d. Mọi vị trí đều có giá trị từ 0 đến 1. Nếu từ 0 đến, nó trở thành a ,. Nếu giữa ᵈ⁄₂ và d nó trở thành a . Nếu giữa d và 1 nó vẫn trống.
Adám

Chà, một trường hợp cực đoan sẽ là: mọi vị trí bằng cách nào đó đều nhận được giá trị 0(bởi vì chúng (giả) được tạo ra một cách ngẫu nhiên (giả) - tùy ý; rất không thể nhưng có thể). Sau đó, bảng của bạn đầy s.
JungHwan Min

@JungHwanMin Ah, tôi hiểu ý của bạn.
Adám

1

Java (624 Byte + 18 Byte cho Java.awt. * = 642 Byte)

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){}}}

Ung dung:

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){}}
    }

Hình ảnh:

nhập mô tả hình ảnh ở đây


Không quen thuộc với java, nhưng màu đỏ, xanh và trắng là tên ngắn nhất cho các màu bạn có thể sử dụng? (có thể màu xám là một tùy chọn, tiết kiệm một byte so với màu trắng)
JAD

Ảnh chụp màn hình dường như cho thấy vấn đề tương tự như những gì tôi mô tả ở đây codegolf.stackexchange.com/questions/104742/a-2d-traffic-jam/ phỏng
qwr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.