2013-11-27 3 views
0

Мне нужно сделать моделирования для этой задачи:моделирования 2D движения в R

Два робота А и B расположены в 2D плоскости координат, А помещаются на координатах (0,0) и B помещается на (10,0). Они могут делать шаг вверх, вниз, влево или вправо с той же вероятностью. Они начинают двигаться в одно и то же время, и мне нужно найти после того, сколько шагов они проведут. Если они делают более 15000 шагов, считается, что они потеряны и никогда не будут встречаться. Роботы встретились, если они находятся в одном квадрате со стороной 1 (Пример координат (0,0) - (1,0); (0,0) - (0,0); (0,0) - (1,1))

Теперь мне нужно сделать графическое моделирование и счетные шаги, пока они не встретится в статистическом программном обеспечении R. У меня есть идея, как считать шаги, но я действительно придерживаюсь графического моделирования.

+4

Похоже, домашнее задание. что ты уже испробовал? –

+0

@BenBolker Да, это домашнее задание, у нас есть руководство для R, но оно содержит только несколько команд для рисования графиков, я прыгал, что есть некоторая простая команда, которая позволит мне рисовать маленькие линии с расстоянием 1. –

+0

Я удалил Rcpp, поскольку нет никакой связи с Rcpp, насколько я могу судить. –

ответ

1

Возможно, что-то подобное помогает? :

#basic plot 
plot(NULL, ann = F, xlim = c(-10,20), ylim = c(-10,20)) 
abline(h = -10:20, col = grey(0.75), lty = 2) 
abline(v = -10:20, col = grey(0.75), lty = 2) 

#starting coordinates 
A_coords = c(0,0) 
B_coords = c(10,0) 
text(A_coords[1], A_coords[2], "A", col = "red") 
text(B_coords[1], B_coords[2], "B", col = "blue") 

for(i in 1:15000) 
{ 
    Sys.sleep(1) 

    text(A_coords[1], A_coords[2], "A", col = "white") 
    text(B_coords[1], B_coords[2], "B", col = "white") 
                 #used jonas's idea 
    A <- A_coords + unlist(sample(list(c(0, 1), c(1, 0), c(-1, 0), c(0, -1)), 1)) 
    B <- B_coords + unlist(sample(list(c(0, 1), c(1, 0), c(-1, 0), c(0, -1)), 1)) 

    lines(c(A_coords[1], A[1]), c(A_coords[2], A[2]), col = "red") 
    lines(c(B_coords[1], B[1]), c(B_coords[2], B[2]), col = "blue") 

    A_coords <- A 
    B_coords <- B 

    text(A_coords[1], A_coords[2], "A", col = "red") 
    text(B_coords[1], B_coords[2], "B", col = "blue") 

    if(all(abs(A_coords - B_coords) <= 1)) break 
} 

list(steps = i, A_coordinates = A_coords, B_coordinates = B_coords) 
+0

Это близко к тому, что я хочу. Роботу нужно двигаться только вверх, вниз, влево или вправо на каждой итерации, но я могу это исправить. Мой вопрос: как подключить линии вместо букв, когда робот движется? И есть ли способ ускорить симуляцию, потому что 15000 шагов займет много времени, и я должен сделать 1000 симуляций (без сюжета) :( –

+1

@LeetzMKD: Вы хотите, чтобы линии соединяли путь, который каждый робот берет? В случае, если робот перемещается в противоположном направлении к его предыдущему ходу, вы потеряете часть пути. Кроме того, если вы удалите 'Sys.sleep', он ускорится. –

+0

, если вы запустите эту симуляцию, вы увидите что он создает буквы по пути, я хочу вместо букв, чтобы получить линии. И если робот движется в противоположном направлении к его предыдущему движению, не будет ли линия перекрываться и не исчезнет? –

1

Я хотел бы попробовать что-то вроде этого:

plot_robots <- function(rob1, rob2){ 
    plot(1, xlim = c(-20, 20), ylim =c(-20, 20), type = "n", xaxs = "i", yaxs = "i") 
    abline(h =-20:20, v = -20:20) 
    points(c(rob1[1], rob2[1]), c(rob2[2], rob2[2]), pch = 21, cex = 2, bg = c("red", "blue")) 
} 

rob1 <- c(0, 0) 
rob2 <- c(10, 0) 

plot_robots(rob1, rob2) 

for(i in 1:15000){ 
rob1 <- rob1 + sample(list(c(0, 1), c(1, 0), c(-1, 0), c(0, -1)), 1)[[1]] 
rob2 <- rob2 + sample(list(c(0, 1), c(1, 0), c(-1, 0), c(0, -1)), 1)[[1]] 
plot_robots(rob1, rob2) 
Sys.sleep(.1) 
} 

Это не является совершенным, но должно дать представление ... Я не думаю, что кто-нибудь есть время, чтобы смотреть роботов до они встречают. Это займет возраст ...

Смежные вопросы