博弈论(二): 车联网环境下一个基于 博弈论的十字路口智能 交通控制算法
- 问题描述
1、胆小鬼博弈
胆小鬼博弈(The game of chicken)又译懦夫博弈,是博弈论中一个影响深远的模型,逻辑就是“不要命的最大”。模型中,两名车手相对驱车而行,谁最先转弯的一方被耻笑为“胆小鬼”(chicken),让另一方胜出,因此这博弈模型在英文 中 称 为 The Game of Chicken(懦夫游戏),但如果两人拒绝转弯,任由两车相撞,最终谁都无法受益。其收益矩阵如图.1 所示。本方法受胆小鬼博弈启发。
该博弈只有两名玩家,#1决定车辆 2 和 4 的动作,而#2决定
车辆 1 和 3 的动作,如图 2 所示。每个玩家想要以这样的方式控制车辆以最小化它们在交叉路口的延迟并保证它们安全地(未发生碰撞)穿过十字路口。
每个玩家最三种可能的动作:加速(表示为1),减速(表示为−1)或以当前速度继续行驶(表示为0)。由于每个玩家有两辆车并且每辆车都有动作组,因此
玩家的动作是车辆动作的笛卡尔乘积。每辆汽车可以采取的动作是{1, 0,−1}, 则 每个 玩家 可 以 采 取 的 动 作 有 9 种,即 { 1 , 0 , −1 }×{ 1 , 0 , −1 } =
{ (1,1), (1,0) , (0,1) , (1, −1) , (−1,1), (0,0) , (0, −1) , (−1,0) , (−1, −1) } ,例如
#1的动作为(1,0)代表他命令 2 号车加速,3 号车保持当前速度行驶。
- 在给定车辆数据与玩家策略后可以运行驾驶模拟
3.1数据:
道路结构如图 3 所示。每次模拟中随机生成 4 辆车的数据,每辆车的数据的形式为(d, v),如图所示,为车辆距离停车线stop _line 的距离,范围为[0,90],v为车辆的当前速度,初始化范围为[20,40],规则是加速后速度不能超过40,减速下限无限制。
3.2根据车辆动作速度更新:
为简化计算过程,实验中加速(action = 1)直接将原速度提高 40%,减速(action = −1)直接将原速度减少 40%,保持当前速度则速度不变。速度的更新公式为:
3.3碰撞判定:
以图3中4号碰撞点为例,计算3号车与4号车到达碰撞点4的时间差,如时间差小于1s则判定为碰撞,否则判定为通过。
3.4博弈损失(通行时间)
一次模拟中 4 个碰撞点中有一个发生了碰撞则为博弈中双输的情况,该次博弈损失为无穷大( inf )。如未发生碰撞,则博弈损失为 4 辆车通过该十字路口的平均时间。一辆车( d, v )的通行时间为:
此处假设车辆经过一次速度调整后,在驶出路口前不再调整速度。
4.1计算博弈损失矩阵
遍历所有的决策组合,计算出博弈损失矩阵(通行时间),并给出最快通过时的玩家的决策:
(1, 1) |
(1, 0) |
(1, -1) |
(0, 1) |
(0, 0) |
(0, -1) |
(-1, 1) |
(-1, 0) |
(-1, -1) |
|
(1, 1) |
|||||||||
(1, 0) |
|||||||||
(1, -1) |
|||||||||
(0, 1) |
|||||||||
(0, 0) |
|||||||||
(0, -1) |
|||||||||
(-1, 1) |
|||||||||
(-1, 0) |
|||||||||
(-1, -1) |
通行时间最短:
Player #1 采取的策略 :
Player #2 采取的策略 :
4.2与传统方法对比
传统方法:先截断一个方向的车流,让另一个方向的车全部通行后在开流。例如先让车 2,4 通行,后让 1,3 通行。通行时间为
每次实验中,随机生成 4 辆车的数据,计算该数据在传统方法下的通行时间,再计算 4.1 中的矩阵,以矩阵中的最小值为博弈方法的通行时间。
进行 10 次实验,分别记录 10 次实验中博弈方法和传统方法的结果,书写实验报告。
- 实验结果
遍历所有的决策组合,计算出博弈损失矩阵(通行时间),并给出最快通过时的玩家的决策:
(1, 1) |
(1, 0) |
(1, -1) |
(0, 1) |
(0, 0) |
(0, -1) |
(-1, 1) |
(-1, 0) |
(-1, -1) |
|
(1, 1) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(1, 0) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(1, -1) |
inf |
inf |
7.3 |
inf |
inf |
7.7 |
inf |
inf |
inf |
(0, 1) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(0, 0) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(0, -1) |
inf |
inf |
7.5 |
inf |
inf |
7.9 |
inf |
inf |
inf |
(-1, 1) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(-1, 0) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
(-1, -1) |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
inf |
通行时间最短: 7.3s
Player #1 采取的策略 :[1, -1]
Player #2 采取的策略 :[1, -1]
传统时间: 13.7s
重复十次实验
最短通行时间 |
传统时间 |
|
1 |
[[-1, 1], [1, 1]] 8.04 |
18.85 |
2 |
[[1, 1], [0, 0]] 6.34 |
16.53 |
3 |
[[0, -1], [1, -1]] 8.38 |
14.84 |
4 |
[[0, 0], [0, 1]] 6.56 |
15.90 |
5 |
[[-1, 0], [1, 1]] 6.23 |
13.52 |
6 |
[[1, 1], [0, -1]] 7.57 |
17.08 |
7 |
All accident |
17.25 |
8 |
All accident |
15.90 |
9 |
[[-1, 0], [1, 1]] 6.20 |
14.16 |
10 |
All accident |
11.78 |
- 代码展示
import random
# 初始化一辆车
def init():v = random.uniform(20, 40)d = random.uniform(0, 90)return [d, v, 0]def cal_time(car):return (90-car[0])/car[1] + (110+car[0])/car[2]def tradition(car):car1, car2, car3, car4 = carreturn max(200/car1[1], 200/car3[1]) + max(200/car2[1], 200/car4[1])def game_run(player1, player2, car):# 初始化车辆car1, car2, car3, car4 = car# 速度更新car1[2] = car1[1] * (1 + player2[0] * 0.4)car2[2] = car2[1] * (1 + player1[0] * 0.4)car3[2] = car3[1] * (1 + player2[1] * 0.4)car4[2] = car4[1] * (1 + player1[1] * 0.4)# 碰撞分析accident = any([abs((car4[0] + 15) / car4[2] - (car1[0] + 5) / car1[2]) < 1, abs((car1[0] + 15) / car1[2] - (car2[0] + 5) / car2[2]) < 1, abs((car2[0] + 15) / car2[2] - (car3[0] + 5) / car3[2]) < 1, abs((car3[0] + 15) / car3[2] - (car4[0] + 5) / car4[2]) < 1]) return (cal_time(car1) + cal_time(car2) + cal_time(car3) + cal_time(car4)) / 4 + accident * 9999999def main():# 设置玩家行动# player1 = [1, 1] # player2 = [1, 1] action = [[1, 1], [1, 0], [1, -1], [0, 1], [0, 0], [0, -1], [-1, 1], [-1, 0], [-1, 1]]car = [init(), init(), init(), init()]print("init car:", car)min_t = 999min_t_action = Nonefor i in range(9):for j in range(9):t = game_run(action[i], action[j], car) # run(player1, player2)if t < 9999999:print("%.1f" % t, end=" ")if t < min_t:min_t = tmin_t_action = [action[i], action[j]]else:print("inf", end=" ")print()if min_t_action:print("min of game: ", min_t_action, "%.1f" % min_t)else:print("min of game: accident")print("tradition time: ", "%.1f" % tradition(car))if __name__ == "__main__":main()
博弈论(二): 车联网环境下一个基于 博弈论的十字路口智能 交通控制算法相关推荐
- 五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第四天
音视频播放功能 <智能家居系列> 一.音频播放 1.Linux下的音频播放实现 2.实现步骤 二.语音播报信息 三.视频播放 1.素材准备 2.实现步骤 四.项目框架搭建 <智能家居 ...
- 车联网环境下自动驾驶的协同感知技术综述
论文标题:Cooperative Perception Technology of Autonomous Driving in the Internet of Vehicles Environment ...
- 五天完成项目-《基于Linux环境下的Cortex A53的手势识别智能家居》-第五天
视频监控和家电控制 <智能家居系列> 一.视频监控基础 1.摄像头 2.v4l2 3.Linux下的摄像头使用流程 4.烧写程序到开发板 5.运行程序 (先插上摄像头) 二.视频监控功能 ...
- 笔记-车联网环境下交叉口速度引导
信号交叉口车速引导 在有信号交叉口,对于人工驾驶车来说,只受信号灯和前方车辆的影响,而人工车无法准确获得信号灯时间和自车离停止线的距离,无法对其进行速度引导,他只能跟随前方车辆行驶:但是随着车联网技术 ...
- spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
spring boo Spring-boot提供了一种创建基于Spring的应用程序的快速方法. 对于下一个项目,有一些非常令人信服的理由考虑使用Spring-boot: 原因1:使用spring-b ...
- 为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
Spring-boot提供了一种创建基于Spring的应用程序的快速方法. 对于下一个项目,有一些非常令人信服的理由考虑使用Spring-boot: 原因1:使用spring-boot启动程序项目进行 ...
- 帮我写一个基于51单片机的智能刹车系统
我可以为您提供一个基于51单片机的智能刹车系统设计方案.这个系统将包括一个51单片机.一块刹车片.控制电路和一个脚踏开关.它的工作原理是:通过51单片机对脚踏开关的输入进行解码,然后控制刹车片进行刹车 ...
- 基于51单片机十字路口红绿灯交通灯+紧急模式
基于51单片机十字路口红绿灯交通灯 +无黄灯+紧急 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:J010 目录标题 基于51单片机十字路口红绿灯交 ...
- “碳中和”愿景下的智慧灯杆,助力智能交通全链条减碳
第七十五届联合国大会上,"中国将力争2030年前达到二氧化碳排放峰值,努力争取2060年前实现碳中和."这是我们向国际社会作出的郑重承诺.实现"碳达峰"&quo ...
最新文章
- 用Rhino V7建造机甲学习教程 Building a Mecha using Rhino V7
- SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程
- java线程和操作系统线程的区别,赶紧收藏备战金三银四!
- Windows 10累积更新发布:RS3正式版前最后一更
- delphi的dbgrid控件点击title排序
- 安卓手机备份_备份安卓手机中的APK安装文件?小编这儿有4种方法
- Linux的capability深入分析(1)
- Java多张图片合成PDF
- Java面向对象练习题继承之物种
- MySql-Mysql技术内幕~SQL编程学习笔记(1)
- JAVA HD japan_E3X-HD光纤放大器_欧姆龙继电器_欧姆龙PLC_欧姆龙接近开关
- java获取文件名后缀
- 【转】最落魄的日子你是怎样熬过来的?
- 完美实现无毛边异形窗体
- SRE(运维工程师)成长路上的十本书籍推荐
- Android studio: The number of method references in a .dex file cannot exceed 64K. Learn how to resol
- 快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令
- 图片内容转文字用Java怎么实现?
- TCL电子2019上半年电视机销量稳居全球第二
- 手机通过ESP8266(WiFi)控制stm32f103c8t6的洒水小车
热门文章
- LIFT: Learned Invariant Feature Points完整调试记录(三)安装theano+Lasagne
- ab命令压力测试网站性能
- 基于JAVAMVC的时鲜蔬菜配送系统计算机毕业设计源码+系统+lw文档+部署
- 织梦php访问,织梦首页如何显示访问者ip地址
- ckeditor使用教程 php,为ckeditor编辑器修改添加一键排版功能
- UG.10超简单教程
- 为了考研,我制作了一款考研题库小程序
- 管理3.0 学习词汇笔记 五 复杂理论
- python批量爬取图片详细解析,不会你来打我(欢迎打我)
- ​【家电行业数字化转型报告】数智观点:逆势增长的家电企业如何迎战新拐点?