黑马程序员-java基础 交通灯系统

本文介绍了一个交通灯管理系统,通过异步随机生成车辆来模拟十字路口的交通流,实现车辆按路线行驶、信号灯控制以及车辆通过路口的逻辑。系统包括道路类、车辆生成逻辑、信号灯类及其控制器,以及灯的状态切换机制。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

---------------------- android培训java培训 、期待与您交流! ----------------------

 

交通灯系统

项目要求

交通灯管理系统

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

 异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。

 信号灯忽略黄灯,只考虑红灯和绿灯。

 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


项目分析:
1 项目可以设计12条路线: 即每个方向上的 直行  左转  右转
2 每条路线上面有1个信号灯,共12个信号灯。但是,南北向直行的路线的可算一组灯,  南北向左转可算一组灯
  东西向直行算一组灯,东西向左转算一组灯。  4个方向的右转设计成永远绿灯。所以可以只设计4个灯的变化
3 创建灯的类 当一个方向的等为绿灯时,对应方向的灯变为绿灯。当灯变为红灯时,对应方向的灯也变为红灯,下一个方向的灯变为绿灯。
4 创建线路类 随机产生车辆,当车过了红绿灯后车消失
5 创建灯控制器,设置等由绿变红的时间

//创建道路类
public class Road {
 //路线的名字
 private String name;
 //创建一个集合装道路上的汽车
 List<String> vech = new ArrayList<String>();

 public Road(String name) {
  super();
  this.name = name;
  //创建一个线程专门随机没过一段时间创建一辆汽车
  ExecutorService pool = Executors.newSingleThreadExecutor();
  pool.execute(new Runnable() {

   public void run() {
    for (int i = 0; i < 1000; i++) {
     try {
      Thread.sleep(new Random().nextInt(10 + 1) * 1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     
     vech.add(Road.this.name + "---" + i);
    }
   }
  });
  //创建一个线程,专门管理当汽车过了红绿灯后就消失
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable() {

   public void run() {
    //检查是否有车,若有车则把最前面的车删除
    if(vech.size()>0){
     boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
     if(lighted==true){
      
      System.out.println(vech.remove(0)+"is traversing");
     }
    }
    
   }
  }, 1, 1, TimeUnit.SECONDS);

 }
}


// 创建灯类
public enum Lamp {
 // 定义12个枚举元素,表示每条路线上的灯,只需考虑前面4个元素的变化,中间4个元素,和前面4个元素一一对应,最后4个元素,永远设计为绿灯
 S2N("N2S", "S2W", false), S2W("N2E", "E2W", false), E2W("W2E", "E2S", false), E2S(
   "W2N", "S2W", false), N2S(null, null, false), N2E(null, null, false), W2E(
   null, null, false), W2N(null, null, false), S2E(null, null, true), E2N(
   null, null, true), N2W(null, null, true), W2S(null, null, true);
 
 //判断灯是否为绿灯
 private boolean lighted;
 //同时为绿灯对应方向的灯
 private String opposite;
 //灯变红时下一个灯变绿
 private String next;

 // 灯变绿,且它对应的灯变绿
 public void light() {
  this.lighted = true;
  // 如果有对应的,变绿
  if (opposite != null) {
   Lamp.valueOf(opposite).light();

  }
  System.out.println(name() + "灯变绿了,有6个方向的汽车穿过");
 }

 // 灯变红方法,且对应方向的灯也要变红,下一个方向的灯要变绿
 public Lamp blackOut() {
  this.lighted = false;
  if (opposite != null) {
   System.out.println("hhh");
   Lamp.valueOf(opposite).blackOut();
  }

  Lamp nextLamp = null;
  if (next != null) {
   System.out.println("gggggg");
   nextLamp = Lamp.valueOf(next);
   System.out.println("绿灯从" + name() + "----切换为" + next);
   nextLamp.light();
  }
  return nextLamp;
 }

 private Lamp() {
 }

 private Lamp(String opposite, String next, boolean lighted) {
  this.opposite = opposite;
  this.next = next;
  this.lighted = lighted;
 }

 public boolean isLighted() {
  return lighted;
 }

 public void setLighted(boolean lighted) {
  this.lighted = lighted;
 }

}


//灯控制器类
public class LampController {
 //设置当前灯对象
 private Lamp currentLamp;

 public LampController() {
  // 最开始 设置为由南向北的等为绿灯
  currentLamp = Lamp.S2N;
  currentLamp.light();
  // 没过10秒当前的灯变为红灯,并且让下一个方向的灯变绿灯
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable() {

   public void run() {
    System.out.println("jjjj");
    currentLamp = currentLamp.blackOut();
   }
  }, 2, 2, TimeUnit.SECONDS);

 }
}

public class LightTest {
 public static void main(String[] args) {
  String[] directios = new String[] { "S2N", "S2W", "ESW", "E2S", "N2S",
    "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };

  for (int i = 0; i < directios.length; i++) {
   new Road(directios[i]);
  }
  
  new LampController();
 }
}

 

谁拥有数据,谁就拥有处理这些数据的方法

面向对象设计细想小题


1 小球从线的一端滚动到另一段
有一个绳子类,有一个起始点位置属性,终点位置属性和获得下一个点位置的方法
有一个小球类。有一个坐标属性 和移动方法

2 两块石头磨成一把石刀,石刀可以砍树,做成木材,木材做成椅子

创建一个石刀工厂,传入两块石头参数可以建造石刀,石刀是一个类,有砍树功能。传入树参数可以返回木材,
创建一个椅子工厂,传入木材参数可以返回椅子

 

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值