蚁群算法
     之前讲解了蚁群算法,见链接。万字长文带你了解蚁群算法及求解复杂约束问题【源码实现】
     今天讲解下二进制的蚁群算法。
直接上算例。

算例

爱小玉,爱学习。

假设一个数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()


作者:电气-余登武。 一个电气专业的计算机选手
原创不易,禁止转载。

二进制蚁群算法【源码实现】相关推荐

  1. 基于蚁群算法解决多模式资源约束项目调度问题(附源代码)

    基于蚁群算法解决多模式资源约束项目调度问题 最近选修了张超勇教授的项目管理学,最后这门课留下了一门大作业,这里我选做是资源约束下的项目调度问题,通过使用元启发式的蚁群算法求解了这个问题,由于时间比较仓 ...

  2. 【Matlab路径规划】蚁群算法机器人大规模栅格地图最短路径规划【含源码 1860期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法机器人大规模栅格地图最短路径规划[含源码 1860期] 二.蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接.灾 ...

  3. matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码

    基于蚁群算法的机器人路径规划MA TLAB源码 使用网格离散化的方法对带有障碍物的环境建模,使用邻接矩阵存储该环境,使得问题转化为蚁群算法寻找最短路径. function [ROUTES,PL,Tau ...

  4. 【Matlab DVRP】蚁群算法求解带距离的车辆路径规划问题【含源码 1040期】

    一.代码运行视频(哔哩哔哩) [Matlab DVRP]蚁群算法求解带距离的车辆路径规划问题[含源码 1040期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  5. 【ACO TSP】基于matlab蚁群算法求解31城市旅行商问题【含Matlab源码 1147期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab蚁群算法求解31城市旅行商问题[含Matlab源码 1147期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  6. 【飞行器】基于matlab蚁群算法飞行器巡检路径【含Matlab源码 268期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[飞行器]基于matlab蚁群算法飞行器巡检路径[含Matlab源码 268期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  7. 【Matlab优化选址】蚁群算法求解电动汽车充电站与换电站选址优化问题【含源码 1182期】

    一.代码运行视频(哔哩哔哩) [Matlab优化选址]蚁群算法求解电动汽车充电站与换电站选址优化问题[含源码 1182期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文 ...

  8. java毕业设计——基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码)——蚁群算法路由选择可视化动态模拟

    基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现,文章末尾附有本毕业设计的 ...

  9. 【Matlab路径规划】蚁群算法求解机器人栅格地图最短路径规划问题【含源码 1580期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法求解机器人栅格地图最短路径规划问题[含源码 1580期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

最新文章

  1. Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页...
  2. 珍藏的最全的windows操作系统快捷键
  3. mysql mtq_MySQL基础知识 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
  4. 在c++中一个空类占用的字节数
  5. Mvvm、第一个Vue程序、Vue基本语法
  6. c++创建文件_使用Python实现文件压缩和解压
  7. vscode配置Git管理工具GitLens
  8. 海康威视摄像头激活失败的几个原因和方法
  9. 教孩子学编程python语言pdf_教孩子学编程 PYTHON语言版 PDF
  10. protoc ——protubuf编译后的可执行文件命令usage
  11. WinRAR 设置默认密码
  12. chloe.mysql_Chloe.ORM框架应用实践
  13. 重构——46令函数携带参数(Parameterize Method)
  14. 网络战争全面打响!究竟谁能更胜一筹?
  15. 今天,我们求知若渴、虚心若愚(附技术PPT)
  16. python备份文件代码_python实现文件的备份流程详解
  17. 触摸IC XTP2046 驱动笔记
  18. 踩坑 微信小程序开发mpvue使用iconfont,顺便解决偶现图标显示不正确
  19. NLP的强大工具——AllenNLP
  20. 项目进阶攻略:如何快速扩大项目规模

热门文章

  1. python怎么将png转为tif_png转tif
  2. html中js添加或删除activex,JS:操作样式表2 :用JS实现添加和删除一个类名的功能(addClass()和removeClass())...
  3. 使用postman测试oauth2.0认证服务中出现OAuth出现Bad credentials
  4. spring boot记录操作日志
  5. LeetCode 16 最接近的三数之和
  6. 《移动项目实践》实验报告——Android初级控件
  7. JAVA——JScrollbar 滚动条自动滚动到底端解决方案
  8. flash socket通信问题
  9. 一些在线的WebEdit编辑器
  10. Android StateFlow详解