精华内容
下载资源
问答
  • 针对传统考试耗时耗力等缺点, 提出基于解离散优化问题蚁群算法思想的智能考试系统模型。该模型从智能考试系统的需求出发对蚁群算法的信息素初始值的设定进行了探讨并改进了更新规则, 将考试结果反馈给系统, 从而不仅...
  • 蚁群算法 实现思想

    2011-12-17 14:17:38
    蚁群算法的基本思想
  • 蚁群算法

    万次阅读 多人点赞 2018-07-20 09:57:00
    1.1蚁群算法的基本思想 1.2蚁群算法的数学模型 1.3蚁群算法流程 2.蚁群算法的MATLAB实现 2.1算法设步骤 2.2程序代码 3.算法关键参数的设定 1.参数设定的准则 2.蚂蚁数量 3.信息素因子 4.启发函数因子 5....

    所有博文已迁移至个人网站:https://www.ravenxrz.ink,请勿再留言评论

    新链接:https://www.ravenxrz.ink/archives/3b36af0a.html

    1.蚁群算法原理

    1.1蚁群算法的基本思想

    蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物–信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响他们以后的行为。当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大,所以蚂蚁选择选该路径的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称为蚂蚁的自催化行为。由于其原理是一种正反馈机制,因此,也可将蚂蚁王国理解为所谓的增强型学习系统。

    1.2蚁群算法的数学模型

    这个利用TSP问题来说明这个数学模型,对于TSP问题,设蚂蚁群体中蚂蚁的数量为m,城市的数量为n,城市i与城市j之间的距离为dij,t时刻城市i与城市j连接路径上的信息素浓度为cij(t)。初始时刻,蚂蚁被放置在不同的城市里,且各城市键连接路径上的信息素浓度相同。然后蚂蚁将按一定概率选择线路,不放设pKij(t)为t时刻蚂蚁k从城市i转移到城市j的概率。“蚂蚁TSP”策略收到两方面的左右,首先是访问某城市的期望,领完便是其他蚂蚁释放的信息素浓度。所以已定义:

    pijk(t)=[cij(t)]a[nij(t)]bsum([cij(t)]a[nij(t)b]),jallowk0,jallowk p^k_{ij}(t) =\frac{[c_{ij}(t)]^a*[n_{ij}(t)]^b}{sum([c_{ij}(t)]^a*[n_{ij}(t)^b]} ),j∈allowk \\ 0,j∉allowk

    • nij(t)n_{ij}(t)为启发函数,表示蚂蚁从城市i转移到城市j的期望;

    • allowkallowk为蚂蚁kk带访问城市集合,开始时,allowkallowk中有n1n-1个元素,即包括除了蚂蚁kk出发城市的其他多个城市,随着时间的推移,allowkallowk中的元素越来越少,直至为空;

    • aa 为信息素重要程度因子

    • bb为启发函数因子
      在蚂蚁遍历各城市的过程中,与实际情况相似的是,在蚂蚁释放信息素的同事,各个城市之间连接路径上的信息素的强度也在通过挥发等方式逐渐消失。为了描述这个特征,设ρ表示信息素挥发程度。这样所有蚂蚁完成走完一遍所有城市之后,各个城市键连接路径上的信息素浓度为
      cij(t+1)=1ρcij(t)+ΔcijΔcij=Δcijk c_{ij}(t+1) = (1-ρ)*c_{ij}(t)+\Delta c_{ij} \\ \Delta c_{ij} = \sum{}{} \Delta c_{ij}^k

    • Δcijk\Delta c_{ij}^k为第k只蚂蚁在城市i与城市k连接路径上释放信息素而增加的信息素浓度

    • Δcij\Delta c_{ij} 为所有蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度。
      一般情况下
      Δcijk=QLk,ki访j0, \Delta cijk = \frac{Q}{L_k} , 若蚂蚁k从城市i访问了城市j \\ 0 ,否则

    • $Q $为信息素常数

    • LkL_k 为第k只蚂蚁经过路径总长度

    1.3蚁群算法流程

    蚁群算法流程.png

    2.蚁群算法的MATLAB实现

    2.1算法设步骤

    1.数据准备
    2.计算城市距离矩阵
    3.初始化参数
    4.迭代寻找最佳路径
    5.结果显示

    2.2程序代码

    程序中使用到的文件"Chap9_citys_data.xlsx"链接如下:
    链接:https://pan.baidu.com/s/1MStyADIrhFtDHoVJUuTjzg
    提取码:t24f

    %--------------------------------------------------------------------------
    %% 数据准备
    % 清空环境变量
    clear all
    clc
    
    % 程序运行计时开始
    t0 = clock;
    %导入数据
    citys=xlsread('Chap9_citys_data.xlsx', 'B2:C53');
    %--------------------------------------------------------------------------
    %% 计算城市间相互距离
    n = size(citys,1);
    D = zeros(n,n);
    for i = 1:n
        for j = 1:n
            if i ~= j
                D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
            else
                D(i,j) = 1e-4;      %设定的对角矩阵修正值
            end
        end    
    end
    %--------------------------------------------------------------------------
    %% 初始化参数
    m = 75;                              % 蚂蚁数量
    alpha = 1;                           % 信息素重要程度因子
    beta = 5;                            % 启发函数重要程度因子
    vol = 0.2;                           % 信息素挥发(volatilization)因子
    Q = 10;                               % 常系数
    Heu_F = 1./D;                        % 启发函数(heuristic function)
    Tau = ones(n,n);                     % 信息素矩阵
    Table = zeros(m,n);                  % 路径记录表
    iter = 1;                            % 迭代次数初值
    iter_max = 100;                      % 最大迭代次数 
    Route_best = zeros(iter_max,n);      % 各代最佳路径       
    Length_best = zeros(iter_max,1);     % 各代最佳路径的长度  
    Length_ave = zeros(iter_max,1);      % 各代路径的平均长度  
    Limit_iter = 0;                      % 程序收敛时迭代次数
    %-------------------------------------------------------------------------
    %% 迭代寻找最佳路径
    while iter <= iter_max
        % 随机产生各个蚂蚁的起点城市
          start = zeros(m,1);
          for i = 1:m
              temp = randperm(n);
              start(i) = temp(1);
          end
          Table(:,1) = start; 
          % 构建解空间
          citys_index = 1:n;
          % 逐个蚂蚁路径选择
          for i = 1:m
              % 逐个城市路径选择
             for j = 2:n
                 has_visited = Table(i,1:(j - 1));           % 已访问的城市集合(禁忌表)
                 allow_index = ~ismember(citys_index,has_visited);    % 参加说明1(程序底部)
                 allow = citys_index(allow_index);  % 待访问的城市集合
                 P = allow;
                 % 计算城市间转移概率
                 for k = 1:length(allow)
                     P(k) = Tau(has_visited(end),allow(k))^alpha * Heu_F(has_visited(end),allow(k))^beta;
                 end
                 P = P/sum(P);
                 % 轮盘赌法选择下一个访问城市
                Pc = cumsum(P);     %参加说明2(程序底部)
                target_index = find(Pc >= rand);
                target = allow(target_index(1));
                Table(i,j) = target;
             end
          end
          % 计算各个蚂蚁的路径距离
          Length = zeros(m,1);
          for i = 1:m
              Route = Table(i,:);
              for j = 1:(n - 1)
                  Length(i) = Length(i) + D(Route(j),Route(j + 1));
              end
              Length(i) = Length(i) + D(Route(n),Route(1));
          end
          % 计算最短路径距离及平均距离
          if iter == 1
              [min_Length,min_index] = min(Length);
              Length_best(iter) = min_Length;  
              Length_ave(iter) = mean(Length);
              Route_best(iter,:) = Table(min_index,:);
              Limit_iter = 1; 
              
          else
              [min_Length,min_index] = min(Length);
              Length_best(iter) = min(Length_best(iter - 1),min_Length);
              Length_ave(iter) = mean(Length);
              if Length_best(iter) == min_Length
                  Route_best(iter,:) = Table(min_index,:);
                  Limit_iter = iter; 
              else
                  Route_best(iter,:) = Route_best((iter-1),:);
              end
          end
          % 更新信息素
          Delta_Tau = zeros(n,n);
          % 逐个蚂蚁计算
          for i = 1:m
              % 逐个城市计算
              for j = 1:(n - 1)
                  Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);
              end
              Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);
          end
          Tau = (1-vol) * Tau + Delta_Tau;
        % 迭代次数加1,清空路径记录表
        iter = iter + 1;
        Table = zeros(m,n);
    end
    %--------------------------------------------------------------------------
    %% 结果显示
    [Shortest_Length,index] = min(Length_best);
    Shortest_Route = Route_best(index,:);
    Time_Cost=etime(clock,t0);
    disp(['最短距离:' num2str(Shortest_Length)]);
    disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);
    disp(['收敛迭代次数:' num2str(Limit_iter)]);
    disp(['程序执行时间:' num2str(Time_Cost) '秒']);
    %--------------------------------------------------------------------------
    %% 绘图
    figure(1)
    plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...  %三点省略符为Matlab续行符
         [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');
    grid on
    for i = 1:size(citys,1)
        text(citys(i,1),citys(i,2),['   ' num2str(i)]);
    end
    text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'       起点');
    text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'       终点');
    xlabel('城市位置横坐标')
    ylabel('城市位置纵坐标')
    title(['ACA最优化路径(最短距离:' num2str(Shortest_Length) ')'])
    figure(2)
    plot(1:iter_max,Length_best,'b')
    legend('最短距离')
    xlabel('迭代次数')
    ylabel('距离')
    title('算法收敛轨迹')
    %--------------------------------------------------------------------------
    %% 程序解释或说明
    % 1. ismember函数判断一个变量中的元素是否在另一个变量中出现,返回0-1矩阵;
    % 2. cumsum函数用于求变量中累加元素的和,如A=[1, 2, 3, 4, 5], 那么cumsum(A)=[1, 3, 6, 10, 15]。
    

    程序结果:

    image.png

    image.png

    3.算法关键参数的设定

    1.参数设定的准则

    1. 尽可能在全局上搜索最优解,保证解得最有型
    2. 算法尽快手链,以节省寻优时间
    3. 尽量反映客观存在的规律,以保证这种仿生算法的真实性

    2.蚂蚁数量

    一般设置蚂蚁数量为城市数的1.5倍比较稳妥

    3.信息素因子

    信息素因素a反映蚂蚁在运动过程中所积累的信息量在知道蚁群搜索中的相对重要程度。当a∈[1,4]时,综合求解性能较好

    4.启发函数因子

    启发函数因子b,反映了启发式信息在知道蚁群搜索过程中的相对重要程度,其大小反映了蚁群巡游过程中小言行、确定性因素的作用强度。b过大是,蚂蚁在某个局部点上选择局优的可能性大。b∈[3,4.5],综合求解性能较好。

    5.信息素挥发因子

    信息素挥发因子ρ描述信息素的消失水平,而1-ρ则为信息素残留因子。ρ∈[0.2,0.5]时,综合求解能力较好

    6. 最大迭代次数

    一般去100-500

    7. 组合参数设计策略

    可按照一下策略来进行参数的组合设计:

    1. 确定蚂蚁数目,蚂蚁数目与城市规模之比约为1。5
    2. 参数粗调,即调整取值范围较大的a,b以及Q
    3. 参数微调,即调整取值范围较小的ρ

    4.总结

    蚁群算法有一下特点:

    1. 从算法的性质而言,蚁群算法是在寻找一个比较好的局部最优解,而不是强调全局最优解
    2. 开始时算法收敛速度较快,在随后寻优过程中,迭代一定次数后,容易出现停滞现象
    3. 蚁群算法对TSP及相似问题具有良好的适应性,无论城市规模大还是小,都能进行有效地求解,而且求解速度相对较快
    4. 蚁群算法解得稳定性较差,及时参数不变,每次执行程序都有可能得到不同界,为此需要多执行几次,已寻找最佳解。
    5. 蚁群算法中有多个需要设定的参数,而且这些参数对程序又都有一定的影响,所以选择合适的参数组合在算法设计过程中也非常重要。
    展开全文
  • 点击上方“计算机视觉cv”即可“进入公众号”重磅干货第一时间送达蚁群算法基本思想蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有...

    点击上方“计算机视觉cv”即可“进入公众号”

    重磅干货第一时间送达

    蚁群算法基本思想

    蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。蚂蚁是如何做到这一点的呢?

    原来,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物一信息激素一也可称之为信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响它们以后的行为。当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大(当然,随时间的推移会逐渐减弱),所以蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称之为蚂蚁的自催化行为。由于其原理是一种正反馈机制.因此,也可将蚂蚁王国理解为所谓的增强型学习系统。

    在自然界中,蚁群的这种寻找路径的过程表现为一种正反馈过程,“蚁群算法”就是模仿生物学蚂蚁群觅食寻找最优路径原理衍生出来的。

    蚁群算法数学模型

    应该说前面介绍的蚁群算法只是一种算法思想,要是想真正应用该算法,还需要针对一个特定问题, 建立相应的数学模型。现仍以经典的TSP问题为例,来进一步阐述如何基于蚁群算法来求解实际问题。

    对于TSP问题,为不失一般性,设整个蚂蚁群体中蚂蚁的数量为m,城市的数量为n,城市i与城市j之间的距离为 (i,j=1,2,…,n),t时刻城市i与城市j连接路径上的信息素浓度为(t)。初始时刻,蚂蚁被放置在不同的城市里,且各城市间连接路径上的信息素浓度相同,不妨设(0)=(0)。然后蚂蚁将按一定概率选择线路,不妨设为t时刻蚂蚁k从城市i转移到城市j的概率。我们知道,“蚂蚁TSP”策略会受到两方面的左右,首先是访问某城市的期望,另外便是其他蚂蚁释放的信息素浓度,所以定义:

    e55aeba88f1404459703d440829cee8b.png

    其中, 为启发函数,表示蚂蚁从城市i转移到城市j的期望程度:(k=1, 2, …, m)为蚂蚁k待访问城市集合,开始时,中有n一1个元素,即包括除了蚂蚁k出发城市的其他多有城市, 随着时间的推移,中的元素越来越少,直至为空;a为信息素重要程度因子,简称信息度因子。其值越大,表示信息影响强度越大;为启发函数重要程度因子,简称启发函数因子,其值越大,表明启发函数影响越大。

    在蚂蚁遍历城市的过程中,与实际情况相似的是,在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素的强度也在通过挥发等方式逐渐消失。为了描述这一特征,不妨令p(0

    7aa52bd298a6fe0cf3249191c1ff71ed.png

    其中,为第k只蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度;为所有蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度。

    一般的值可由ant cycle system模型进行计算:

    0ed21a5d5bd476c081b320150ff9ab4e.png

    其中,Q为信息素常数,表示蚂蚁循环一次所释放的信息素总量;为第k只蚂蚁经过路径的总长度。

    蚁群算法流程

    用蚁群算法求解TSP问题的算法流程如下图所示,具体每步的含义如下:

    • 步骤1:对相关参数进行初始化,包括蚁初始化群规模、信息素因子、启发函数因子、信息素、挥发因子、信息素常数、最大迭代次数等,以及将数据读人程序,并对数据进行基本的处理,如将城市的坐标位置,转为城市间的矩阵。
    • 步骤2:随机将蚂蚁放于不同的出发点,对每个蚂蚁计算其下一个访问城市,直至所更新信息素表有蚂蚁访问完所有城市。
    • 步骤3:计算各个蚂蚁经过的路径长度,记录当前迭代次数中的最优解,同时对各个城市连接路径上的信息素浓度进行更新。
    • 步骤4:判断是否达到最大迭代次数,若否,则返回步骤2,否则终止程序。
    • 步骤5:输出程序结果,并根据需要输出程序寻优过程中的相关指标,如运行时间、收敛迭代次数等。8ce9b097057e91701b17ebbfa77c5cea.png

    python简单实现

    import numpy as npimport matplotlib.pyplot as plt# 建立“蚂蚁”类class Ant(object):    def __init__(self, path):        self.path = path                       # 蚂蚁当前迭代整体路径        self.length = self.calc_length(path)   # 蚂蚁当前迭代整体路径长度    def calc_length(self, path_):              # path=[A, B, C, D, A]注意路径闭环        length_ = 0        for i in range(len(path_)-1):            delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)            length_ += np.linalg.norm(delta)        return length_    @staticmethod    def calc_len(A, B):                        # 静态方法,计算城市A与城市B之间的距离        return np.linalg.norm((A.x - B.x, A.y - B.y))# 建立“城市”类class City(object):    def __init__(self, x, y):        self.x = x        self.y = y# 建立“路径”类class Path(object):    def __init__(self, A):                     # A为起始城市        self.path = [A, A]    def add_path(self, B):                     # 追加路径信息,方便计算整体路径长度        self.path.append(B)        self.path[-1], self.path[-2] = self.path[-2], self.path[-1]# 构建“蚁群算法”的主体class ACO(object):    def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):        self.ants_num = ant_num   # 蚂蚁个数        self.maxIter = maxIter    # 蚁群最大迭代次数        self.alpha = alpha        # 信息启发式因子        self.beta = beta          # 期望启发式因子        self.rho = rho            # 信息素挥发速度        self.Q = Q                # 信息素强度        ###########################        self.deal_data('coordinates.dat')                         # 提取所有城市的坐标信息        ###########################        self.path_seed = np.zeros(self.ants_num).astype(int)      # 记录一次迭代过程中每个蚂蚁的初始城市下标        self.ants_info = np.zeros((self.maxIter, self.ants_num))  # 记录每次迭代后所有蚂蚁的路径长度信息        self.best_path = np.zeros(self.maxIter)                   # 记录每次迭代后整个蚁群的“历史”最短路径长度        ###########################        self.solve()              # 完成算法的迭代更新        self.display()            # 数据可视化展示    def deal_data(self, filename):        with open(filename, 'rt') as f:            temp_list = list(line.split() for line in f)                                   # 临时存储提取出来的坐标信息        self.cities_num = len(temp_list)                                                   # 1. 获取城市个数        self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list)     # 2. 构建城市列表        self.city_dist_mat = np.zeros((self.cities_num, self.cities_num))                  # 3. 构建城市距离矩阵        for i in range(self.cities_num):            A = self.cities[i]            for j in range(i, self.cities_num):                B = self.cities[j]                self.city_dist_mat[i][j] = self.city_dist_mat[j][i] = Ant.calc_len(A, B)        self.phero_mat = np.ones((self.cities_num, self.cities_num))                       # 4. 初始化信息素矩阵        # self.phero_upper_bound = self.phero_mat.max() * 1.2                              ###信息素浓度上限        self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num))          # 5. 初始化启发函数矩阵    def solve(self):        iterNum = 0                                                            # 当前迭代次数        while iterNum < self.maxIter:            self.random_seed()                                                 # 使整个蚁群产生随机的起始点            delta_phero_mat = np.zeros((self.cities_num, self.cities_num))     # 初始化每次迭代后信息素矩阵的增量            ##########################################################################            for i in range(self.ants_num):                city_index1 = self.path_seed[i]                                # 每只蚂蚁访问的第一个城市下标                ant_path = Path(self.cities[city_index1])                      # 记录每只蚂蚁访问过的城市                tabu = [city_index1]                                           # 记录每只蚂蚁访问过的城市下标,禁忌城市下标列表                non_tabu = list(set(range(self.cities_num)) - set(tabu))                for j in range(self.cities_num-1):                             # 对余下的城市进行访问                    up_proba = np.zeros(self.cities_num-len(tabu))             # 初始化状态迁移概率的分子                    for k in range(self.cities_num-len(tabu)):                        up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) * \                        np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)                    proba = up_proba/sum(up_proba)                             # 每条可能子路径上的状态迁移概率                    while True:                                                # 提取出下一个城市的下标                        random_num = np.random.rand()                        index_need = np.where(proba > random_num)[0]                        if len(index_need) > 0:                            city_index2 = non_tabu[index_need[0]]                            break                    ant_path.add_path(self.cities[city_index2])                    tabu.append(city_index2)                    non_tabu = list(set(range(self.cities_num)) - set(tabu))                    city_index1 = city_index2                self.ants_info[iterNum][i] = Ant(ant_path.path).length                if iterNum == 0 and i == 0:                                    # 完成对最佳路径城市的记录                    self.best_cities = ant_path.path                else:                    if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities = ant_path.path                tabu.append(tabu[0])                                           # 每次迭代完成后,使禁忌城市下标列表形成完整闭环                for l in range(self.cities_num):                    delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]            self.best_path[iterNum] = Ant(self.best_cities).length            self.update_phero_mat(delta_phero_mat)                             # 更新信息素矩阵            iterNum += 1    def update_phero_mat(self, delta):        self.phero_mat = (1 - self.rho) * self.phero_mat + delta        # self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判断是否超过浓度上限    def random_seed(self):                                                     # 产生随机的起始点下表,尽量保证所有蚂蚁的起始点不同        if self.ants_num <= self.cities_num:                                   # 蚂蚁数 <= 城市数            self.path_seed[:] = np.random.permutation(range(self.cities_num))[:self.ants_num]        else:                                                                  # 蚂蚁数 > 城市数            self.path_seed[:self.cities_num] = np.random.permutation(range(self.cities_num))            temp_index = self.cities_num            while temp_index + self.cities_num <= self.ants_num:                self.path_seed[temp_index:temp_index + self.cities_num] = np.random.permutation(range(self.cities_num))                temp_index += self.cities_num            temp_left = self.ants_num % self.cities_num            if temp_left != 0:                self.path_seed[temp_index:] = np.random.permutation(range(self.cities_num))[:temp_left]    def display(self):                                                         # 数据可视化展示        plt.figure(figsize=(6, 10))        plt.subplot(211)        plt.plot(self.ants_info, 'g.')        plt.plot(self.best_path, 'r-', label='history_best')        plt.xlabel('Iteration')        plt.ylabel('length')        plt.legend()        plt.subplot(212)        plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')        plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')        plt.xlabel('x')        plt.ylabel('y')        plt.savefig('ACO.png', dpi=500)        plt.show()        plt.close()ACO()

    输出:

    833fcbc0734d8c793cad7febe480f265.png64546ab2837f049c4e36bb34c5cebe3a.png

    参考文献

    [1]https://www.cnblogs.com/xxhbdk/p/9177423.html 

    [2]《matlab在数学建模中的应用》

    ee09fce29134be92d94595ff5eded8ac.png

    319d3a92391218753536ccf19f92fc0a.png

    展开全文
  • 蚁群算法基本思想蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生...

    蚁群算法基本思想

    蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。蚂蚁是如何做到这一点的呢?

    原来,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物一信息激素一也可称之为信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响它们以后的行为。当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大(当然,随时间的推移会逐渐减弱),所以蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称之为蚂蚁的自催化行为。由于其原理是一种正反馈机制.因此,也可将蚂蚁王国理解为所谓的增强型学习系统。

    在自然界中,蚁群的这种寻找路径的过程表现为一种正反馈过程,“蚁群算法”就是模仿生物学蚂蚁群觅食寻找最优路径原理衍生出来的。

    蚁群算法数学模型

    应该说前面介绍的蚁群算法只是一种算法思想,要是想真正应用该算法,还需要针对一个特定问题, 建立相应的数学模型。现仍以经典的TSP问题为例,来进一步阐述如何基于蚁群算法来求解实际问题。

    对于TSP问题,为不失一般性,设整个蚂蚁群体中蚂蚁的数量为m,城市的数量为n,城市i与城市j之间的距离为

    (i,j=1,2,…,n),t时刻城市i与城市j连接路径上的信息素浓度为
    (t)。初始时刻,蚂蚁被放置在不同的城市里,且各城市间连接路径上的信息素浓度相同,不妨设
    (0)=
    (0)。然后蚂蚁将按一定概率选择线路,不妨设
    为t时刻蚂蚁k从城市i转移到城市j的概率。我们知道,“蚂蚁TSP”策略会受到两方面的左右,首先是访问某城市的期望,另外便是其他蚂蚁释放的信息素浓度,所以定义:

    e53399d36b1e97b8d113ed156bada847.png

    其中,

    为启发函数,表示蚂蚁从城市i转移到城市j的期望程度:
    (k=1, 2, …, m)为蚂蚁k待访问城市集合,开始时,
    中有n一1个元素,即包括除了蚂蚁k出发城市的其他多有城市, 随着时间的推移,
    中的元素越来越少,直至为空;a为信息素重要程度因子,简称信息度因子。其值越大,表示信息影响强度越大;
    为启发函数重要程度因子,简称启发函数因子,其值越大,表明启发函数影响越大。

    在蚂蚁遍历城市的过程中,与实际情况相似的是,在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素的强度也在通过挥发等方式逐渐消失。为了描述这一特征,不妨令p(0<p<1)表示信息素的挥发程度。这样,当所有蚂蚁完整走完一遍所有城市之后,各个城市间连接路径上的信息浓度为:

    3a6d2e074f873781de76acfc409f38b3.png

    其中,

    为第k只蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度;
    为所有蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度。

    一般

    的值可由ant cycle system模型进行计算:

    e00d495bb6c74c1285ad64e5261b7da5.png

    其中,Q为信息素常数,表示蚂蚁循环一次所释放的信息素总量;

    为第k只蚂蚁经过路径的总长度。

    蚁群算法流程

    用蚁群算法求解TSP问题的算法流程如下图所示,具体每步的含义如下:

    • 步骤1:对相关参数进行初始化,包括蚁初始化群规模、信息素因子、启发函数因子、信息素、挥发因子、信息素常数、最大迭代次数等,以及将数据读人程序,并对数据进行基本的处理,如将城市的坐标位置,转为城市间的矩阵。
    • 步骤2:随机将蚂蚁放于不同的出发点,对每个蚂蚁计算其下一个访问城市,直至所更新信息素表有蚂蚁访问完所有城市。
    • 步骤3:计算各个蚂蚁经过的路径长度
      ,记录当前迭代次数中的最优解,同时对各个城市连接路径上的信息素浓度进行更新。
    • 步骤4:判断是否达到最大迭代次数,若否,则返回步骤2,否则终止程序。
    • 步骤5:输出程序结果,并根据需要输出程序寻优过程中的相关指标,如运行时间、收敛迭代次数等。

    2e911d75b293987df3919ea3e43e0b1f.png

    python简单实现

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # 建立“蚂蚁”类
    class Ant(object):
        def __init__(self, path):
            self.path = path                       # 蚂蚁当前迭代整体路径
            self.length = self.calc_length(path)   # 蚂蚁当前迭代整体路径长度
    
        def calc_length(self, path_):              # path=[A, B, C, D, A]注意路径闭环
            length_ = 0
            for i in range(len(path_)-1):
                delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)
                length_ += np.linalg.norm(delta)
            return length_
    
        @staticmethod
        def calc_len(A, B):                        # 静态方法,计算城市A与城市B之间的距离
            return np.linalg.norm((A.x - B.x, A.y - B.y))
    
    
    # 建立“城市”类
    class City(object):
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
    
    # 建立“路径”类
    class Path(object):
        def __init__(self, A):                     # A为起始城市
            self.path = [A, A]
    
        def add_path(self, B):                     # 追加路径信息,方便计算整体路径长度
            self.path.append(B)
            self.path[-1], self.path[-2] = self.path[-2], self.path[-1]
    
    
    # 构建“蚁群算法”的主体
    class ACO(object):
        def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):
            self.ants_num = ant_num   # 蚂蚁个数
            self.maxIter = maxIter    # 蚁群最大迭代次数
            self.alpha = alpha        # 信息启发式因子
            self.beta = beta          # 期望启发式因子
            self.rho = rho            # 信息素挥发速度
            self.Q = Q                # 信息素强度
            ###########################
            self.deal_data('coordinates.dat')                         # 提取所有城市的坐标信息
            ###########################
            self.path_seed = np.zeros(self.ants_num).astype(int)      # 记录一次迭代过程中每个蚂蚁的初始城市下标
            self.ants_info = np.zeros((self.maxIter, self.ants_num))  # 记录每次迭代后所有蚂蚁的路径长度信息
            self.best_path = np.zeros(self.maxIter)                   # 记录每次迭代后整个蚁群的“历史”最短路径长度
            ###########################
            self.solve()              # 完成算法的迭代更新
            self.display()            # 数据可视化展示
    
        def deal_data(self, filename):
            with open(filename, 'rt') as f:
                temp_list = list(line.split() for line in f)                                   # 临时存储提取出来的坐标信息
            self.cities_num = len(temp_list)                                                   # 1. 获取城市个数
            self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list)     # 2. 构建城市列表
            self.city_dist_mat = np.zeros((self.cities_num, self.cities_num))                  # 3. 构建城市距离矩阵
            for i in range(self.cities_num):
                A = self.cities[i]
                for j in range(i, self.cities_num):
                    B = self.cities[j]
                    self.city_dist_mat[i][j] = self.city_dist_mat[j][i] = Ant.calc_len(A, B)
            self.phero_mat = np.ones((self.cities_num, self.cities_num))                       # 4. 初始化信息素矩阵
            # self.phero_upper_bound = self.phero_mat.max() * 1.2                              ###信息素浓度上限
            self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num))          # 5. 初始化启发函数矩阵
    
        def solve(self):
            iterNum = 0                                                            # 当前迭代次数
            while iterNum < self.maxIter:
                self.random_seed()                                                 # 使整个蚁群产生随机的起始点
                delta_phero_mat = np.zeros((self.cities_num, self.cities_num))     # 初始化每次迭代后信息素矩阵的增量
                ##########################################################################
                for i in range(self.ants_num):
                    city_index1 = self.path_seed[i]                                # 每只蚂蚁访问的第一个城市下标
                    ant_path = Path(self.cities[city_index1])                      # 记录每只蚂蚁访问过的城市
                    tabu = [city_index1]                                           # 记录每只蚂蚁访问过的城市下标,禁忌城市下标列表
                    non_tabu = list(set(range(self.cities_num)) - set(tabu))
                    for j in range(self.cities_num-1):                             # 对余下的城市进行访问
                        up_proba = np.zeros(self.cities_num-len(tabu))             # 初始化状态迁移概率的分子
                        for k in range(self.cities_num-len(tabu)):
                            up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) * 
                            np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)
                        proba = up_proba/sum(up_proba)                             # 每条可能子路径上的状态迁移概率
                        while True:                                                # 提取出下一个城市的下标
                            random_num = np.random.rand()
                            index_need = np.where(proba > random_num)[0]
                            if len(index_need) > 0:
                                city_index2 = non_tabu[index_need[0]]
                                break
                        ant_path.add_path(self.cities[city_index2])
                        tabu.append(city_index2)
                        non_tabu = list(set(range(self.cities_num)) - set(tabu))
                        city_index1 = city_index2
                    self.ants_info[iterNum][i] = Ant(ant_path.path).length
                    if iterNum == 0 and i == 0:                                    # 完成对最佳路径城市的记录
                        self.best_cities = ant_path.path
                    else:
                        if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities = ant_path.path
                    tabu.append(tabu[0])                                           # 每次迭代完成后,使禁忌城市下标列表形成完整闭环
                    for l in range(self.cities_num):
                        delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]
    
                self.best_path[iterNum] = Ant(self.best_cities).length
    
                self.update_phero_mat(delta_phero_mat)                             # 更新信息素矩阵
                iterNum += 1
    
        def update_phero_mat(self, delta):
            self.phero_mat = (1 - self.rho) * self.phero_mat + delta
            # self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判断是否超过浓度上限
    
        def random_seed(self):                                                     # 产生随机的起始点下表,尽量保证所有蚂蚁的起始点不同
            if self.ants_num <= self.cities_num:                                   # 蚂蚁数 <= 城市数
                self.path_seed[:] = np.random.permutation(range(self.cities_num))[:self.ants_num]
            else:                                                                  # 蚂蚁数 > 城市数
                self.path_seed[:self.cities_num] = np.random.permutation(range(self.cities_num))
                temp_index = self.cities_num
                while temp_index + self.cities_num <= self.ants_num:
                    self.path_seed[temp_index:temp_index + self.cities_num] = np.random.permutation(range(self.cities_num))
                    temp_index += self.cities_num
                temp_left = self.ants_num % self.cities_num
                if temp_left != 0:
                    self.path_seed[temp_index:] = np.random.permutation(range(self.cities_num))[:temp_left]
    
        def display(self):                                                         # 数据可视化展示
            plt.figure(figsize=(6, 10))
            plt.subplot(211)
            plt.plot(self.ants_info, 'g.')
            plt.plot(self.best_path, 'r-', label='history_best')
            plt.xlabel('Iteration')
            plt.ylabel('length')
            plt.legend()
            plt.subplot(212)
            plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')
            plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')
            plt.xlabel('x')
            plt.ylabel('y')
            plt.savefig('ACO.png', dpi=500)
            plt.show()
            plt.close()
    
    
    ACO()
    

    输出:

    469ea38ae703f4568075469b9fa57261.png

    e1f1e71f167a9392132041d54e679967.png

    参考文献

    [1]https://www.cnblogs.com/xxhbdk/p/9177423.html

    [2]《matlab在数学建模中的应用》

    展开全文
  • 点击上方“计算机视觉cv”即可“进入公众号”重磅干货第一时间送达蚁群算法基本思想蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有...

    点击上方“计算机视觉cv”即可“进入公众号”

    重磅干货第一时间送达

    蚁群算法基本思想

    蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。蚂蚁是如何做到这一点的呢?

    原来,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物一信息激素一也可称之为信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响它们以后的行为。当一些路径上通过的蚂蚁越来越多时,其留下的信息素也越来越多,以致信息素强度增大(当然,随时间的推移会逐渐减弱),所以蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度,这种选择过程被称之为蚂蚁的自催化行为。由于其原理是一种正反馈机制.因此,也可将蚂蚁王国理解为所谓的增强型学习系统。

    在自然界中,蚁群的这种寻找路径的过程表现为一种正反馈过程,“蚁群算法”就是模仿生物学蚂蚁群觅食寻找最优路径原理衍生出来的。

    蚁群算法数学模型

    应该说前面介绍的蚁群算法只是一种算法思想,要是想真正应用该算法,还需要针对一个特定问题, 建立相应的数学模型。现仍以经典的TSP问题为例,来进一步阐述如何基于蚁群算法来求解实际问题。

    对于TSP问题,为不失一般性,设整个蚂蚁群体中蚂蚁的数量为m,城市的数量为n,城市i与城市j之间的距离为 (i,j=1,2,…,n),t时刻城市i与城市j连接路径上的信息素浓度为(t)。初始时刻,蚂蚁被放置在不同的城市里,且各城市间连接路径上的信息素浓度相同,不妨设(0)=(0)。然后蚂蚁将按一定概率选择线路,不妨设为t时刻蚂蚁k从城市i转移到城市j的概率。我们知道,“蚂蚁TSP”策略会受到两方面的左右,首先是访问某城市的期望,另外便是其他蚂蚁释放的信息素浓度,所以定义:

    3d651b1265101f9c43e2ba979810a58e.png

    其中, 为启发函数,表示蚂蚁从城市i转移到城市j的期望程度:(k=1, 2, …, m)为蚂蚁k待访问城市集合,开始时,中有n一1个元素,即包括除了蚂蚁k出发城市的其他多有城市, 随着时间的推移,中的元素越来越少,直至为空;a为信息素重要程度因子,简称信息度因子。其值越大,表示信息影响强度越大;为启发函数重要程度因子,简称启发函数因子,其值越大,表明启发函数影响越大。

    在蚂蚁遍历城市的过程中,与实际情况相似的是,在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素的强度也在通过挥发等方式逐渐消失。为了描述这一特征,不妨令p(0

    306f09e1321f7ddbbdd9bc048042031f.png

    其中,为第k只蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度;为所有蚂蚁在城市i与城市j连接路径上释放信息素而增加的信息素浓度。

    一般的值可由ant cycle system模型进行计算:

    d674d815f1a0461aabb3f060156ad6b2.png

    其中,Q为信息素常数,表示蚂蚁循环一次所释放的信息素总量;为第k只蚂蚁经过路径的总长度。

    蚁群算法流程

    用蚁群算法求解TSP问题的算法流程如下图所示,具体每步的含义如下:

    • 步骤1:对相关参数进行初始化,包括蚁初始化群规模、信息素因子、启发函数因子、信息素、挥发因子、信息素常数、最大迭代次数等,以及将数据读人程序,并对数据进行基本的处理,如将城市的坐标位置,转为城市间的矩阵。
    • 步骤2:随机将蚂蚁放于不同的出发点,对每个蚂蚁计算其下一个访问城市,直至所更新信息素表有蚂蚁访问完所有城市。
    • 步骤3:计算各个蚂蚁经过的路径长度,记录当前迭代次数中的最优解,同时对各个城市连接路径上的信息素浓度进行更新。
    • 步骤4:判断是否达到最大迭代次数,若否,则返回步骤2,否则终止程序。
    • 步骤5:输出程序结果,并根据需要输出程序寻优过程中的相关指标,如运行时间、收敛迭代次数等。4d6ebef7133143639ab3f4b1bf516502.png

    python简单实现

    import numpy as npimport matplotlib.pyplot as plt# 建立“蚂蚁”类class Ant(object):    def __init__(self, path):        self.path = path                       # 蚂蚁当前迭代整体路径        self.length = self.calc_length(path)   # 蚂蚁当前迭代整体路径长度    def calc_length(self, path_):              # path=[A, B, C, D, A]注意路径闭环        length_ = 0        for i in range(len(path_)-1):            delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)            length_ += np.linalg.norm(delta)        return length_    @staticmethod    def calc_len(A, B):                        # 静态方法,计算城市A与城市B之间的距离        return np.linalg.norm((A.x - B.x, A.y - B.y))# 建立“城市”类class City(object):    def __init__(self, x, y):        self.x = x        self.y = y# 建立“路径”类class Path(object):    def __init__(self, A):                     # A为起始城市        self.path = [A, A]    def add_path(self, B):                     # 追加路径信息,方便计算整体路径长度        self.path.append(B)        self.path[-1], self.path[-2] = self.path[-2], self.path[-1]# 构建“蚁群算法”的主体class ACO(object):    def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):        self.ants_num = ant_num   # 蚂蚁个数        self.maxIter = maxIter    # 蚁群最大迭代次数        self.alpha = alpha        # 信息启发式因子        self.beta = beta          # 期望启发式因子        self.rho = rho            # 信息素挥发速度        self.Q = Q                # 信息素强度        ###########################        self.deal_data('coordinates.dat')                         # 提取所有城市的坐标信息        ###########################        self.path_seed = np.zeros(self.ants_num).astype(int)      # 记录一次迭代过程中每个蚂蚁的初始城市下标        self.ants_info = np.zeros((self.maxIter, self.ants_num))  # 记录每次迭代后所有蚂蚁的路径长度信息        self.best_path = np.zeros(self.maxIter)                   # 记录每次迭代后整个蚁群的“历史”最短路径长度        ###########################        self.solve()              # 完成算法的迭代更新        self.display()            # 数据可视化展示    def deal_data(self, filename):        with open(filename, 'rt') as f:            temp_list = list(line.split() for line in f)                                   # 临时存储提取出来的坐标信息        self.cities_num = len(temp_list)                                                   # 1. 获取城市个数        self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list)     # 2. 构建城市列表        self.city_dist_mat = np.zeros((self.cities_num, self.cities_num))                  # 3. 构建城市距离矩阵        for i in range(self.cities_num):            A = self.cities[i]            for j in range(i, self.cities_num):                B = self.cities[j]                self.city_dist_mat[i][j] = self.city_dist_mat[j][i] = Ant.calc_len(A, B)        self.phero_mat = np.ones((self.cities_num, self.cities_num))                       # 4. 初始化信息素矩阵        # self.phero_upper_bound = self.phero_mat.max() * 1.2                              ###信息素浓度上限        self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num))          # 5. 初始化启发函数矩阵    def solve(self):        iterNum = 0                                                            # 当前迭代次数        while iterNum < self.maxIter:            self.random_seed()                                                 # 使整个蚁群产生随机的起始点            delta_phero_mat = np.zeros((self.cities_num, self.cities_num))     # 初始化每次迭代后信息素矩阵的增量            ##########################################################################            for i in range(self.ants_num):                city_index1 = self.path_seed[i]                                # 每只蚂蚁访问的第一个城市下标                ant_path = Path(self.cities[city_index1])                      # 记录每只蚂蚁访问过的城市                tabu = [city_index1]                                           # 记录每只蚂蚁访问过的城市下标,禁忌城市下标列表                non_tabu = list(set(range(self.cities_num)) - set(tabu))                for j in range(self.cities_num-1):                             # 对余下的城市进行访问                    up_proba = np.zeros(self.cities_num-len(tabu))             # 初始化状态迁移概率的分子                    for k in range(self.cities_num-len(tabu)):                        up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) * \                        np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)                    proba = up_proba/sum(up_proba)                             # 每条可能子路径上的状态迁移概率                    while True:                                                # 提取出下一个城市的下标                        random_num = np.random.rand()                        index_need = np.where(proba > random_num)[0]                        if len(index_need) > 0:                            city_index2 = non_tabu[index_need[0]]                            break                    ant_path.add_path(self.cities[city_index2])                    tabu.append(city_index2)                    non_tabu = list(set(range(self.cities_num)) - set(tabu))                    city_index1 = city_index2                self.ants_info[iterNum][i] = Ant(ant_path.path).length                if iterNum == 0 and i == 0:                                    # 完成对最佳路径城市的记录                    self.best_cities = ant_path.path                else:                    if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities = ant_path.path                tabu.append(tabu[0])                                           # 每次迭代完成后,使禁忌城市下标列表形成完整闭环                for l in range(self.cities_num):                    delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]            self.best_path[iterNum] = Ant(self.best_cities).length            self.update_phero_mat(delta_phero_mat)                             # 更新信息素矩阵            iterNum += 1    def update_phero_mat(self, delta):        self.phero_mat = (1 - self.rho) * self.phero_mat + delta        # self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判断是否超过浓度上限    def random_seed(self):                                                     # 产生随机的起始点下表,尽量保证所有蚂蚁的起始点不同        if self.ants_num <= self.cities_num:                                   # 蚂蚁数 <= 城市数            self.path_seed[:] = np.random.permutation(range(self.cities_num))[:self.ants_num]        else:                                                                  # 蚂蚁数 > 城市数            self.path_seed[:self.cities_num] = np.random.permutation(range(self.cities_num))            temp_index = self.cities_num            while temp_index + self.cities_num <= self.ants_num:                self.path_seed[temp_index:temp_index + self.cities_num] = np.random.permutation(range(self.cities_num))                temp_index += self.cities_num            temp_left = self.ants_num % self.cities_num            if temp_left != 0:                self.path_seed[temp_index:] = np.random.permutation(range(self.cities_num))[:temp_left]    def display(self):                                                         # 数据可视化展示        plt.figure(figsize=(6, 10))        plt.subplot(211)        plt.plot(self.ants_info, 'g.')        plt.plot(self.best_path, 'r-', label='history_best')        plt.xlabel('Iteration')        plt.ylabel('length')        plt.legend()        plt.subplot(212)        plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')        plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')        plt.xlabel('x')        plt.ylabel('y')        plt.savefig('ACO.png', dpi=500)        plt.show()        plt.close()ACO()

    输出:

    1cd48e016f31d61310e30cbc119e63fe.png779002f08f07b13b06cff7c08c3c6825.png

    参考文献

    [1]https://www.cnblogs.com/xxhbdk/p/9177423.html 

    [2]《matlab在数学建模中的应用》

    f3ed753a84ce8d6145c4574a15326b8e.png

    bde09b87d46b8a0d9f5e624c8b33606f.png

    展开全文
  • 蚁群算法大 纲蚁群算法的起源蚁群行为描述蚁群算法的基本思想基本蚁群算法的系统学特征TSP问题描述基本蚁群算法的数学模型基本蚁群算法的应用举例总结蚁群算法起源蚁群算法(ant colony optimization, ACO)Dorigo M于...
  • 蚁群算法matlab

    千次阅读 多人点赞 2018-09-12 16:49:55
    (一)蚁群算法的由来 蚁群算法最早是由Marco...蚁群算法的基本思想来源于自然界蚂蚁觅食的最短路径原理,根据昆虫科学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它们可以在没有任何提示的情况下找到从食物源到...
  • 人工智能07蚁群算法及其应用PPT51页;...蚁群算法的基本思想;蚁群算法的基本思想;蚁群算法的基本思想;蚁群算法的数学模型;蚁群算法的数学模型;蚁群算法的数学模型;蚁群算法的数学模型;TSP应用举例;TSP应用
  • 第七章 蚁群算法及其应用;...蚁群算法的基本思想;蚁群算法的基本思想;蚁群算法的基本思想;蚁群算法的数学模型;蚁群算法的数学模型;蚁群算法的数学模型;蚁群算法的数学模型;TSP应用举例;TSP应用举例;TSP应用
  • 提出一种基于蚁群算法的无线传感器网络按需多路节能路由算法。该算法综合了蚁群优化算法和AODV路由协议的思想,通过蚂蚁并行地在源节点和目的节点之间建立多路径路由,提高了网络数据传输的实时性、延长了整个网络的...
  • 作者:莫石 ...来源:知乎 著作权归作者所有,转载请联系作者获得...基本思想都是模拟自然界生物群体行为来构造随机优化算法的,不同的是粒子群算法模拟鸟类群体行为,而蚁群算法模拟蚂蚁觅食原理。 1.相同点 (1)都是
  • (一)蚁群算法的由来 ...蚁群算法的基本思想来源于自然界蚂蚁觅食的最短路径原理,根据昆虫科学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它们可以在没有任何提示的情况下找到从食物源到巢穴...
  • 转(蚁群算法

    2019-09-19 00:14:01
    接下来便为大家简单介绍蚁群算法的基本思想蚁群算法,顾名思义就是根据蚁群觅食行为而得来的一种算法。单只蚂蚁的觅食行为貌似是杂乱无章的,但是据昆虫学家观察,蚁群在觅食时总能够找到离食物最近的...
  • 第5章 蚁群算法.ppt

    2020-01-15 09:56:43
    研究主要是以蚂蚁寻找食物之后能选择一条最短路径来连接蚁穴和食物源 1991年在法国巴黎第一届欧洲人工生命会议上最早提出了蚁群算法的基本模型1992年又在其博士论文中进一步阐述了蚁群算法的核心思想;蚂蚁觅食过程;A...
  • 蚁群算法原理及其实现(python)

    万次阅读 多人点赞 2018-05-20 11:08:23
    蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年...蚁群算法的基本思想:# -*- coding: utf-8 -*- import random import copy import time import sys import math impor...
  • 提出了一种基于遗传多蚁群的QoS组播路由算法,...后期引入多蚁群思想,克服蚁群算法容易陷入局部最优,导致算法停滞的缺点。仿真结果表明,该算法在多节点情况下具有更强的寻优能力和可靠性,是一种有效的QoS路由方法。
  • 蚁群算法蚂蚁如何找到最短路径蚁群算法特征基本思想数学模型(以TSP问题为例子)初始化选择路径更新信息输出结果蚁群大小终止条件蚁群算法的基本思想(总结)蚁群算法的改进优化带精英策略的蚂蚁(AS)蚁群系统(ACS...
  • 蚁群算法解TSP

    千次阅读 2018-09-07 19:01:03
    1.1蚁群算法的基本思想 蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,蚂蚁在寻找食物源时,能在其走过的路径上释放一种蚂蚁特有的分泌物–信息素,使得一定范围内的其他蚂蚁能够察觉到并由此影响他们...
  • 作者:莫石 ...来源:知乎 著作权归作者所有,转载请联系作者获得...基本思想都是模拟自然界生物群体行为来构造随机优化算法的,不同的是粒子群算法模拟鸟类群体行为,而蚁群算法模拟蚂蚁觅食原理。 1.相同点 (1)都是
  • 借鉴蚁群算法的进化思想, 提出一种求解连续空间优化问题的蚁群算法。该算法主要包括全局 搜索、 局部搜索和信息素强度更新规则。在全局搜索过程中, 利用信息素强度和启发式函数确定蚂蚁移 动方向。在局部...
  • 智能算法---蚁群算法

    2016-11-23 17:25:00
    1 蚁群算法及其基本思想 蚁群算法是一种智能优化算法,通过蚁群优化求解复杂问题,ACO在离散优化问题方面有比较好的优越性。 基本思想(以旅行商问题为例) 设置多只蚂蚁,分头并行搜索。 每只蚂蚁完成...
  • 文章目录蚁群算法的背景蚁群算法思想蚁群算法的python实现实例总结 蚁群算法的背景 古有牛顿在苹果树下被苹果砸中发现万有引力,三十年前有人观察蚂蚁觅食发明蚁群算法蚁群算法是意大利学者Dorigo、Maniezzo等人...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 190
精华内容 76
关键字:

蚁群算法思想