黑马程序员技术交流社区

标题: 升级交通灯问题(可以循环模拟的车辆的来回) [打印本页]

作者: 杨增坤    时间: 2013-8-7 16:12
标题: 升级交通灯问题(可以循环模拟的车辆的来回)
本帖最后由 forward 于 2013-8-9 18:43 编辑

在我看到了交通灯的项目后,我心里有一个问题,就是老师模拟的是每一条路上999辆车,但是我认为,只要交通灯一旦启动,就会有源源不端车辆通过。
要是把老师的每条路上999辆,改为2辆模拟,就会出现这种状况。

N2S  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2N  lamp is green 下面总共可以有六个方向看到汽车穿梭
N2S_1  is traversing!
N2S_2  is traversing!
N2W_1  is traversing!
E2N_1  is traversing!
W2S_1  is traversing!
N2W_2  is traversing!
S2N_1  is traversing!
S2E_1  is traversing!
--来了--
绿灯从S2N-------->切换为S2W
N2E  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2W  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2W_1  is traversing!
N2E_1  is traversing!
S2E_2  is traversing!
W2S_2  is traversing!
S2W_2  is traversing!
N2E_2  is traversing!
E2N_2  is traversing!
--来了--
绿灯从S2W-------->切换为E2W
W2E  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2W  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2W_1  is traversing!
W2E_1  is traversing!
E2W_2  is traversing!
W2E_2  is traversing!
--来了--
绿灯从E2W-------->切换为E2S
W2N  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2S  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2S_1  is traversing!
W2N_1  is traversing!
E2S_2  is traversing!
W2N_2  is traversing!
--来了--
绿灯从E2S-------->切换为S2N
N2S  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2N  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2N_2  is traversing!
--来了--
绿灯从S2N-------->切换为S2W
N2E  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2W  lamp is green 下面总共可以有六个方向看到汽车穿梭
--来了--
绿灯从S2W-------->切换为E2W
W2E  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2W  lamp is green 下面总共可以有六个方向看到汽车穿梭
--来了--
绿灯从E2W-------->切换为E2S
W2N  lamp is green 下面总共可以有六个方向看到汽车穿梭
E2S  lamp is green 下面总共可以有六个方向看到汽车穿梭
--来了--
绿灯从E2S-------->切换为S2N
N2S  lamp is green 下面总共可以有六个方向看到汽车穿梭
S2N  lamp is green 下面总共可以有六个方向看到汽车穿梭


其实999辆和2辆都是一样的,都会过完,我认为可以是路上的不断的来,只要来了,就进行数,然后过一段时间,就汇报一下,然后在重新计数。

这样设计比较好将Road更改一下:
public class Road {
        private List<String> vechicles = new ArrayList<String>();
        private String name = null;
    private int count=0;//车辆计数器
    private int SumCount=0;//存储总车辆
    private Calendar calendar=new GregorianCalendar();//日历
        public Road(String name) {
                this.name = name;
                ExecutorService pool = Executors.newSingleThreadExecutor();
                pool.execute(new Runnable() {

                        public void run() {
                                int i=0;
                                while (true) {
                int startHour=calendar.get(Calendar.HOUR);//获得开始小时
                                        for (i = 1; i < 100000; i++) {//间隔是一个小时 一个小时之内不可能有10万辆车上路
                                                try {
                                                        Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                                count++;                        
                                                vechicles.add(Road.this.name + "_" + i);
                                        }
                                        int endHour=calendar.get(Calendar.HOUR);//获得结束小时
                                        int jiange=(endHour-startHour);
                                        if(jiange==2){
                                                SumCount+=count;
                                                System.out.println(Road.this.name+"一个小时之内已经有"+vechicles+"车辆");
                                                startHour=endHour;//将结束时间给赋给初始时间,下一秒就会变成当前系统时间小时,这只是起到一个重新计数的作用,也可以把100赋给初始时间
                                                i=0;//计数重新开始,然后车辆的编号也开始重新命名
                                                vechicles.removeAll(vechicles);//将车辆集合清空
                                        }
                                       
                                }

                        }
                });

                ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                if (vechicles.size() > 0) {
                                        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                                        if (lighted) {
                                                System.out.println(vechicles.remove(0)
                                                                + "  is traversing!");
                                        }
                                }
                        }
                }, 1, 1, TimeUnit.SECONDS);
        }
}

请大家看一下对与这个有什么好的提议吗??请大家指教!

作者: 佟都    时间: 2013-8-7 17:16
本帖最后由 佟都 于 2013-8-7 17:29 编辑

