博弈论(二): 车联网环境下一个基于 博弈论的十字路口智能 交通控制算法

2023-12-12 14:08

本文主要是介绍博弈论(二): 车联网环境下一个基于 博弈论的十字路口智能 交通控制算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 问题描述

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 号车保持当前速度行驶。

  1. 在给定车辆数据与玩家策略后可以运行驾驶模拟

 

3.1数据:

道路结构如图 3 所示。每次模拟中随机生成 4 辆车的数据,每辆车的数据的形式为(d, v),如图所示,为车辆距离停车线stop _line 的距离,范围为[0,90],v为车辆的当前速度,初始化范围为[20,40],规则是加速后速度不能超过40,减速下限无限制。

3.2根据车辆动作速度更新:

为简化计算过程,实验中加速(action = 1)直接将原速度提高 40%,减速(action = −1)直接将原速度减少 40%,保持当前速度则速度不变。速度的更新公式为:

\small v\_new=v\times \left ( 1+action\times 0.4 \right )

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()

 

这篇关于博弈论(二): 车联网环境下一个基于 博弈论的十字路口智能 交通控制算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484898

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Rust 智能指针的使用详解

《Rust智能指针的使用详解》Rust智能指针是内存管理核心工具,本文就来详细的介绍一下Rust智能指针(Box、Rc、RefCell、Arc、Mutex、RwLock、Weak)的原理与使用场景,... 目录一、www.chinasem.cnRust 智能指针详解1、Box<T>:堆内存分配2、Rc<T>:

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本