lyapunov优化

 Lyapunov optimization是Michael J. Neely发展起来的网络优化理论,可以参考[1,2]。因为网络研究中缺乏理论,简单好使的算法,没有高大上的公式吓人,好像就不能发到高级别的期刊上。Lyapunov optimization有几个公式,就成为一个发论文的模板。只要找到一个问题背景,把公式套进去,就是一篇。关于这理论[3]的引用量已经达到1500多次了,但是很难找到相关的代码!
 我很早就知道这个理论。于是花了几天,研究了一下,没办法,眼红呀!看了几篇文章[4,5,6],这几篇文章不仅名字类似,内容也感觉是一个模子制造的。
 知乎上有答主对这个方向有几句评价[7]。我个人感觉,这个方向涉及的论文,可能不是简单的灌水,可能需要制造数据!
 [4]中的公式推导,还是挺容易理解的。我就按照这个模板,换个场景,稍微地推导一下。
在这里插入图片描述
 如上图所示的排队系统,数据包的入队速度是a(t)a(t),出队速度是b(t)b(t),目标是是怎么样调整a(t)a(t),使得队列mean rate stable,同时达到最大的用户满意度。用户的满意度,采用效用函数衡量,U=β×log(a)U=\beta\times log(a)。请求的数据流速率a(t)a(t)越大,用户的满意度越高,但是会造成很长的队列占用。
 队列占用,用QQ表示。Q的变化方程:
Q(t+1)=max[Q(t)b(t),0]+a(t) Q(t+1)=\max[Q(t)-b(t),0]+a(t)
 队列mean rate stable的含义是:
limTE(Q(t))T=0 \lim_{T\to\infty}\frac{\mathbb{E}(Q(t))}{T}=0
 优化方程:
maxUsubjectlimTE(Q(t))T=0 \max U \\ subject \lim_{T\to\infty}\frac{\mathbb{E}(Q(t))}{T}=0
 定义L(t)=Q(t)22L(t)=\frac{Q(t)^2}{2}ΔL(t)=L(t+1)L(t)\Delta L(t)=L(t+1)-L(t)ΔL(t)\Delta L(t)被称为lyapunov drift。
Q(t+1)2={max[Q(t)b(t),0]+a(t)}2Q(t)2+b(t)2+a(t)22b(t)Q(t)+2Q(t)(a(t)b(t))2a(t)b(t)Q(t)2+b(t)2+a(t)2+2Q(t)a(t) Q(t+1)^2=\{\max[Q(t)-b(t),0]+a(t)\}^2\\ \leq Q(t)^2+b(t)^2+a(t)^2-2b(t)Q(t)+2*Q(t)(a(t)-b(t))-2*a(t)b(t)\\ \leq Q(t)^2+b(t)^2+a(t)^2+2*Q(t)a(t)
Q(t+1)2Q(t)2b(t)2+a(t)2+2Q(t)a(t) Q(t+1)^2-Q(t)^2\leq b(t)^2+a(t)^2+2*Q(t)a(t)
ΔL(t)B+Q(t)a(t) \Delta L(t)\leq B+Q(t)a(t)
 假设存在Bb(t)2+a(t)22B\geq \frac{ b(t)^2+a(t)^2}{2}。不必较真,全是为了凑出来!
 定义lyapunov drift reward,ΔL(t)VU\Delta L(t)-VU,V是一个常数。想要获取一个大的满意度,却会导致ΔL(t)\Delta L(t)增加,所以定义lyapunov drift reward,权衡两项,使得aggregate plus最优。这个问题就转化为根据队列占用长度,调节速率的问题。
minQ(t)a(t)VU \min Q(t)a(t)-VU
 上式可以求导,可得Qβ×Va×ln2Q-\frac{\beta\times V}{a\times ln2}。使其为0,求得速率控制公式:
a(t)=β×VQ(t)×ln2 a(t)=\frac{\beta\times V}{Q(t)\times ln2}
 最终效果如何呢,不知道。参数V,βV, \beta可以慢慢选,直到出现需要的数据。我写了一个基于ns3的仿真程序,b(t)处理数据包的间隔服从possion分布,动态调整a(t)。但是也没有筛选出想个样子的数据。其实这个问题,根据估计到b(t)b(t),调整a(t)a(t)不就行了吗。没办法,想法太简单,不能发文章呀!
 后来,我就根据设置排队队列的容忍阈值,调整了速率。R=previousRatetargetQR=\frac{previousRate*target}{Q}
这个就和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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章