【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】

仅供学习、参考使用

一、遗传算法简介

遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示:

(图参考论文:Optimization of Worker Scheduling at Logistics
Depots Using GeneticAlgorithms and Simulated
Annealing)

在这里插入图片描述

一种常见的遗传算法变例是有偏随机密匙遗传算法 (BRKGA: Biased Random Key Genetic Algorithm) ,参考论文:A BIASED RANDOM-KEY GENETIC ALGORITHM WITH VARIABLE MUTANTS TO
SOLVE A VEHICLE ROUTING PROBLEM,算法流程大致如下:
(图参考博客:Pymoo学习 (11):有偏随机密匙遗传算法 (BRKGA: Biased Random Key Genetic Algorithm) 的使用)

在这里插入图片描述

二、项目源码(待进一步完善)

1、导入相关库

import csv
import random
import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt

2、药品统计

# 统计zone_id=2110的药品
def screen_goods_id(tote_data, zone):zone_goods_id_lists = []for i in range(len(tote_data)):zone_id = tote_data['区段ID'][i]goods_id = tote_data['产品编号'][i]if zone_id == zone:zone_goods_id_lists.append(goods_id)zone_goods_id_lists = list(set(zone_goods_id_lists))return zone_goods_id_lists

3、货位统计

# 统计zone_id=2110的货位
def generate_locations():index_id_0 = [2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181]index_id_1 = [1, 2, 3, 4, 5, 6, 7, 8]index_id_2 = [21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45]location_id_data = [f"{aa:04d}{bb:02d}{cc:02d}1" for aa in index_id_0 for bb in index_id_1 for cc in index_id_2]return location_id_data

4、缺失货位统计

# 统计zone_id=2110的缺失货位
def del_locations():index_id_0 = [217408, 217507, 217708, 217807, 218008, 218107]index_id_1 = [22, 23, 24, 25, 32, 33, 34, 35, 42, 43, 44, 45]del_loc_data = [f"{aa:06d}{bb:02d}1" for aa in index_id_0 for bb in index_id_1]return del_loc_data

5、生成可使用货位

# 去除缺失货位,生成最终的可使用货位
def screen_location_id():location_id_data = generate_locations()del_loc_data = del_locations()location_id_lists = [loc_id for loc_id in location_id_data if loc_id not in del_loc_data]return location_id_lists

6、个体(单个基因型)生成

# 生成一个个体
def pop_one_combined(list_1, list_2):  # list1的长度不能大于list2goods_ids_copy = list_1[:]location_ids_copy = list_2[:]combined_list = []for _ in range(len(list_1)):element = random.choice(location_ids_copy)location_ids_copy.remove(element)combined_list.append(element)return combined_list

生成测试:大小为6的一维数组,生成50个个体(种群类似):

list1 = [1, 2, 3, 4, 5, 6]
list2 = [1, 2, 3, 4, 5, 6]# 个体生成测试(批量生成)for i in range(50):print(pop_one_combined(list1, list2))

在这里插入图片描述
7、种群(基因池)生成

# 生成种群
def generate_pop_list(POP_SIZE, zone_goods_id_data, zone_location_id_data):pop_list = []for _ in range(POP_SIZE):pop_individuality = pop_one_combined(zone_goods_id_data, zone_location_id_data)pop_list.append(pop_individuality)return pop_list

生成测试:

# 种群生成测试(样本量50)
print(generate_pop_list(50, list1, list2))

在这里插入图片描述
8、劳累值(特征系数)计算公式

# 拣选劳累值计算公式
def pick_distance_formula(location_id, shelves_num):if location_id[-2] == '4':  # 第4层(最高层)distance = 10 * (int(location_id[0:4]) - 2173) + (shelves_num - 1) * 10 + int(location_id[-3]) + 3else:  # 第1~3层distance = 10 * (int(location_id[0:4]) - 2173) + (shelves_num - 1) * 10 + int(location_id[-3])return distance

