1. 程式人生 > >蟻群演算法Python實現

蟻群演算法Python實現

解決的問題

三維地形中,給出起點和重點,找到其最優路徑。

這裡寫圖片描述

作圖原始碼:

from mpl_toolkits.mplot3d import proj3d
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

height3d = np.array([[2000,1400,800,650,500,750,1000,950,900,800,700,900,1100,1050,1000,1150,1300,1250,1200,1350,1500],                   [1100,900,700,625,550,825,1100,1150,1200,925,650,750,850,950,1050,1175,1300,1350
,1400,1425,1450], [200,400,600,600,600,900,1200,1350,1500,1050,600,600,600,850,1100,1200,1300,1450,1600,1500,1400], [450,500,550,575,600,725,850,875,900,750,600,600,600,725,850,900,950,1150,1350,1400,1450], [700,600,500,550,600,550,500,400,300,450,600,600,600,600,600,600,600,850,1100,1300,1500], [500,525,550,575,600,575,550,450,350,475,600
,650,700,650,600,600,600,725,850,1150,1450], [300,450,600,600,600,600,600,500,400,500,600,700,800,700,600,600,600,600,600,1000,1400], [550,525,500,550,600,875,1150,900,650,725,800,700,600,875,1150,1175,1200,975,750,875,1000], [800,600,400,500,600,1150,1700,1300,900,950,1000,700,400,1050,1700,1750,1800,1350,900,750,600], [650,600,550,625,700,1175
,1650,1275,900,1100,1300,1275,1250,1475,1700,1525,1350,1200,1050,950,850], [500,600,700,750,800,1200,1600,1250,900,1250,1600,1850,2100,1900,1700,1300,900,1050,1200,1150,1100], [400,375,350,600,850,1200,1550,1250,950,1225,1500,1750,2000,1950,1900,1475,1050,975,900,1175,1450], [300,150,0,450,900,1200,1500,1250,1000,1200,1400,1650,1900,2000,2100,1650,1200,900,600,1200,1800], [600,575,550,750,950,1275,1600,1450,1300,1300,1300,1525,1750,1625,1500,1450,1400,1125,850,1200,1550], [900,1000,1100,1050,1000,1350,1700,1650,1600,1400,1200,1400,1600,1250,900,1250,1600,1350,1100,1200,1300], [750,850,950,900,850,1000,1150,1175,1200,1300,1400,1325,1250,1125,1000,1150,1300,1075,850,975,1100], [600,700,800,750,700,650,600,700,800,1200,1600,1250,900,1000,1100,1050,1000,800,600,750,900], [750,775,800,725,650,700,750,775,800,1000,1200,1025,850,975,1100,950,800,900,1000,1050,1100], [900,850,800,700,600,750,900,850,800,800,800,800,800,950,1100,850,600,1000,1400,1350,1300], [750,800,850,850,850,850,850,825,800,750,700,775,850,1000,1150,875,600,925,1250,1100,950], [600,750,900,1000,1100,950,800,800,800,700,600,750,900,1050,1200,900,600,850,1100,850,600]]) fig = figure() ax = Axes3D(fig) X = np.arange(21) Y = np.arange(21) X, Y = np.meshgrid(X, Y) Z = -20*np.exp(-0.2*np.sqrt(np.sqrt(((X-10)**2+(Y-10)**2)/2)))+20+np.e-np.exp((np.cos(2*np.pi*X)+np.sin(2*np.pi*Y))/2) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='cool') ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z') ax.set_title('3D map') point0 = [0,9,Z[0][9]] point1 = [20,7,Z[20][7]] ax.plot([point0[0]],[point0[1]],[point0[2]],'r',marker = u'o',markersize = 15) ax.plot([point1[0]],[point1[1]],[point1[2]],'r',marker = u'o',markersize = 15) x0,y0,_ = proj3d.proj_transform(point0[0],point0[1],point0[2], ax.get_proj()) x1,y1,_ = proj3d.proj_transform(point1[0],point1[1],point1[2], ax.get_proj()) label = pylab.annotate( "start", xy = (x0, y0), xytext = (-20, 20), textcoords = 'offset points', ha = 'right', va = 'bottom', bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 1), arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'),fontsize=15) label2 = pylab.annotate( "end", xy = (x1, y1), xytext = (-20, 20), textcoords = 'offset points', ha = 'right', va = 'bottom', bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 1), arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'),fontsize=15) def update_position(e): x2, y2, _ = proj3d.proj_transform(point0[0],point0[1],point0[2],ax.get_proj()) label.xy = x2,y2 label.update_positions(fig.canvas.renderer) x1,y1,_ = proj3d.proj_transform(point1[0],point1[1],point1[2],ax.get_proj()) label2.xy = x1,y1 label2.update_positions(fig.canvas.renderer) fig.canvas.draw() fig.canvas.mpl_connect('button_release_event', update_position)

