system: [SYSTEM]

user: 3. 问题的解决 3.1. 蚁群算法设计 在算法设计之前必须对算法初始状态以及相关数据进行设定：1) 要对参数初始化(包括时间，最大循环次数，蚂蚁个数，节点个数，初始节点信息素等)，2) 蚂蚁状态转移公式。 3.1.1. 参数初始化 为更准确预测，对每个采购商限定资金上限，对于第i个采购商，他的采购资金上限为 L i ，同时为确定每个节点初始信息量，第一次采购中采取贪心算法，令 S i 为第i个采购商的物资集。令时间 t = 0 和循环次数 N 0 = 0 ，设置最大循环次数 N c max ，将m个蚂蚁置于n个节点上，这时我们将不同地区的采购商作为节点构造二部图(令有向图的每条(i，j)表示第j种物资被第i个蚂蚁采购。)初始化信息量由第一次的采购中采用边际效益最大的贪婪原则按照如下算法进行初值的确定： Step1 令 S i = 0 ， i = 1 ， 2 ， ⋯ ， n Step2 取 k ∈ C ，使 θ i k = f ( S ∪ i { c k i } ) − f ( S i ) = max j ∈ C { f ( S ∪ i { c j } ) − f ( S i ) } Step3 令 S i = S ∪ i { c k } 。 ∑ k ∈ S i p k c k < L i 转step2，否则转step5。 Step5 对于物资集C中的元素初始信息量按如下算法进行 for j = 1 to m 令 t 0 = 0 ， τ j ( t 0 ) = 0 for i = 1 to n 若 j ∈ S i ，则 τ j ( t 0 ) = τ j ( t 0 ) + 1 next i output τ j (t0) next j 3.1.2. 设定蚂蚁状态转移概率公式: 将蚂蚁状态转移概率公式定义为： P = [ p j ( i ) ] α [ η j ( i ) ] β / ∑ s ∈ c − t a b u ( i ) [ τ s ( i ) ] [ η s ( i ) ] β 其中C为物资集，tabu(i)为第i个蚂蚁的禁忌表;a为信息启发式因子，表示轨迹的相对重要性即积累信息在蚂蚁运动时所起的作用，其值越大，则该蚂蚁倾向于选择其它蚂蚁经过的路径，从侧面又反映了流行趋势。在本例中由于是不同地域之间的相互参考，a为相对敏感的参数；b为期望启发式因子，在本例中 与价值有很大关系，反映了蚂蚁对价格的受重视程度； η j ( i ) ( t ) 表示蚂蚁对于j物资的能见度且 η j ( i ) ( t ) = 1 c j (i) (其中 c j ( i ) 为i蚂蚁在j节点的市场价格)，由于 c j ( i ) 的考虑要受到区域的限制，一般情况下在一个欠发达地 区， c j ( i ) 越小，则 η j ( i ) ( t ) 越大，而在一个经济较发达地区， 的影响程度要比欠发达地区显得迟钝一些，所以对于参数b在该地区稍小一点。 τ j ( t ) 表示t时刻j节点的信息量，具体计算公式为 τ j ( t + n ) = ( 1 − ρ ) τ j ( t ) + Δ τ ( t + n ) (1) 其中 Δ τ j ( t + n ) 表示对每只蚂蚁对c中的物资做完选择后 t + n 时刻j节点处的信息素的改变量。具体计算公式为 Δ τ j ( t ) = 1 / M ，   Δ τ j ( i ) ( t ) = l [ f ( S i ) − f ( S i / j ) ] (2) 其中 M = ∑ k = 1 n Δ τ j ( k ) ( t ) ，M表示边际效益之和， f ( · ) 为单调下模获利函数，r为挥发因子。 根据以上分析给出求解物资采购流行性预测问题的蚁群算法。 3.1.3. 求解物资采购流行性预测问题的蚁群算法步骤 Step1: 参数初始化，令时间 t = 0 ，设置最大循环次数 N c max ，将蚂蚁置于n个节点上，其中j节点的初始信息量由1.11节中的贪婪算法求得； Step2: 循环次数 N c = N c + 1 ； Step3: 蚂蚁的初始禁忌表索引号 k = 1 ； Step4: 蚂蚁数目 k = k + 1 ； Step5: 蚂蚁个体根据2.1.2中设定的状态转移概率公式计算概率选择元素 j ∈ c − t a b u ( i ) ，并进行禁忌表修改： 若 j ∈ { c − t a b u ( i ) }   and   p j ( i ) > p 0 ，则 { t a b u ( i ) } = { t a b u ( i ) } + j ； 若 j ∈ { c − t a b i ( i ) }   and   p j ( i ) < p 0 ，则 { c − t a b u ( i ) } = { c − t a b u ( i ) } + j 。 Step6: 若集合c中元素每个蚂蚁未遍历完则转入step4，否则跳到step7。 Step7: 根据公式(1) (2)更新每个节点上的信息量； Step8: 若 N c < N c max 转入step2，否则结束。 3.1.4. 蚁群算法具体程序设计 1) 流行元素的产生 D o   N c < n c max f o r   j = 1   t o   m   t a b u ( i ) = 0     f o r   i = 1   t o   n   i f   j ∈ { c − t a b u ( i ) }   a n d   p j ( i ) > p 0   t h e n                 { t a b u ( i ) } = { t a b u ( i ) } + j       i f   j ∉ S i   t h e n   S i = S i ∪ j         i f   j ∈ S i   t h e n   S i / j i f   j ∈ S i   t h e n   τ j ( i ) ( ( t 0 + j ) = ( 1 − ξ ) τ j ( i ) ( ( t 0 + i − 1 ) + Δ τ j ( i ) ( ( t 0 + i − 1 )                   e l s e     τ j ( i ) ( ( t 0 + j ) = τ j ( i ) ( ( t 0 + i − 1 ) − τ j ( i ) ( ( t 0 + i − 1 )     n e x t   i           τ j ( i ) ( ( t 0 + j ) = ( 1 − ρ ) ∑ i = 1 n τ j ( i ) ( ( t 0 + j ) + ρ Δ τ j ( i ) ( ( t 0 + j ) n e x t   j       N c = N c + 1 E n d     D o 2) 对流行元素的排序 f o r   j = 1   t o   m                       f o r   i = 1   t o   n                           i f   j ∈ S i   t h e n   P ( j ) = P ( j ) + 1                     n e x t   i                           p u t   o u t   P ( j )               n e x t   j 对于 P ( j ) ， j = 1 ， 2 ， ⋯ ， m 从大到小排序，设为 P 1 ， P 2 ， ⋯ ， P m 得最流行元素 P max = P 1 。前r个流行元素为 P 1 ， P 2 ， ⋯ ， P r 。