2015-09-18 4 views
1

ПРОБЛЕМЫRandomWalk выпуск решения

Я работаю на коде, где я имитирующий выгул собака в городе - пытается бежать из города. Собака делает случайный выбор, каким образом идти на каждом перекрестке с равной вероятностью. Если застрял в тупике, собака вернется к середине большого города и начнет все заново. Собака будет делать это снова и снова, пока не выйдет из города, или пока она не устанет после Т-ряда испытаний. Но к тому времени, когда собака начнет снова с середины (N/2, N/2) по каждой попытке, она забудет все пересечения, которые она посетила в предыдущей попытке.

IDEA

Идея заключается в том, чтобы имитировать код, указанный в нашем учебнике, и придумать решение. Нам дали входные данные N, T -, где N - количество улиц с севера на юг и восток-запад в городе, а T - количество раз, когда собака попытается выбраться из города, прежде чем она сдастся. Мы должны сделать это, используя StdDraw. Нам было дано, как сделать случайные движения - генерировать число от 0 до 4 - до: 0 справа: 1 вниз: 2 слева: 3

Мой подход

import java.util.Random; 
public class RandomWalk { 
private static final Random RNG = new Random (Long.getLong ("seed", 
     System.nanoTime())); 
public static void main(String[] args) { 
    int N = Integer.parseInt(args[0]); // lattice size 
    int T = Integer.parseInt(args[1]); // number of trials 
    int deadEnds = 0;      // trials resulting in a dead end 

    StdDraw.setCanvasSize(); 
    StdDraw.setXscale(0,N); 
    StdDraw.setYscale(0,N); 

    // simulate T self-avoiding walks 
    for (int t = 0; t < T; t++) { 

     StdDraw.clear(); 

     StdDraw.setPenRadius(0.002); 
     StdDraw.setPenColor(StdDraw.LIGHT_GRAY); 

     for(int i=0;i<N;i++){ 
      StdDraw.line(i, 0, i, N); 
      StdDraw.line(0, i, N, i); 
     } 

     StdDraw.setPenColor(StdDraw.RED); 
     StdDraw.setPenRadius(0.01); 

     boolean[][] a = new boolean[N][N]; // intersections visited 
     int x = N/2, y = N/2;    // current position 



     // repeatedly take a random step, unless you've already escaped 
     while (x > 0 && x < N-1 && y > 0 && y < N-1) { 
      int t_x = x; 
      int t_y=y; 
      // dead-end, so break out of loop 
      if (a[x-1][y] && a[x+1][y] && a[x][y-1] && a[x][y+1]) { 
       deadEnds++; 
       break; 
      } 

      // mark (x, y) as visited 
      a[x][y] = true; 

      // take a random step to unvisited neighbor 
      int r = RNG.nextInt(4); 
      if (r ==3) { 
       //move left 
       if (!a[x-1][y]) 
        t_x--; 

      } 
      else if (r == 1) { 
       //move right 
       if (!a[x+1][y]) 
        t_x++; 
      } 
      else if (r == 2) { 
       //move down 
       if (!a[x][y-1]) 
        t_y--; 
      } 
      else if (r == 0) { 
       //move up 
       if (!a[x][y+1]) 
        t_y++; 
      } 

      StdDraw.line(t_x, t_y, x, y); 
      x = t_x; 
      y = t_y; 
     } 
     System.out.println("T: "+t); 
    } 
    System.out.println(100*deadEnds/T + "% dead ends"); 

    } 
} 

ВОПРОС

Учитывая N - 15, Т - 10, -Dseed = 5463786 мы должны получить результат, как - http://postimg.org/image/s5iekbkpf/

Я в m получение - см. http://postimg.org/image/nxipit0pp/

Я не знаю, где я ошибаюсь. Я знаю, что это очень специфично по своей природе, но я действительно смущен тем, что я делаю неправильно. Я пробовал все 24 перестановки 0,1,2,3, но ни один из них не дал желаемого результата. Итак, я заключаю, что проблема в моем коде.

+0

должен работать, я получил: Т: 6 Т: 7 T : 8 T: 9 20% тупиковые – AlbertFG

ответ

0

проверить StdDraw.java с:

http://introcs.cs.princeton.edu/java/stdlib/StdDraw.java.html

ваш код должен быть хорошо, я получил ожидаемый результат

+0

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

+0

Просто убедившись. Ожидаемое: http://postimg.org/image/s5iekbkpf/ Текущее: http://postimg.org/image/nxipit0pp/ – user4261932