基于RL的拥塞控制算法Orca

Orca是一款基于RL(强化学习)的拥塞控制算法,源自论文「经典与现代:基于实用学习的互联网拥塞控制」。项目包括源码和实验材料,支持在Mahimahi模拟环境中运行。安装过程涉及创建虚拟环境,安装依赖如Tensorflow,并对Linux内核进行修补。Orca有两种模式:独立演员版和演员学习版,适用于模型测试和学习。训练模型时,可通过调整params.json配置远程服务器分布。使用蜂窝轨迹数据可进一步测试算法性能。
摘要由CSDN通过智能技术生成

项目源码Orca

Orca v1.0

本版本提供了论文“经典与现代:基于实用学习的互联网拥塞控制”中的源代码和实验材料。

安装指南

安装所需工具
安装Mahimahi

sudo apt-get install build-essential git debhelper autotools-dev dh-autoreconf iptables protobuf-compiler libprotobuf-dev pkg-config libssl-dev dnsmasq-base ssl-cert libxcb-present-dev libcairo2-dev libpango1.0-dev iproute2 apache2-dev apache2-bin iptables dnsmasq-base gnuplot iproute2 apache2-api-20120211 libwww-perl
git clone https://github.com/ravinet/mahimahi 
cd mahimahi
./autogen.sh && ./configure && make
sudo make install
sudo sysctl -w net.ipv4.ip_forward=1

Orca的深度强化学习Agent
先决条件

  • Python >= 3.4
  • Tensorflow 1.14.0

创造一个虚拟环境

mkdir ~/venv
sudo apt update
sudo apt install python3-pip
sudo pip3 install -U virtualenv
virtualenv ~/venv -p python3

如果更改虚拟环境的路径,则需要相应地更改源代码。源代码假定虚拟环境设置为@~/venv。

安装程序包

source ~/venv/bin/activate
pip install --upgrade pip
pip install gym
pip install tensorflow==1.14
pip install sysv_ipc

验证安装

python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

停用venv

(venv) $ deactivate

修补Orca的内核:(选项1)
安装Orca补丁内核的最简单方法是安装准备好的debian软件包:

cd linux
sudo dpkg -i linux-image*
sudo dpkg -i linux-header*
sudo reboot 

修补Orca的内核:(选项2)
如果您已经完成了选项1,跳过这一部分!另一个选择是使用提供的补丁编译自己的内核。您可以使用此处提供的说明执行此操作:链接
源代码在linux文件夹中 链接
验证新内核
安装Orca内核并重新启动系统后,请使用以下命令确保系统正在使用新内核:

uname -r

输出应为4.13.1-0521*。如果不是,您需要将4.13.1-0521*内核映像放在grub列表的顶部。例如,gruer可以自定义应用程序。使用以下命令安装grub自定义程序:

sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
sudo grub-customizer

创建Orca的服务器客户端应用程序

要构建所需的应用程序,请运行以下命令:

./build.sh

这个版本包括两个版本:独立演员版和演员学习版。在独立演员版本中,不会启动学习者。当您只想通过模拟链接测试当前模型时,这是很有用的。然而,actor-learner版本要求在启动任何actor之前启动一个学习者。第二种模式可用于学习新的/更好的模型,也可用于在模拟链接上执行简单的测试。

使用提供的学习模型对独立版本运行一个示例测试

./orca-standalone-emulation.sh 44444

使用提供的学习模型,用acotr学习者版本运行一个示例测试

./orca.sh 4 44444

结果将在rl-module/log/*中自动生成。您可以在rl-module/log/sum-*查看结果摘要。

训练注意事项:

  1. 要在远程服务器上分发角色,您需要将params.json文件的“ learner_ip”和“ actor_ip”字段更改为相应的服务器IP。
  2. 首先开始学习。
  3. 使用远程服务器时,设置remote:true。
  4. 设置num_actors:N,N是演员数。

蜂窝痕迹:
要使用可用的跟踪@ https://github.com/Soheil-ab/Cellular-Traces-NYC,请将其复制到项目的跟踪文件夹。

ORCA算法是一种用于多智能体路径规划的算法,它可以避免智能体之间的碰撞。在Unity中,可以使用Dots框架来实现ORCA算法。 首先,需要在Unity中安装Dots框架并创建一个新的Dots项目。然后,在项目中创建一个新的C#脚本,命名为“ORCA.cs”。 在ORCA类中,我们需要定义一些变量来存储智能体的位置、速度和半径等信息。以下是一个示例变量列表: ``` public struct Agent { public float2 position; public float2 velocity; public float radius; } public Agent[] agents; ``` 接下来,我们需要实现ORCA算法的主要逻辑。我们首先需要计算每个智能体的速度障碍物,这些速度障碍物可以帮助我们避免碰撞。以下是一个示例函数: ``` private void ComputeVelocityObstacles() { for (int i = 0; i < agents.Length; i++) { for (int j = 0; j < agents.Length; j++) { if (i == j) continue; float2 relativePosition = agents[j].position - agents[i].position; float2 relativeVelocity = agents[i].velocity - agents[j].velocity; float radiusSum = agents[i].radius + agents[j].radius; float s = relativePosition.dot(relativeVelocity) / relativeVelocity.LengthSquared; float squaredDistance = relativePosition.LengthSquared - s * s; float radiusSquared = radiusSum * radiusSum; if (s < 0 && squaredDistance > radiusSquared) { // No collision is possible continue; } float2 w = relativeVelocity - s * relativePosition / relativePosition.Length; float wLengthSquared = w.LengthSquared; float dotProduct = w.dot(relativePosition); if (dotProduct < 0 && dotProduct * dotProduct > radiusSquared * wLengthSquared) { // No collision is possible continue; } float leg = Mathf.Sqrt(wLengthSquared - radiusSquared); float2 velocityObstacle1 = (leg * relativePosition - radiusSquared * w) / wLengthSquared; float2 velocityObstacle2 = (-leg * relativePosition - radiusSquared * w) / wLengthSquared; agents[i].velocityObstacles.Add(velocityObstacle1); agents[i].velocityObstacles.Add(velocityObstacle2); } } } ``` 在计算完每个智能体的速度障碍物后,我们需要使用这些障碍物来计算每个智能体的新速度。以下是一个示例函数: ``` private void ComputeNewVelocities() { for (int i = 0; i < agents.Length; i++) { float2 preferredVelocity = agents[i].preferredVelocity; float2 obstacleVelocity = float2.zero; for (int j = 0; j < agents[i].velocityObstacles.Count; j++) { if (agents[i].velocityObstacles[j].dot(preferredVelocity - agents[i].velocityObstacles[j]) > 0) { obstacleVelocity += agents[i].velocityObstacles[j]; } } agents[i].velocity = preferredVelocity + obstacleVelocity; } } ``` 最后,我们需要在Update函数中调用这些函数来更新每个智能体的速度和位置。以下是一个示例Update函数: ``` void Update() { ComputeVelocityObstacles(); ComputeNewVelocities(); for (int i = 0; i < agents.Length; i++) { agents[i].position += agents[i].velocity * Time.deltaTime; } } ``` 以上是一个基本的ORCA算法实现,你可以根据自己的需求对其进行修改和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值