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