基本原理

  • 螞蟻k根據各個城市間連結路徑上的資訊素濃度決定其下一個訪問城市,設Pkij(t)表示t時刻螞蟻k從城市i轉移到矩陣j的概率,其計算公式為

    Pkij=[τij(t)]α[ηij(t)]βsallowk[τis(t)]α[ηis(t)]β0sallowksallowk

    計算完城市間的轉移概率後,採用與遺傳演算法中一樣的輪盤賭方法選擇下一個待訪問的城市。

  • 當所有的螞蟻完成一次迴圈後,各個城市間連結路徑上的資訊素濃度需進行更新,計算公式為

    {τij(t+1)=(1ρ)τij(t)+ΔτijΔτij=nk=1δτkij

    其中,Δτkij表示第k只螞蟻在城市i與城市j連線路徑上釋放的資訊素濃度;Δτij表示所有螞蟻在城市i與城市j連線路徑上釋放的資訊素濃度之和。

  • 螞蟻釋放資訊素的模型
    Δτkij={Q/Lk,0,ki

    相關推薦

    演算法Python實現

    解決的問題 三維地形中,給出起點和重點,找到其最優路徑。 作圖原始碼: from mpl_toolkits.mplot3d import proj3d from mpl_toolkits.mplot3d import Axes3D import n

    演算法程式碼實現

    旅行商問題大都是用遺傳演算法求解,不過蟻群演算法比它高效得多,在百度的蟻群演算法吧裡有人發了個註釋清晰的程式碼,有興趣的可以去研究一下蟻群演算法和模擬退火演算法,這兩者都可以解決旅行商問題。而關於遺傳演算法和模擬退火演算法,部落格園裡的某位牛人很清楚地介紹了,發個連結吧

    演算法Python 實現

    # -*- coding: utf-8 -*- """ Created on Wed Jun 08 15:21:03 2016 @author: SYSTEM """ import os os.getcwd() import numpy as np import ma

    2018-4-8演算法---包子陽《智慧優化演算法以及Matlab實現》第五章

    資料來源:《智慧優化演算法以及matlab實現》包子陽  餘繼周 編著第五章-----蟻群演算法是一種元啟發式優化演算法(自己理解:就是作為群體的單位個體也就是元,在裡面充當著隨機的選擇搜尋的方向,有助於全域性勘探)啟發:自然界的螞蟻有能力在沒有然和提示的情況下找到從巢穴矩離

    演算法實現TSP(旅行商)問題(java語言)

    旅行商問題,即TSP問題(Traveling Salesman Problem)是數學領域中著名問題之一。假設有一個旅行商人要拜訪N個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而

    TSP問題及演算法理解與實現

    /** * Created by coco on 17-10-20. */ import java.io.*; import java.util.logging.Logger; import static java.util.logging.Logger.getLogger; public class

    演算法(詳解)python

    only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices因為要做數學建模,所以學一下蟻群演算法。在

    演算法學習

    ** 蟻群演算法的基本原理(簡單概括): ** 剛開始螞蟻按照同等概率選擇各條路徑。 螞蟻在經過的路徑下留下資訊素。 短的路徑螞蟻會率先找到食物源,因此資訊素濃度偏大。 由於資訊素的揮發,較長路徑上的資訊素逐漸消失 特點:正反饋;不容易陷入區域

    機器學習實戰——k-近鄰演算法Python實現問題記錄

      準備 kNN.py 的python模組 from numpy import * import operator def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

    C++:演算法解決TSP(C++多執行緒版)

    TSP問題:旅行商問題,最短迴路。 這裡採用att48資料,鄰接矩陣全部取整數,原資料放在文後。 解決程式碼如下: //#define TEST_INPUT //#define TEST_T //#define TEST_ANT //#define TEST_VALUE #

    小白向Apriori演算法Python實現

      參考部落格:http://www.cnblogs.com/llhthinker/p/6719779.html      學習的別人的程式碼,用Python實現的Apriori演算法,演算法介紹見https://www.cnblogs.com/1113127139aaa/p/9926507.html

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

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

    演算法matlab

    (一)蟻群演算法的由來 蟻群演算法最早是由Marco Dorigo等人在1991年提出,他們在研究新型演算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為資訊素的生物激素交流覓食資訊從而能快速的找到目標,據此提出了基於資訊正反饋原理的蟻群演算法。 蟻群演算法的基本思想來源於自然界螞

    遺傳演算法-python實現

    已經調通,並有大量註釋 # encoding=utf-8 import math import random import operator class GA(): def __init__(self, length, count): # 染色體長度

    機器學習——樸素貝葉斯演算法Python實現

    簡介 這裡參考《統計學習方法》李航編進行學習總結。詳細演算法介紹參見書籍,這裡只說明關鍵內容。 即 條件獨立下:p{X=x|Y=y}=p{X1=x1|Y=y} * p{X2=x2|Y=y} *...* p{Xn=xn|Y=y} (4.4)等價於p{Y=ck|X=x

    快速排序演算法Python實現

    快速排序演算法,簡稱快排,是最實用的排序演算法,沒有之一,各大語言標準庫的排序函式也基本都是基於快排實現的。 本文用python語言介紹四種不同的快排實現。 1. 一行程式碼實現的簡潔版本 quick_sort = lambda array: array if le

    N數碼問題的啟發式搜尋演算法--A*演算法python實現

    一、啟發式搜尋:A演算法 1)評價函式的一般形式 : f(n) = g(n) + h(n) g(n):從S0到Sn的實際代價(搜尋的橫向因子) h(n):從N到目標節點的估計代價,稱為啟發函式(搜尋的縱向因子); 特點: 效率高, 無回溯,   搜尋演算法 OPEN表 : 存放待擴充套件的節點. CLOS

    python學習之旅 | k_means演算法python實現

    寫在前面 前一段時間看到一篇文章,建議學生時代寫程式碼不要光呼叫庫和複製貼上,而是要儘量每一行程式碼都自己寫。因為以後工作的時候都主要是用別人寫好的東西,就沒有這樣鍛鍊基本功的機會了。 筆者最近入門python,希望能夠通過這些重複造輪子的簡單工作來加強基本功,

    最短路徑迪傑斯特拉演算法Python實現

    回顧下最短路徑的地傑斯特拉演算法 迪傑斯特拉演算法是求從某一個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法 示例: 演算法實現流程思路: 迪傑斯特拉演算法每次只找離起點最近的一個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後

    簡單易懂,演算法解決旅行商問題

    轉載宣告: 原文把蟻群解決旅行商問題寫的很清楚,只不過本人認為原文中有一些小錯誤,特此更改(文中紅色加粗字型為改正處),程式碼中出現的一些演算法的小問題也進行了更正(比如程式碼中的貪心演算法),程式碼也附在下面,謝謝博主的分享。 1.關於旅行商(TSP)問題及衍化