将每条路上的车数从999改为2后,实际上是对该方向上的车辆限行。
运行结果是,这个方向上通过2辆车后不在有车通过。
下面是测试结果:

  1. S2N灯:变绿
  2. ------------------------
  3. 当前全部交通灯状态:
  4. S2N-GREEN, S2W-RED, E2W-RED, E2S-RED,
  5. N2S-GREEN, N2E-RED, W2E-RED, W2N-RED,
  6. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  7. ------------------------
  8. E2S方向:第1辆车,上路……
  9. N2W方向:第1辆车,上路……
  10. N2W方向:第1辆车,通行!
  11. S2N方向:第1辆车,上路……
  12. S2N方向:第1辆车,通行!
  13. E2N方向:第1辆车,上路……
  14. E2N方向:第1辆车,通行!
  15. S2W方向:第1辆车,上路……
  16. E2W方向:第1辆车,上路……
  17. E2N方向:第2辆车,上路……
  18. E2N方向:第2辆车,通行!
  19. S2E方向:第1辆车,上路……
  20. S2E方向:第1辆车,通行!
  21. S2W方向:第2辆车,上路……
  22. W2E方向:第1辆车,上路……
  23. W2S方向:第1辆车,上路……
  24. W2S方向:第1辆车,通行!
  25. N2W方向:第2辆车,上路……
  26. N2W方向:第2辆车,通行!
  27. S2N方向:第2辆车,上路……
  28. S2N方向:第2辆车,通行!
  29. E2S方向:第2辆车,上路……
  30. E2W方向:第2辆车,上路……
  31. N2S方向:第1辆车,上路……
  32. N2S方向:第1辆车,通行!
  33. N2E方向:第1辆车,上路……
  34. W2N方向:第1辆车,上路……
  35. S2N灯:变红
  36. S2W灯:变绿
  37. ------------------------
  38. 当前全部交通灯状态:
  39. S2N-RED, S2W-GREEN, E2W-RED, E2S-RED,
  40. N2S-RED, N2E-GREEN, W2E-RED, W2N-RED,
  41. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  42. ------------------------
  43. S2W方向:第1辆车,通行!
  44. W2N方向:第2辆车,上路……
  45. N2E方向:第1辆车,通行!
  46. S2W方向:第2辆车,通行!
  47. W2E方向:第2辆车,上路……
  48. S2E方向:第2辆车,上路……
  49. S2E方向:第2辆车,通行!
  50. N2E方向:第2辆车,上路……
  51. N2E方向:第2辆车,通行!
  52. W2S方向:第2辆车,上路……
  53. W2S方向:第2辆车,通行!
  54. N2S方向:第2辆车,上路……
  55. S2W灯:变红
  56. E2W灯:变绿
  57. ------------------------
  58. 当前全部交通灯状态:
  59. S2N-RED, S2W-RED, E2W-GREEN, E2S-RED,
  60. N2S-RED, N2E-RED, W2E-GREEN, W2N-RED,
  61. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  62. ------------------------
  63. E2W方向:第1辆车,通行!
  64. W2E方向:第1辆车,通行!
  65. E2W方向:第2辆车,通行!
  66. W2E方向:第2辆车,通行!
  67. E2W灯:变红
  68. E2S灯:变绿
  69. ------------------------
  70. 当前全部交通灯状态:
  71. S2N-RED, S2W-RED, E2W-RED, E2S-GREEN,
  72. N2S-RED, N2E-RED, W2E-RED, W2N-GREEN,
  73. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  74. ------------------------
  75. E2S方向:第1辆车,通行!
  76. W2N方向:第1辆车,通行!
  77. E2S方向:第2辆车,通行!
  78. W2N方向:第2辆车,通行!
  79. E2S灯:变红
  80. S2N灯:变绿
  81. ------------------------
  82. 当前全部交通灯状态:
  83. S2N-GREEN, S2W-RED, E2W-RED, E2S-RED,
  84. N2S-GREEN, N2E-RED, W2E-RED, W2N-RED,
  85. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  86. ------------------------
  87. N2S方向:第2辆车,通行!
  88. S2N灯:变红
  89. S2W灯:变绿
  90. ------------------------
  91. 当前全部交通灯状态:
  92. S2N-RED, S2W-GREEN, E2W-RED, E2S-RED,
  93. N2S-RED, N2E-GREEN, W2E-RED, W2N-RED,
  94. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  95. ------------------------
  96. S2W灯:变红
  97. E2W灯:变绿
  98. ------------------------
  99. 当前全部交通灯状态:
  100. S2N-RED, S2W-RED, E2W-GREEN, E2S-RED,
  101. N2S-RED, N2E-RED, W2E-GREEN, W2N-RED,
  102. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  103. ------------------------
  104. E2W灯:变红
  105. E2S灯:变绿
  106. ------------------------
  107. 当前全部交通灯状态:
  108. S2N-RED, S2W-RED, E2W-RED, E2S-GREEN,
  109. N2S-RED, N2E-RED, W2E-RED, W2N-GREEN,
  110. S2E-GREEN, E2N-GREEN, N2W-GREEN, W2S-GREEN.
  111. ------------------------
  112. … …
复制代码
如果嫌每条路上1000辆车太少,可以像你代码中那样修改为10000就是。
至于统计每个小时的车流量以及清空集合释放资源,确实属于升级;
但对这个问题的理解和建模感觉帮助不大。
作者: 杨增坤    时间: 2013-8-7 17:28
佟都 发表于 2013-8-7 17:16
将每条路上的车数从999改为2后,实际上是对该方向上的车辆限行。
运行结果是,这个方向上通过2辆车后不在有 ...

我的意思不是限行,而是想循环的模拟车辆上路
作者: 佟都    时间: 2013-8-7 17:38
本帖最后由 佟都 于 2013-8-7 19:20 编辑
forward 发表于 2013-8-7 17:28
我的意思不是限行,而是想循环的模拟车辆上路

感觉你的所谓的“模拟”,只是在原来的基础上增加了车辆数(以防限行),
然后强制每小时统计一次,清空一次。

这和运行原代码3分钟,然后手动停止,不是一样的么?(车辆数也不存在限行)

虽然,最后确实实现了循环。

p.s.
1、这里的“循环的模拟车辆上路”,改成“循环模拟交通灯问题”可能更贴切些。
    因为测试场景(路,还是那12条路;灯,还是那12盏灯)没变,只不过测试数据(路上的车)变了。
2、始终觉得升级的是统计每小时车流量。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2