1. 程式人生 > >【機器學習筆記35】蟻群演算法

【機器學習筆記35】蟻群演算法

【參考資料】
【1】《蟻群演算法原理及其應用》
【2】測試資料: https://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz

演算法原理(以TSP問題為例)

(1)引數初始化。令時間t=0和迴圈次數 N c = 0

N_c = 0 ,設定最大迴圈次數 N c m a x
N_{c_{max}}
。將m只螞蟻設定在n個城市之上,令城市之間的有向圖每個邊的初始化資訊量 τ i j (
t ) = c o n s t \tau_{ij}(t)=const
,初始時刻 τ i j ( 0 ) = 0 \tau_{ij}(0)=0

(2)開始迴圈 N c N c + 1 N_c \gets N_c + 1
(3)遍歷螞蟻群 k = k + 1 k = k + 1 ,每次迴圈都會隨機置放螞蟻;
(4)根據下述概率選擇公式選擇城市,選過的城市放入該螞蟻的禁忌表
p i j k ( t ) = [ τ i j ( t ) ] α [ η i j ( t ) ] β [ τ i s ( t ) ] α . [ η i s ( t ) ] β p_{ij}^k(t)=\dfrac{[\tau_{ij}(t)]^{\alpha}[\eta_{ij}(t)]^{\beta}}{ \sum [\tau_{is}(t)]^{\alpha}.[\eta_{is}(t)]^{\beta}}

(4.1) \sum 遍歷的是第k只螞蟻在t時刻能夠去的所有城市
(4.2) τ i s ( t ) \tau_{is}(t) 是此時該路徑上的資訊量, α \alpha 是資訊啟發因子,表示當前軌道的重要性
(4.3) η i j = 1 d i j \eta_{ij}=\dfrac{1}{d_{ij}} ,其中 d i j d_{ij} 是兩個城市之間的舉例, β \beta 為期望啟發因子,表示能見度重要性
(5)當前所有螞蟻前進一步後,更新各個路徑上的資訊素,如下:
τ i j ( t + n ) = ( 1 ρ ) τ i j ( t ) + Δ τ i j ( t ) \tau_{ij}(t + n) = (1 - \rho)\tau_{ij}(t) + \Delta \tau_{ij}(t)
(5.1)這裡 ρ \rho 是資訊揮發係數
(5.2) Δ τ i j ( t ) = k = 1 m Δ τ i j k ( t ) \Delta \tau_{ij}(t) = \sum\limits_{k=1}^{m}\Delta \tau_{ij}^k(t) ,表示全部m只螞蟻對該路徑的資訊素影響
(5.3) Δ τ i j k ( t ) = Q L k \Delta \tau_{ij}^k(t) = \dfrac{Q}{L_k} 或者 Δ τ i j k ( t ) = Q d i j \Delta \tau_{ij}^k(t) = \dfrac{Q}{d_{ij}} ,這裡 L k L_k 表示螞蟻本次走過的總路徑、 d i j d_ij 為路徑(i,j)之間的距離。
(5.4)Q表示資訊素強度應是一個超引數
(6)達到迴圈週期 N c m a x N_{c_{max}} 時退出,否則清空禁忌表重新開始。每次迭代重新開始時,資訊素表為上一次的結果;

程式碼實現(純python)

不確定是否是超引數設定的問題,還是程式碼本身邏輯有缺陷,整個蟻群演算法幾乎沒有正常的收斂!!等後面工作空了的時候再慢慢調整

# -*- coding: utf-8 -*-
import numpy  as np
import random
import math
import matplotlib.pyplot as plt
import pandas as pd

CITY_NUM = 48   #城市數量
d_array = [[0 for col in range(CITY_NUM)] for row in range(CITY_NUM)]  #舉例矩陣

ANT_NUM = 20  #初始化螞蟻數量 
t_array = [[-1 for col in range(CITY_NUM)] for row in range(ANT_NUM)]  #螞蟻的禁忌表,已經走過的路徑
d_ant   = [0 for col in range(ANT_NUM)] #此次迴圈螞蟻走過的距離總數
r_ant   = [(0,0) for col in range(ANT_NUM)] #本次螞蟻爬的路徑

i_array = [[0.1 for col in range(CITY_NUM)] for row in range(CITY_NUM)]  #資訊素矩陣


