日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二进制蚁群算法【源码实现】

發布時間:2024/9/30 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二进制蚁群算法【源码实现】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

蟻群算法
?????之前講解了蟻群算法,見鏈接。萬字長文帶你了解蟻群算法及求解復雜約束問題【源碼實現】
?????今天講解下二進制的蟻群算法。
直接上算例。

算例

愛小玉,愛學習。

? ? ? ?? 假設一個數PD=210,它可以看成下列中的數,某幾個組合而成來的P_state=np.array([1700,2600,180,2200,1400,60,85,290,4100,3000,1590,200,1300,50,100,30,90]),即PD=sum(xiP_statei)其中的xi表示狀態,只能取0或1。
? ? ? ?? 限制條件:【180,2200】,序號[2,3]不能共存;【60,85,300】,序號[5,6,7]不能共存;【50,100】 序號[13,14]不能共存;【25,90】序號[15,16]不能共存。

這題的意思假設某刻時刻。家用總負荷為210W
家用總負荷是由各個電器的功率疊加的。其中【180,2200】,序號[2,3]不能共存,表示【180,2200】對應的是同一個電器,這個電器的功率可以是180或者2200.當一個時刻只能是一個值。其它同理。
算例實現
python 版代碼。

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author: yudengwu(余登武) # @Date : 2021/5/28 #@email:1344732766@qq.comimport numpy as np from tqdm import tqdm#進度條設置 import matplotlib.pyplot as plt import matplotlib as mpl import matplotlib; matplotlib.use('TkAgg') mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題 import math#以一個負荷為例講解優化算法P_state=np.array([1700,2600,180,2200,1400,60,85,290,4100,3000,1590,200,1300,50,100,30,90])#17個狀態state_num=17 #狀態數 #【180,2200】,序號[2,3]不能共存 #【60,85,300】,序號[5,6,7]不能共存 #【50,100】 序號[13,14]不能共存 #【25,90】序號[15,16]不能共存#總負荷 Pload=446.0 #這個值可以設置的########適應度函數 def calc_f(xi):""":param xi 為個體 即電器的工作狀態,01二二進制,0表示當前狀態關,1表示開:xi 為np.array(數據):return 返回 np.abs(XiP_state-pload) P_state為電器"額定功率":"""xi=np.array(xi)xi=xi.reshape(state_num,)return np.abs(np.sum(xi*P_state)-Pload)#=================初始化參數================ m=20 #螞蟻個數 G_max=300 #最大迭代次數 Rho=0.9 #信息素蒸發系數 P0=0.2 #轉移概率常數 Tau=np.zeros(shape=(m,)) #信息素 P=np.zeros(shape=(G_max,m)) #狀態轉移矩陣 fitneess_value_list=[] #迭代記錄最優目標函數值#########初始化群體 f=np.random.randint(0,2,(m,state_num)) #在[0,2)之前隨機取整數,取state_num(17)個 f.shape=(20, 17) for j in tqdm(range(m)):while f[j, 2] + f[j, 3] == 2:f[j, 2] = np.random.randint(0, 2, 1)f[j, 3] = np.random.randint(0, 2, 1)# 【60,85,300】,序號[5,6,7]不能共存while f[j, 5] + f[j, 6] + f[j, 7] == 2 or f[j, 5] + f[j, 6] + f[j, 7] == 3:f[j, 5] = np.random.randint(0, 2, 1)f[j, 6] = np.random.randint(0, 2, 1)f[j, 7] = np.random.randint(0, 2, 1)# 【50,100】 序號[13,14]不能共存while f[j, 13] + f[j, 14] == 2:f[j, 13] = np.random.randint(0, 2, 1)f[j, 14] = np.random.randint(0, 2, 1)# 【25,90】序號[15,16]不能共存while f[j, 15] + f[j, 16] == 2:f[j, 15] = np.random.randint(0, 2, 1)f[j, 16] = np.random.randint(0, 2, 1)for i in range(m):#遍歷每一個螞蟻Tau[i] = calc_f(f[i])#信息素step=0.3; #局部搜索步長 for NC in range(G_max):#遍歷每一代lamda=1/(NC+1)BestIndex=np.argmin(Tau) #最優索引Tau_best=Tau[BestIndex] #最優信息素#計算狀態轉移概率for i in range(m):#遍歷每一個螞蟻P[NC,i]=np.abs((Tau_best-Tau[i]))/np.abs(Tau_best)+0.01 #即例最優信息素的距離.越近越好# =======位置更新==========for i in range(m): # 遍歷每一個螞蟻#當前螞蟻bf=f[i].copy()# ===局部搜索===if P[NC, i] < P0:#每只螞蟻 的元素隨機選擇 np.int(state_num*(step*lamda))個 取反sizeaca=np.int(state_num*(step*lamda))#取反的個數index=np.random.choice(np.arange(0,state_num,1),size=sizeaca,replace=False)#取反的序號bf[index]=1-bf[index] #元素取反# ===全局搜索===else:#選擇4分之一元素取反index = np.random.choice(np.arange(0, state_num, 1), size=np.int(state_num/4), replace=False) # 取反的序號bf[index] = 1 - bf[index] # 元素取反# =====位置限制=====# 【180,2200】,序號[2,3]不能共存while bf[2] + bf[3] == 2:bf[2] = np.random.randint(0, 2, 1)bf[3]= np.random.randint(0, 2, 1)# 【60,85,300】,序號[5,6,7]不能共存while bf[5] + bf[6] + bf[7] == 2 or bf[5] + bf[6] + bf[7] == 3:bf[5] = np.random.randint(0, 2, 1)bf[6] = np.random.randint(0, 2, 1)bf[7] = np.random.randint(0, 2, 1)# 【50,100】 序號[13,14]不能共存while bf[13] + bf[14] == 2:bf[13] = np.random.randint(0, 2, 1)bf[14] = np.random.randint(0, 2, 1)# 【25,90】序號[15,16]不能共存while bf[15] + bf[16] == 2:bf[15] = np.random.randint(0, 2, 1)bf[16] = np.random.randint(0, 2, 1)##判斷螞蟻是否移動(選更優)if calc_f(bf) < calc_f(f[i]):f[i]=bf# =====更新信息素========for i in range(m): # 遍歷每一個螞蟻Tau[i] = (1 - Rho) * Tau[i] + calc_f(f[i]) # (1 - Rho) * Tau[i] 信息蒸發后保留的index = np.argmin(Tau) # 最小值索引value = Tau[index] # 最小值fitneess_value_list.append(calc_f(f[i])) # 記錄最優目標函數值#打印結果 min_index=np.argmin(Tau)#最優值索引 minf=f[min_index] #最優變量 \最優螞蟻minValue=calc_f(minf) #最優目標函數值print('最優變量',minf) print('最優變量對應的功率',minf*P_state) print('最優誤差',minValue)plt.plot(fitneess_value_list,label='迭代曲線') plt.legend() plt.show()


作者:電氣-余登武。 一個電氣專業的計算機選手
原創不易,禁止轉載。

總結

以上是生活随笔為你收集整理的二进制蚁群算法【源码实现】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。