Lyapunov optimization是Michael J. Neely发展起来的网络优化理论,可以参考[1,2]。因为网络研究中缺乏理论,简单好使的算法,没有高大上的公式吓人,好像就不能发到高级别的期刊上。Lyapunov optimization有几个公式,就成为一个发论文的模板。只要找到一个问题背景,把公式套进去,就是一篇。关于这理论[3]的引用量已经达到1500多次了,但是很难找到相关的代码!
我很早就知道这个理论。于是花了几天,研究了一下,没办法,眼红呀!看了几篇文章[4,5,6],这几篇文章不仅名字类似,内容也感觉是一个模子制造的。
知乎上有答主对这个方向有几句评价[7]。我个人感觉,这个方向涉及的论文,可能不是简单的灌水,可能需要制造数据!
[4]中的公式推导,还是挺容易理解的。我就按照这个模板,换个场景,稍微地推导一下。
如上图所示的排队系统,数据包的入队速度是,出队速度是,目标是是怎么样调整,使得队列mean rate stable,同时达到最大的用户满意度。用户的满意度,采用效用函数衡量,。请求的数据流速率越大,用户的满意度越高,但是会造成很长的队列占用。
队列占用,用表示。Q的变化方程:
队列mean rate stable的含义是:
优化方程:
定义,。被称为lyapunov drift。
假设存在。不必较真,全是为了凑出来!
定义lyapunov drift reward,,V是一个常数。想要获取一个大的满意度,却会导致增加,所以定义lyapunov drift reward,权衡两项,使得aggregate plus最优。这个问题就转化为根据队列占用长度,调节速率的问题。
上式可以求导,可得。使其为0,求得速率控制公式:
最终效果如何呢,不知道。参数可以慢慢选,直到出现需要的数据。我写了一个基于ns3的仿真程序,b(t)处理数据包的间隔服从possion分布,动态调整a(t)。但是也没有筛选出想个样子的数据。其实这个问题,根据估计到,调整不就行了吗。没办法,想法太简单,不能发文章呀!
后来,我就根据设置排队队列的容忍阈值,调整了速率。
这个就和lyapunov优化没有关系了。但是,根据仿真追踪的数据,我的队列长度还算是mean rate stable。
调节provider数据生成速率函数:
void LyQueue::AdjustRate(){
float previous=m_visitor->getCurrentRate();
if(m_queue>0){
//float bit=m_v/(m_queue*8);
//float rate=bit*1000/m_slot;
if(m_visitor){
if(m_queue<m_maxQ){
float ratio=(float)m_targetQ/(1.0*m_queue);
if(ratio>1.25){ratio=1.25;}
float targetRate=previous*ratio;
m_visitor->ChangeRate(targetRate);
NS_LOG_INFO("adjust "<<targetRate);
}else{
m_visitor->SetRateToMin();
}
}
}else{
float targetRate=previous*1.125;
if(m_visitor){
m_visitor->ChangeRate(targetRate);
}
}
}
实验中,b(t)为2Mbps。根据获取到数据,画了两张图。速率变化:
队列长度变化:
代码地址[8]。懂lyapunov优化的,可以帮忙改一改。
[1]Lyapunov optimization-wiki
[2] home page
[3] Stochastic Network Optimization with Application to Communication and Queueing Systems
[4] Quality-oriented Rate Control and Resource Allocation in Time-Varying OFDMA Networks
[5] Joint Rate Control and Power Allocation for Non-Orthogonal Multiple Access Systems
[6] Joint rate control and power allocation for low-latency reliable D2D-based relay network
[7] 李雅普诺夫优化问题?
[8] rate-adjust