9、一组数据的劳累值计算

# 拣选劳累值计算(一组)
def pick_distance_value(location_id):distance = 0shelves_num = int(location_id[4:6])group_1 = [1, 3, 5, 7]group_2 = [2, 4, 6, 8]if shelves_num in group_1:shelves_num = shelves_num // 2 + 1elif shelves_num in group_2:shelves_num = shelves_num // 2distance = pick_distance_formula(location_id, shelves_num)return distance

10、选择优势个体进入下一代

# 选择优胜个体
def select(pop_list, CROSS_RATE, POP_SIZE):index = int(CROSS_RATE * POP_SIZE)  # 一轮筛选后的样本数量return pop_list[0:index]  # 返回前xxx个优胜个体

11、遗传变异机制

# 遗传变异
def mutation(MUTA_RATE, child, zone_goods_id_data, zone_location_id_data):if np.random.rand() < MUTA_RATE:mutation_list = [loc_id for loc_id in zone_location_id_data if loc_id not in child]num = np.random.randint(1, int(len(zone_goods_id_data) * MUTA_RATE))for _ in range(num):index = np.random.randint(0, len(zone_goods_id_data))mutation_list.append(child[index])loc_id = random.choice(mutation_list)child[index] = loc_idreturn child

12、子代中0值的替换

# (子代)0值的替换
def obx_count_run(child, parent):for parent_elemental in parent:if parent_elemental not in child:for i in range(len(child)):if child[i] == 0:child[i] = parent_elementalbreakreturn child

13、基于顺序的交叉方式(Order-Based Crossover, OBX)

# 遗传交叉(交叉算子:基于顺序的交叉(Order-Based Crossover,OBX))
def crossmuta(pop_list, POP_SIZE, MUTA_RATE, zone_goods_id_data, zone_location_id_data):pop_new = []for i in range(len(pop_list)):pop_new.append(pop_list[i][1:])while len(pop_new) < POP_SIZE:parent_1 = random.choice(pop_list)[1:]parent_2 = random.choice(pop_list)[1:]while parent_1 == parent_2:parent_2 = random.choice(pop_list)[1:]child_1 = [0 for _ in range(len(zone_goods_id_data))]child_2 = [0 for _ in range(len(zone_goods_id_data))]for j in range(len(zone_goods_id_data)):genetic_whether = np.random.choice([0, 1])if genetic_whether == 1:child_1[j] = parent_1[j]child_2[j] = parent_2[j]if (child_1 == parent_1) or (child_2 == parent_2):continuechild_1 = obx_count_run(child_1, parent_2)child_1 = mutation(MUTA_RATE, child_1, zone_goods_id_data, zone_location_id_data)child_2 = obx_count_run(child_2, parent_1)child_2 = mutation(MUTA_RATE, child_2, zone_goods_id_data, zone_location_id_data)pop_new.append(child_1)pop_new.append(child_2)return pop_new

14、损失曲线图绘制

# 每轮总拣选劳累值绘制曲线图
def loss_chart(data):y_values = datax_values = list(range(len(y_values)))plt.plot(x_values, y_values)plt.title("zone_2110_pick_distance_loss")plt.xlabel("Iterations")  # 迭代次数plt.ylabel("zone_2110_pick_distance")  # 距离plt.grid()plt.savefig('./JS_zone_2110_pick_distance_loss.png')plt.show()

15、结果合成

# 最终结果合成
def goods_location_data_consolidation(zone_goods_id_data, zone_goods_location_id_data):goods_location_data = []for i in range(len(zone_goods_id_data)):goods_location_data.append([zone_goods_id_data[i], zone_goods_location_id_data[i]])return goods_location_data

主函数及运行:

def main():list1 = [1, 2, 3, 4, 5, 6]list2 = [1, 2, 3, 4, 5, 6]# 个体生成测试(批量生成)for i in range(50):print(pop_one_combined(list1, list2))# 种群生成测试(样本量50)print(generate_pop_list(50, list1, list2))print("Genetic algorithm run start")print(f"start_time --> {datetime.now()}")zone_2110_pick_distance = []tote_goods_data_2403 = pd.read_csv('./tote_goods_data_2024_03.csv')  # 读取数据集POP_SIZE = 20  # 种群大小CROSS_RATE = 0.9  # 交叉率MUTA_RATE = 0.05  # 变异率Iterations = 10  # 迭代次数zone_2110_goods_id_lists = screen_goods_id(tote_goods_data_2403, 2110)zone_2110_location_id_lists = screen_location_id()POP = generate_pop_list(POP_SIZE, zone_2110_goods_id_lists, zone_2110_location_id_lists)for i in range(Iterations):POP = getfitness(POP, 2110, tote_goods_data_2403, zone_2110_goods_id_lists)POP = select(POP, CROSS_RATE, POP_SIZE)zone_2110_pick_distance.append(POP[0][0])POP = crossmuta(POP, POP_SIZE, MUTA_RATE, zone_2110_goods_id_lists, zone_2110_location_id_lists)loss_chart(zone_2110_pick_distance)Updated_goods_location_data = goods_location_data_consolidation(zone_2110_goods_id_lists, POP[0])with open('./zone_2110_goods_location_data.csv', 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerow(['goods_id', 'location_id'])for row in Updated_goods_location_data:writer.writerow(row)print(f"end_time --> {datetime.now()}")print("Genetic algorithm run end")if __name__ == "__main__":main()

三、算法测试

1、pop_size=20, iterations=10
cross_rate=0.5, muta_rate=0.05:
在这里插入图片描述
交叉率不变,增加变异率到0.1:

在这里插入图片描述

交叉率不变,增加变异率到0.2:

在这里插入图片描述

变异率不变,增加交叉率到0.9:

在这里插入图片描述

2、在另一个数据集上进行测试

采用初始参数设定:
在这里插入图片描述

交叉率提高至0.9:
在这里插入图片描述

四、算法优化

GA(遗传)算法优化可行性分析

一、优化算法核心步骤参数

GA(Genetic Algorithm,遗传算法)的主要流程可以用下图进行简要描述:

在初始化阶段,需要确定imax(最大迭代次数)的值用于主循环的迭代。除这个值外,在算法的“交叉”步骤中,需要确定交叉方法(常用的交叉方法包括单点交叉、两点交叉、多点交叉、部分匹配交叉、均匀交叉、顺序交叉、基于位置的交叉、基于顺序的交叉、循环交叉、子路径交换交叉等),并指定参数cross_rate(交叉率)的值;在“变异”步骤中,需要指定参数muta_rate(变异率)的值;在“适应度计算”步骤中,需要自定义适应度(fitness)计算公式。故而可以进行优化的参数包括:
(1)最大迭代次数;
(2)交叉方法;(待验证)
(3)交叉率;
(4)变异率;(结论:提高变异率可以显著提高损失函数的收敛速度)
(5)适应度计算公式(涉及到按比例缩放的问题)。可能的策略:使用二次或者高次函数?如何提高损失函数的收敛速度?

二、采用GA的常见变式

上述流程图为GA的最基本的形式(基础GA),常见的优化变式包括:
(1)GA+SA——遗传算法结合模拟退火(Simulated Annealing)算法;
见论文:《Optimization of Worker Scheduling at Logistics
Depots Using Genetic Algorithms and Simulated
Annealing》
(2)AQDE(Adaptive Quantum Differential Evolution)算法(适应性量子差分进化算法);
见论文:《Z. Sun, Z. Tian, X. Xie, Z. Sun, X. Zhang, and G. Gong, “An metacognitive based logistics human resource modeling and optimal
scheduling,”》
(3)BRKGA(Biased Random-Key Genetic Algorithm)算法(有偏随机密钥遗传算法);
见论文:《A Biased Random-Key Genetic Algorithm With Variable Mutants To Solve a Vehicle Routing Problem》

