动态规划法求解最优联盟结构问题(python3)
学习我喜欢的Agent的知识,不得不学习的是联盟结构的生成问题。以论文文献:一种快速构建最优联盟结构的方法为学习材料,以下概念均来自该文献。
1.多Agent联盟的概念
联盟的形成是多Agent系统中的一个关键问题。在多Agent系统中,由于单个Agent的资源和能力的限制,为了高效地完成给定的任务,需要多个Agent组成联盟以便进行高效的合作。然而即使是完成相同的任务,多个Agent采用不同的联盟,其得到的总回报(一般用联盟值来表示)是不相同的。当不同联盟的联盟值由特征函数给出后,如何寻求使各个联盟值的总和为最大的联盟,这就是联盟的形成问题。
联盟的数学表示方式,感兴趣的可以查看论文文献:一种快速构建最优联盟结构的方法
2.动态规划法的介绍
动态规划法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。从一般意义上讲,问题所具有的这两个性质是该问题可用动态规划法求解的基本要素。
当问题的最优解包含其子问题的最优解时,称该问题具有最优子结构性质。问题的最优子结构性质提供了该问题可用动态规划法求解的重要线索。
可用动态规划法求解问题应具备的另一个基本要素是子问题重叠性质。若用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被重复计算多次。动态规划法正是利用了这种子问题的重叠性质,对每个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此问题时,只是简单地用常数时间查看一下结果。通常,不同的子问题个数随输入问题的大小呈多项式或指数级增长。因此,用动态规划法通常只需要多项式时间或指数级时间,从而获得较低的时间复杂度。
3.求解思路
3.1研究最优联盟结构的特征
文章研究最优联盟结构问题不考虑重叠联盟的情况,也就是在得到的最优联盟结构中,每一个Agent只能加入唯一的一个联盟中,不存在两个联盟的交集不为空集的情况。每个联盟的联盟值为该联盟内的所有Agent的回报值。比如,我曾经写过的一篇博文:多配送中心车辆调度问题,整个物流配送系统可以看作是一个求解最优联盟结构的问题,考虑哪几家配送中心组成的联盟(集合)可以使整个物流系统的总成本最小化,而这个总成本的刻画可以看作是每个配送中心自身的配送成本的累加和,这时候就把单个配送中心看成是一个Agent。
文献中论述了多Agent联盟求解最优联盟结构的问题满足动态规划法的两个必要条件,即最优子结构性质和子问题重叠性质,因而可以采用动态规划的思想在多项式时间内求解出最优联盟结构。
3.2找出最优联盟结构的状态转移方程
略
3.3算法实现
文献从纯理论角度论述了采用动态规划的思想较穷举法求解最优联盟结构问题的明显优势,从计算时间复杂度角度看,时间复杂度是O(3^n)。
4.小结
现在学习更多的关注是我能用学到的这个算法思想来干什么,这篇文章在我库上存了很久了,最初是想着把这个动态规划求解最优联盟结构问题的算法编出来的,但编出来之后呢,干啥子,我觉得我还是不会动态规划算法,我觉得动态规划更多的是一种思考问题的方法,穷举法应该是万能的,但系统是复杂的不可能枚举出所有的可能并且在有限时间内利用计算机求解得到精确解。关注点应该落在问题本身,我常犯的错误就是这个问题到底是什么,有没有研究的必要都不清楚,就下笔计划着写算法实现部分了,后果当然是被要求回炉再造。