zoukankan      html  css  js  c++  java
  • 粒子群算法 PSO

    中规中矩, 没有ABC快

      1 -- 粒子群算法 PSO(全局,变权重)
      2 
      3 -- lua 相关简易操作
      4 sin = math.sin
      5 cos = math.cos
      6 sqrt = math.sqrt
      7 pi = math.pi
      8 random = math.random
      9 exp = math.exp
     10 int = math.floor
     11 
     12 
     13 -- 获得不同的随机序列
     14 math.randomseed(os.time())
     15 
     16 
     17 -- ==============================求解函数==============================
     18 dim = 2                                 -- 解的维数
     19 
     20 domx = {                                -- 定义域
     21     { { -1, 2 }, { -1, 2 } },
     22     { {  2, 4 }, { -1, 1 } },
     23     { {  0, 4 }, {  0, 4 } },
     24 }
     25 
     26 domv = {                                -- 速度限制
     27     { {-0.02, 0.02}, {-0.02, 0.02} },
     28     { {-0.01, 0.01}, {-0.01, 0.01} },
     29     { {-0.02, 0.02}, {-0.02, 0.02} },
     30 }
     31 
     32 maxfun = {                              -- 求解函数
     33     function(x) return 4 - (x[1] * sin( 4 * pi * x[1]) - x[2] * sin(4 * pi * x[2] + pi + 1)) end            ,
     34     function(x) return exp(x[1] - x[2] * x[2]) / (x[1] * x[1] - x[2]) + (x[1] - 3) ^ 2 end                  ,
     35     function(x) return 2 + (x[1] * x[1] + x[2] * x[2]) / 10 - (cos(2 * pi * x[1]) + cos(2 * pi * x[2])) end ,
     36 }
     37 funidx = 0
     38 -- ====================================================================
     39 
     40 -- ================================定义================================
     41 psonum = 80                             -- 粒子种群大小
     42 particles = {}                          -- 粒子群
     43 c1 = 2                                  -- 学习因子(传统知识)
     44 c2 = 2                                  -- 学习因子(社会知识)
     45 domw = {0.9, 0.4}                       -- 惯性权重(可变)
     46 w = 0.9                                 -- 惯性表征
     47 r = 1                                   -- 约束因子
     48 gbest = 0                               -- 全局最优
     49 itermax = 100                           -- 迭代次数
     50 -- ====================================================================
     51 
     52 
     53 -- ==============================工具函数==============================
     54 -- 评价函数
     55 function getfitness(y) return y end
     56 
     57 -- 粒子群初始化
     58 function psoinit()
     59     -- 初始化粒子群,及每个粒子的历史最优
     60     for i = 1, psonum do
     61         particles[i] = { v = {}, pbest = {} }
     62         for j = 1, dim do
     63             particles[i][j] = domx[funidx][j][1] + (domx[funidx][j][2] - domx[funidx][j][1]) * random()
     64             particles[i].v[j] = domv[funidx][j][1] + (domv[funidx][j][2] - domv[funidx][j][1]) * random()
     65         end
     66         particles[i].y = maxfun[funidx](particles[i])
     67         tmpfitness = getfitness(particles[i].y)
     68 
     69         for j = 1, dim do
     70             particles[i].pbest[j] = particles[i][j]
     71         end
     72         particles[i].ybest = particles[i].y
     73         particles[i].fbest = tmpfitness
     74     end
     75 
     76     -- 更新全局最优
     77     gbest = 1
     78     for i = 2, psonum do
     79         if particles[i].fbest > particles[gbest].fbest then gbest = i end
     80     end
     81 
     82     -- 设置惯性因子初值
     83     w = domw[1]
     84 end
     85 
     86 -- 移动粒子
     87 function psomove(idx)
     88     for i = 1, dim do
     89         -- 计算新的速度
     90         particles[idx].v[i] = w * particles[idx].v[i] + 
     91             c1 * random() * (particles[idx].pbest[i] - particles[idx][i]) +
     92             c2 * random() * (particles[gbest].pbest[i] - particles[idx][i])
     93         if particles[idx].v[i] < domv[funidx][i][1] then
     94             particles[idx].v[i] = domv[funidx][i][1]
     95         elseif particles[idx].v[i] > domv[funidx][i][2] then
     96             particles[idx].v[i] = domv[funidx][i][2]
     97         end
     98         
     99         -- 移动粒子
    100         particles[idx][i] = particles[idx][i] + r * particles[idx].v[i]
    101         if particles[idx][i] < domx[funidx][i][1] then
    102             particles[idx][i] = domx[funidx][i][1]
    103         elseif particles[idx][i] > domx[funidx][i][2] then
    104             particles[idx][i] = domx[funidx][i][2]
    105         end
    106     end
    107     
    108     
    109     particles[idx].y = maxfun[funidx](particles[idx])
    110     tmpfitness = getfitness(particles[idx].y)
    111 
    112     -- 更新历史最优
    113     if tmpfitness > particles[idx].fbest then
    114         for i = 1, dim do particles[idx].pbest[i] = particles[idx][i] end
    115         particles[idx].ybest = particles[idx].y
    116         particles[idx].fbest = tmpfitness
    117         -- 更新全局最优
    118         if tmpfitness > particles[gbest].fbest then gbest = idx end
    119     end
    120 end
    121 
    122 -- ====================================================================
    123 
    124 
    125 -- ===============================主函数===============================
    126 function main(idx)
    127     -- 功能选择
    128     funidx = idx
    129     -- 系统初始化
    130     psoinit()
    131     -- 惯性因子
    132     deltaw = (domw[2] - domw[1]) / itermax
    133     
    134     -- 开始迭代
    135     for iter = 1, itermax do
    136         -- 计算当前惯性因子
    137         w = w + deltaw
    138         -- 更新所有粒子位置
    139         for i = 1, psonum do psomove(i) end
    140     end
    141 end
    142 
    143 -- ===============================主函数===============================
    144 
    145 t1 = os.clock()
    146 
    147 main(1)
    148 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", particles[gbest].y, particles[gbest].pbest[1], particles[gbest].pbest[2]))
    149 main(2)
    150 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", particles[gbest].y, particles[gbest].pbest[1], particles[gbest].pbest[2]))
    151 main(3)
    152 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", particles[gbest].y, particles[gbest].pbest[1], particles[gbest].pbest[2]))
    153 
    154 t2 = os.clock()
    155 
    156 print("times: ", 1000 * (t2 - t1))
  • 相关阅读:
    【[SDOI2014]旅行】
    【[USACO16OPEN]262144】
    【[SDOi2012]Longge的问题】
    【[POI2000]病毒】
    【不同子串个数】
    【工艺】
    Lambda使用深入解析
    Lambda表达式语法进一步巩固
    给之前绘制的图形菜单增加随触摸360度旋转效果
    给之前绘制的饼状图增加点击扩大突出效果
  • 原文地址:https://www.cnblogs.com/javado/p/3089373.html
Copyright © 2011-2022 走看看