ALPHA = 1    #資訊啟發因子
BETA  = 2    #期望啟發因子
RHO   = 0.1 #資訊揮發係數
Q_VALUE = 8000 #資訊素強度
ITERATOR = 50

def _init_tsp_data():

    """
    構造TSP的有向圖
    """

    df = pd.read_csv('./data/att48.tsp', sep=' ')

    x_data = np.asarray(df.loc[:, ['x']])
    y_data = np.asarray(df.loc[:, ['y']])

    for i in range(0, 48):
        for j in range(0, 48):

            dx2 = math.pow((x_data[j] - x_data[i]),2)
            dy2 = math.pow((y_data[j] - y_data[i]),2)

            d_array[i][j] = math.sqrt(dx2 + dy2)


def _init_ant_data():

    """
    隨機放置ANT_NUM
    """

    for i in range(0, ANT_NUM):

        tmp = random.randint(0, CITY_NUM - 1)

        t_array[i][0] = tmp

def _get_curr_city(data):

    """
    從已經經過的城市列表中找到最新的城市
    """

    res   
            
           

相關推薦

機器學習筆記35演算法

【參考資料】 【1】《蟻群演算法原理及其應用》 【2】測試資料: https://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz 演算法原理(以TSP問題為例) (1)引數初始化。令時間t=0和迴圈次數

機器學習筆記02最小二乘法(多元線性迴歸模型)

數學基礎 1.轉置矩陣 定義: 將矩陣A同序數的行換成列成為轉置矩陣ATA^TAT,舉例: A=(1203−11)A=\begin{pmatrix} 1 & 2 & 0 \\ 3 & -1 &

機器學習筆記01最小二乘法(一元線性迴歸模型)

【參考資料】 【1】《概率論與數理統計》 【2】 http://scikit-learn.org /stable/auto_examples/ linear_model/ plot_ols.html # sphx-glr-auto-examples-

機器學習筆記04隨機梯度下降

梯度下降 梯度下降是一個尋找函式機值的方式,屬於最優化裡的基礎演算法,在低維度的情況下非常容易理解。 例如存在函式y=x2y=x^2y=x2存在導數dy=2x,若當前點在x=1點,設dx的步長為0.1。此時我們通過負梯度計算下一個x點xt+1=xt−2∗0.

機器學習筆記05Jacobian矩陣&Hessian矩陣

Jacobian矩陣 Jacobian矩陣是函式對向量求導,其結果是一階偏導陣列成的矩陣。假設:F:Rn→RmF:R_n \to R_mF:Rn​→Rm​也就是一個n維歐式空間向m維歐式空間的一個對映。 舉例: 由球座標系轉換到直角座標系,存在對映形式化表

機器學習筆記08分類器(softmax迴歸)

基本定義 首先給出softmax的數學定義,如下: hθ(x(i))=[p(y(i)=1∣x(i);θ)p(y(i)=2∣x(i);θ)⋮p(y(i)=k∣x(i);θ)]=1∑j=1keθjTx(i)[eθ1Tx(i)eθ2Tx(i)⋮eθkTx(i)]

機器學習筆記18隱馬爾可夫模型

【參考資料】 【1】《統計學習方法》 隱馬爾可夫模型(HMM)定義 隱馬爾可夫模型: 隱馬爾可夫模型是關於時序的模型,描述一個由隱藏的馬爾可夫鏈生成的不可觀測的狀態序列,再由各個狀態生成的觀測值所構成的一個觀測序列。 形式化定義HMM為λ=(A,B,π)\la

機器學習筆記14奇異值分解(SVD)

奇異值分解 定義: 假設A是一個m×nm \times nm×n的矩陣,則存在如下一種分解: Am×n=Um×m∑m×nVn×nTA_{m \times n}=U_{m \times m} \sum_{m \times n} V_{n \times n}^T

機器學習筆記17支援向量機

【參考資料】 【1】《統計學習方法》 基本概念 當訓練資料線性可分時,通過硬間隔最大化,學習一個線性的分類器,即線性可分支援向量機,又稱硬間隔支援向量機; 當訓練資料近似線性可分時,通過軟間隔(增加一個鬆弛因子)後學習一個線性的分類器,即軟間隔支援向量機;