三、结合深度学习或者强化学习

todo

四、其他可行方法

其他可行方法主要包括:
(1)向量化(vectorization);
(2)多线程(multithreading);
(3)并行计算(multiprocessing);
(4)带缓存的多级计算(cached computation)。

并行计算方面,可以使用Python中的joblib库:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVB-S系统发射端Matlab仿真及FPGA实现

DVB标准 Digital Video Broadcasting&#xff08;数字视频广播&#xff09;是一个完整的数字电视解决方案&#xff0c;其中包括DVB-C&#xff08;数字电视有线传输标准&#xff09;&#xff0c; DVB-T&#xff08;数字电视地面传输标准&#xff09;&#xff0c;DVB-S&#xff…

正确理解iOS中的同步锁

在 iOS 开发中&#xff0c;同步锁&#xff08;synchronized lock&#xff09;是一种用于管理多线程访问共享资源的机制&#xff0c;而不是某一种特定类型的锁。它涵盖了多种具体实现和技术&#xff0c;用于确保同一时间只有一个线程能够访问某个共享资源&#xff0c;从而避免数…

在 Linux 使用 cron 定时执行任务的注意事项

在 Linux 下想通过 cron 设置自动镜像备份文件&#xff0c;遇到很多挫折&#xff0c;最后成功&#xff0c;记录下几点注意事项。 尝试过程&#xff1a; 系统默认自带 cron&#xff0c;执行 crontab -e 添加开机启动任务。类似如下语句。 reboot rsync -a --delete /home/use…

使用`LD_PRELOAD`和`jemalloc`实现C/C++信号的内存堆栈信息收集

文章目录 0. 概要1. 编译jemalloc2. 编译钩子共享库liballoc_hook.so3. 使用LD_PRELOAD加载钩子库liballoc_hook.so测试3.1 设置环境变量3.2 使用LD_PRELOAD加载钩子库并运行程序3.3 发送SIGUSR1信号以触发堆栈信息打印3.4 使用jeprof解析heap堆栈信息文件 4. 示例程序example.…

详细说说机器学习在医疗领域的应用

机器学习在医疗领域的应用广泛而深入&#xff0c;为医疗行业带来了显著的变革。以下是机器学习在医疗领域的主要应用方面&#xff1a; 个性化治疗&#xff1a; 机器学习能够根据病人的个体差异和基因组信息&#xff0c;帮助医生制定个性化的治疗方案。通过分析大规模的基因组数…

探地雷达正演模拟,基于时域有限差分方法,一

声明&#xff1a;本博客中的公式均是在Word中使用AxMath写好后截图使用的&#xff0c;欢迎引用&#xff0c;但请标注来源。 本系列会有四篇博客&#xff1a; 第一篇内容&#xff1a; 1、基础知识掌握 2、Maxwell方法差分求解原理 第二篇内容&#xff1a; 1、基于C的TE波波…

docker——基础知识

简介 一、什么是虚拟化和容器化 ​ 实体计算机叫做物理机&#xff0c;又时也称为寄主机&#xff1b; ​ 虚拟化&#xff1a;将一台计算机虚拟化为多态逻辑计算机&#xff1b; ​ 容器化&#xff1a;一种虚拟化技术&#xff0c;操作系统的虚拟化&#xff1b;将用户空间软件实…

mongodb总概

一、mongodb概述 mongodb是最流行的nosql数据库&#xff0c;由C语言编写。其功能非常丰富&#xff0c;包括: 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;格式自由&#xff0c;数据格式不固定&#xff0c;生产环境下修改结构都可以不影响程序运行;强大的查询语句…

2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】

