建模一个动态规划无限传输问题
问题描述
本节实现一个动态规划问题实现。具体问题见上一节的第三个栗子。这里再次简述:
- 在N个时隙中传输M个数据包
- 信道条件有两种:好(概率为 p ),不好(概率 (1−p) )
- 在好信道下传播的代价是 PG ,不好条件传输下是 PB(PB<PG)
时隙用完之后剩下的 m 个数据包开销为 C(m)
目标:需要建立一个动态规划系统,完成传输任务,使得传输代价在平均意义上是最优的。
状态确定
在一个时刻系统可以观察到的有两个量:剩余数据包数量m以及信道状态H。因此我们将二者联合组成系统状态(m,H)。那么在每一个时隙系统总共有2*(m+1)个状态。每一个状态可能跳转到下一个时隙的某一个或者一些状态。跳转判断条件有:
- 在好信道下传输的代价
- 在好信道下不传输代价
- 在坏信道条件下传输代价
- 在坏信道条件下不传输代价
其实上述条件中的3可以忽略,因为在好信道条件下传输一定是最优的。故不可能在好信道条件下还不传输。所以我们的优化是为了对抗坏信道的。系统得到第i时刻的状态,需要根据对未来的估计确定现在的控制(传还是不传?)。因此系统是基于N,N-1,…,i+1时刻的信息来指导第i时刻的决策。
状态跳转分析
系统必须在N个时隙中传完M个数据包。则没有传完的代价是非常大的。故:
C(m)={0 m=0∞ m>0
可得第N-1个时隙的状态:
首先估计第N-1个时隙的开销,此时有可能还剩0个数据包,即之前的时隙全部发送完毕。可能还剩1个。可能还剩1个以上,否则将无法全部传输。所以剩余1个以上的状态无需计算,直接给最大值。剩余0个不必传输,也就是代价为0。剩余1个时,可能在好的信道条件下,也可能在坏的信道条件下。因此每一个状态需要计算2个(传输或者不传输)代价,并取最小值作为当前状态的代价。
因此我们可以得到N-1时刻的每一个状态对应的开销:
状态值 | 状态开销 |
---|---|
(0,好) | 0 |
(0,坏) | 0 |
(1,好) | PG |
(1,坏) | PB |
其他 | +∞ |
其实从这里我们就可以看出,动态规划具有一定的导向。最终会将所有数据包都发送完毕。
接下来我们来分析一般情况下状态转移。首先我们需要明确一般状态的约束:
1. 每一个状态其剩余数据包数量必须小于某一个值(现在记为leftMAX),因为我们必须保证最后一个时隙之前数据包发送完毕。所以,leftMAX = N – t,当N-t < M时 leftMAX = M。t代表当前时隙。超过leftMAX的所有状态都无法完成数据包的传输,因此代价为 +∞ 。
2. 每一个状态都必须有一个最小值,因为每一个时隙只能传递一个数据包,所以第一个时隙只能有M个数据包。第二个时隙最少只能有M-1个。。第t个时隙,最多只能有M-t+1个数据包,我们记为leftMIN。低于这个数量不可能发生,因此代价为 +∞ 。
3.状态跳转:我们需要根据t时刻的状态信息计算t-1时刻的状态信息。(现在已知t时刻信息)
t-1时刻状态 | 分析方法 |
---|---|
小于leftMIN | +∞ |
(i,好) | 好信道一定传(除非i=0) |
(i,不好) | 坏信道看情况:1、传数据,则COST= PB+t(i−1,好)×p+t(i−1,坏)×(1−p) 2、不传数据,则 COST = t(i,好)×p+t(i,坏)×(1−p) |
···· | ···· |
大于leftMAX | +∞ |
小结&代码
当计算到时刻1的时候即完成了动态规划的状态刻画,此后只要在这个模型下,我们都可以利用上述状态跳转方式来对每一个决策进行规划, 使得整体开销在平均意义上达到最优。
本人按照上述模型写了一份C++代码,托管在这里,如果有务还请指教!