機器學習筆記20神經網路(鏈式求導和反向傳播)

【參考文獻】 【1】《面向機器智慧的TensorFlow實踐》4.7 假設存在網路結果如下 各個層輸出定義 L1=sigmoid(w1⋅x)L_1 = sigmoid(w_1 \cdot x)L1​=sigmoid(w1​⋅x) L2=sigmoid(w2⋅L

機器學習筆記12聚類(k-means)

K-means 演算法 演算法流程如下: (1)在樣本中選擇兩個點(也可以是若干個)作為種子點; (2)計算其餘各個樣本離該種子點的距離,並將其分為兩類; (3)將種子點移到(2)所分為的兩類的中間; (4)重複(2)(3)直到種子不再移動; K-means

機器學習筆記15主成分分析(PCA)

PCA演算法 去平均值,即每一位特徵減去各自的平均值 計算新矩陣的協方差矩陣 設$X=(X_1, X_2…X_N)^T $,在鳶尾花例子裡N=4,會生成一個4*4的協方差矩陣 稱矩陣 C=(cij)n×n=(c11c12⋯c1nc21c22⋯c2n⋯⋯⋯⋯

機器學習筆記21神經網路(多層感知機)

【參考資料】 【1】《深度學習》 花書 6.1 亦或問題 由於單層感知機相當於在一個空間增加了一個超平面進行分類,那麼對於像亦或問題這樣的情況則無法完成。 因此在多層感知機中增加了一個隱藏層,即一個啟用函式。現代神經網路最常用的啟用函式是整流線性單元,ReL

機器學習筆記19神經網路(單層感知機)

【參考資料】 【1】《人工神經網路教程》 【2】《matlab 2015b 神經網路技術》 基本概念 單層感知器可以看成一個線性累加器和一個二值化閾值元器件,通常會在累加一個偏移量。由公式表達為:oj=sgn(∑i=1nwijxi+b)o_j= sgn(\s

機器學習筆記16拉格朗日乘子法

【參考資料】 【1】《統計學習方法》 【2】《凸優化》 【3】小象學院 《凸優化》 凸集 直線和線段的表達 設x1≠x2x_1 \ne x_2x1​̸​=x2​是RnR^nRn空間上的兩個點,具有存在下列定義的點: y=θx1+(1−θ)x2y = \thet

機器學習筆記13聚類(高斯混合聚類)

【參考資料】 【1】《統計學習方法》 【2】《概率論與數理統計》 【3】小象學院 EM演算法 高斯分佈 定義: 如果隨機變數X的概率密度為f(x)=12πσe−(x−u)22σ2f(x)= \dfrac{1}{\sqrt{2\pi}\sigma}e^{-\df

機器學習筆記22神經網路(卷積神經網路)

【參考資料】 【1】《面向機器智慧的tensorflow實踐》 【2】Keras/example – mnist_cnn.py 【3】Keras中文文件 常用層 卷積層 卷積理解就是之前影象處理裡用作檢測邊緣、檢測角點的運算元,例如: 輸入: [1234] \

機器學習筆記23神經網路(RNN)

基礎迴圈神經網路 迴圈神經網路(RNN)是一個由神經元和權值構成的有向圖,它的當前狀態與前一時刻的狀態和當前輸入決定,因此當前狀態也被稱為工作記憶。迴圈神經網路在時間序列上展開後如上圖所示,用於解決序列化的問題,諸如語音識別、語音合成、文字生成。 例子:利

機器學習筆記24神經網路(LSTM)

梯度消失原因 TBD 模型定義 LSTM 長短期記憶網路是一種特殊的RNN,為解決梯度爆炸和梯度消失的問題,LSTM將RNN中普通的神經元替換成了擁有少量記憶的LSTM單元。 第一步: 決定丟棄資訊 第二步: 確定更新資訊 第三步: 更新狀態 第四

機器學習筆記26基於VGG16的影象風格遷移

Note: 本文主要是對論文及參考文獻【1】中程式碼的理解 概述 該演算法的本質是利用深度卷積網路對影象輸入的抽象,主要是三部分: 將風格影象輸入卷積神經網路,將某些層輸出作為風格特徵(做一次); 將內容影象輸入卷積神經網路,將某些層輸出作為內容特徵(做一