zoukankan      html  css  js  c++  java
  • 人工鱼群算法 AFSA

    寻优还可以,速度跟不上.. 国产的支持一把

      1 -- 人工鱼群算法 AFSA
      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 math.randomseed(os.time())
     14 
     15 -- ==============================求解函数==============================
     16 dim = 2                                 -- 解的维数
     17 
     18 domx = {                                -- 定义域
     19     { { -1, 2 }, { -1, 2 } },
     20     { {  2, 4 }, { -1, 1 } },
     21     { {  0, 4 }, {  0, 4 } },
     22 }
     23 
     24 maxfun = {                              -- 求解函数
     25     function(x) return 4 - (x[1] * sin( 4 * pi * x[1]) - x[2] * sin(4 * pi * x[2] + pi + 1)) end            ,
     26     function(x) return exp(x[1] - x[2] * x[2]) / (x[1] * x[1] - x[2]) + (x[1] - 3) ^ 2 end                  ,
     27     function(x) return 2 + (x[1] * x[1] + x[2] * x[2]) / 10 - (cos(2 * pi * x[1]) + cos(2 * pi * x[2])) end ,
     28 }
     29 
     30 funidx = 1
     31 -- ====================================================================
     32 
     33 -- ================================定义================================
     34 fishnum = 60                            -- 鱼群大小
     35 fishes = {}                             -- 鱼群
     36 visual = 0.1                            -- 可视范围
     37 delta = 0.05                            -- 拥挤因子
     38 step = 0.01                             -- 步长
     39 trynum = 50                             -- 尝试次数
     40 gbest = {}                              -- 全局最优
     41 neighbour = {}                          -- 邻居  中间变量
     42 itermax = 120                            -- 迭代次数
     43 -- ====================================================================
     44 
     45 
     46 -- ==============================工具函数==============================
     47 
     48 -- 求2范数 维数相关
     49 function norm(xi, xj)
     50     return sqrt((xi[1] - xj[1]) ^ 2 + (xi[2] - xj[2]) ^ 2)
     51 end
     52 
     53 -- 修正范围
     54 function fixx(x)
     55     dx = domx[funidx]
     56     for i = 1, dim do
     57         if x[i] < dx[i][1] then
     58             x[i] = dx[i][1]
     59         elseif x[i] > dx[i][2] then
     60             x[i] = dx[i][2]
     61         end
     62     end
     63 end
     64 
     65 -- 鱼群初始化
     66 function fishinit()
     67     -- 初始化
     68     for i = 1, fishnum do
     69         fishes[i] = { v = {} }
     70         for j = 1, dim do
     71             fishes[i][j] = domx[funidx][j][1] + (domx[funidx][j][2] - domx[funidx][j][1]) * random()
     72             fishes[i].v[j] = fishes[i][j]
     73         end
     74         fishes[i].y = maxfun[funidx](fishes[i])
     75         fishes[i].v.y = fishes[i].y
     76     end
     77 
     78     visual = domx[funidx][1][2] - domx[funidx][1][1]
     79     for j = 2, dim do
     80         dist = domx[funidx][j][2] - domx[funidx][j][1]
     81         if dist < visual then visual = dist end
     82     end
     83 
     84     visual = visual / 8
     85 end
     86 
     87 -- 觅食
     88 function fishfeed(idx)
     89     sign = 0
     90     tmppos = {}
     91     fish = {}
     92     for i = 1, trynum do
     93         for j = 1, dim do tmppos[j] = fishes[idx][j] + random() * step * visual end
     94         if fishes[idx].y < maxfun[funidx](tmppos) then
     95             sign = 1
     96             dist = norm(fishes[idx], tmppos)
     97             for j = 1, dim do fish[j] = fishes[idx][j] + random() * step * (tmppos[j] - fishes[idx][j]) / dist end
     98             break
     99         end
    100     end
    101 
    102     if sign == 0 then
    103         for j = 1, dim do fish[j] = fishes[idx][j] + random() * step end
    104     end
    105 
    106     return fish
    107 end
    108 
    109 -- 聚集
    110 function assemblefish(idx)
    111     nfish = 0
    112     center = {}
    113     neighbour = {}
    114     for j = 1, dim do center[j] = 0 end
    115     for i = 1, fishnum do
    116         if norm(fishes[i], fishes[idx]) < visual then
    117             if i ~= idx then table.insert(neighbour, i) end
    118             for j = 1, dim do center[j] = center[j] + fishes[i][j] end
    119             nfish = nfish + 1
    120         end
    121     end
    122 
    123     for j = 1, dim do center[j] = center[j] / nfish end
    124     center.y = maxfun[funidx](center)
    125 
    126     fish = {}
    127     if fishes[idx].y < center.y then
    128         dist = norm(fishes[idx], center)
    129         for j = 1, dim do fish[j] = fishes[idx][j] + random() * step * (center[j] - fishes[idx][j]) / dist end
    130         return fish
    131     end
    132         
    133     return fishfeed(idx)
    134 end
    135 
    136 -- 追尾
    137 function followfish(idx)
    138 
    139     if #neighbour == 0 then return fishfeed(idx) end
    140 
    141     idx1 = neighbour[1]
    142     for i = 2, #neighbour do
    143         if fishes[neighbour[i]].y > fishes[idx1].y then idx1 = neighbour[i] end
    144     end
    145     
    146     if fishes[idx1].y < fishes[idx].y then return fishfeed(idx) end
    147 
    148     fish = {}
    149     if fishes[idx1].y / #neighbour > delta * fishes[idx].y then
    150         dist = norm(fishes[idx], fishes[idx1])
    151         for j = 1, dim do fish[j] = fishes[idx][j] + random() * step * (fishes[idx1][j] - fishes[idx][j]) / dist end
    152         return fish
    153     end
    154 
    155     return fishfeed(idx)
    156 end
    157 
    158 -- ====================================================================
    159 
    160 
    161 
    162 -- ===============================主函数===============================
    163 function main(idx)
    164     -- 功能选择
    165     funidx = idx
    166     -- 系统初始化
    167     fishinit()
    168     
    169     -- 开始迭代
    170     for iter = 1, itermax do
    171         for i = 1, fishnum do
    172             next1 = assemblefish(i)
    173             fixx(next1)
    174             next1.y = maxfun[funidx](next1)
    175 
    176             next2 = followfish(i)
    177             fixx(next2)
    178             next2.y = maxfun[funidx](next2)
    179 
    180             if next2.y > next1.y then
    181                 next1, next2 = next2, next1
    182             end
    183 
    184             if next1.y > fishes[i].y then
    185                 for j = 1, dim do fishes[i][j] = next1[j] end
    186                 fishes[i].y = next1.y
    187                 if fishes[i].y > fishes[i].v.y then
    188                     for j = 1, dim do fishes[i].v[j] = fishes[i][j] end
    189                     fishes[i].v.y = fishes[i].y
    190                 end
    191             end
    192         end
    193     end
    194 
    195     maxy = 1
    196     for i = 2, fishnum do
    197         if fishes[i].y > fishes[maxy].y then maxy = i end
    198     end
    199 
    200     gbest = fishes[maxy]
    201 
    202 end
    203 
    204 -- ===============================主函数===============================
    205 
    206 t1 = os.clock()
    207 
    208 main(1)
    209 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", gbest.v.y, gbest.v[1], gbest.v[2]))
    210 main(2)
    211 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", gbest.v.y, gbest.v[1], gbest.v[2]))
    212 main(3)
    213 print(string.format("函数值为: %.8f \t解为: (%.3f, %.3f)", gbest.v.y, gbest.v[1], gbest.v[2]))
    214 
    215 t2 = os.clock()
    216 
    217 print("times: ", 1000 * (t2 - t1))
    218 --]]
  • 相关阅读:
    提取轮廓后的画图处理
    提取视频中的前景物体
    写入视频帧
    处理视频序列
    视频读写
    三维重建-相机标定
    图像拼接相关
    计算两幅图像之间的单应矩阵
    ransac算法(随机抽样一致性)
    图像间投影关系
  • 原文地址:https://www.cnblogs.com/javado/p/3092030.html
Copyright © 2011-2022 走看看