【例 2.3】判定 2000 — 2500 年中的每一年是否闰年&#xff0c;将结果输出。 润年的条件: 1. 能被 4 整除&#xff0c;但不能被 100 整除的年份&#xff1b; 2. 能被 100 整除&#xff0c;又能被 400 整除的年份&#xff1b; 设 y 为被检测的年份&#xff0c;则算法可表示如下…

Element-UI全面入门与实战技巧

本文详细介绍了Element-UI的安装、配置、组件使用、布局技巧、交互设计、表单处理、主题定制等内容&#xff0c;旨在帮助开发者快速掌握Element-UI&#xff0c;并能在实际项目中灵活应用。 文章目录 一、Element-UI概述与安装1.1 Element-UI简介1.2 环境搭建1.3 安装Element-UI…

C语言:定义和使用结构体变量

定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中&#xff0c;结…

Edge怎么关闭快捷键

Edge怎么关闭快捷键 在Edge浏览器中&#xff0c;你可以通过以下步骤关闭快捷键&#xff1a; 打开Edge浏览器&#xff0c;输入&#xff1a;edge://flags 并按下回车键。 在Flags页面中&#xff0c;搜索“快捷键”(Keyboard shortcuts)选项。 将“快捷键”选项的状态设置为“…

Python 基于鲁棒核迭代最近点算法的点云精配准[Robust_ICP算法]

点云配准鲁棒迭代最近点算法 一、概述1.1 定义1.2 算法步骤二、代码示例三、运行结果一、概述 1.1 定义 Robust_ICP(鲁棒迭代最近点算法):是一种改进的ICP(Iterative Closest Point)算法,用于处理3D点云配准问题,特别是在存在噪声、外点(不匹配点)或数据分布不均等复杂…

dos命令---根据端口查找进程

简介 在日常开发中&#xff0c;常常出现端口被占用的情况&#xff0c;导致程序运行报错&#xff0c;这时可以使用此命令查看哪个进程占用了端口 命令 netstat -ano | findstr 11434返回结果&#xff1a;

关于利用hashcat破解WiFi数据包的操作记录

准备数据包相关转换工具 ┌──(kali㉿kali)-[~/cap/3204] └─$ sudo apt-cache search hc | grep ^hc hcloud-cli - command-line interface for Hetzner Cloud hcxdumptool - Small tool to capture packets from wlan devices hcxkeys - Tools to generate plainmasterkey…

【简单介绍下DALL-E2,什么是DALL-E2?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【代码随想录算法训练营第37期 第三十二天 | LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II】

代码随想录算法训练营第37期 第三十二天 | LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II 一、122.买卖股票的最佳时机II 解题代码C&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for(int i 1; i &…

10.爬虫---XPath插件安装并解析爬取数据

10.XPath插件安装并解析爬取数据 1.XPath简介2.XPath helper安装3.XPath 常用规则4.实例引入4.1 //匹配所有节点4.2 / 或 // 匹配子节点或子孙节点4.3 ..或 parent::匹配父节点4.4 匹配属性4.5 text()文本获取4.6 属性获取4.7 属性多值匹配 1.XPath简介 XPath是一门在XML文档中…

46-3 护网溯源 - 溯源报告编写

格式 1. 基本情况︰钓鱼邮件情况介绍 在这部分,需要详细描述钓鱼邮件的基本情况,包括收到的邮件内容、寄件人信息、邮件附件或链接等。还需说明收到邮件的时间和频率。2. 行为分析 详细阐述攻击者的行为模式和攻击方式,包括攻击手段、使用的恶意工具或技术,以及可能的入侵…

Flutter旅游出行类APP常用的第三方库总汇

Flutter旅游出行类APP常用的第三方库总汇 旅游出行类APP为用户提供了探索世界、规划旅程和预订服务的便捷方式。Flutter作为一个流行的跨平台移动应用开发框架&#xff0c;为这类应用的开发提供了强大的支持。本文将汇总Flutter旅游出行类APP开发中常用的第三方库&#xff0c;…