# 基于聚类、贪心、模拟退火的分拣问题的研究

2022/7/14 23:20:34

本文主要是介绍# 基于聚类、贪心、模拟退火的分拣问题的研究,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

基于聚类、贪心、模拟退火的分拣问题的研究

问题1

1. 余弦相似性聚类算法

余弦相似性求邻近度的凝聚型层次聚类算法

凝聚层次聚类:凝聚的层次聚类是一种自底向上的策略。(分裂的层次聚类与凝聚的层次聚类相反)

所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇。另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并。

2. 聚类、距离衡量方法:

​ 相关方法介绍:https://blog.csdn.net/weixin_38233103/article/details/121902770

欧式距离

\[d_{12}=\sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^2} \]

曼哈顿距离

\[d_{12}=\sum_{k=1}^{n}|x_{1k}-x_{2k}| \]

切比雪夫距离:向量分量差值的绝对值的最大值。

余弦距离:两个向量 \(\alpha\)、\(\beta\) 的夹角余弦度量

\[cos(\theta)=\frac{\alpha\cdot\beta}{|\alpha||\beta|} \]

信息熵:基于信息熵加权的聚类集成算法——https://jns.nju.edu.cn/article/2021/0469-5097/0469-5097-2021-57-2-189.shtml

K-means

  1. 从数据集D中随机选择K个对象作为初始簇中心
  2. 将每个对象分配到与其最近的簇中心的簇中
  3. 重新计算簇的均值,使用新的均值作为当前簇的中心
  4. 重复步骤2、3,直到所有簇中的对象不再变化。

DBSCAN聚类:DBSCAN最终的聚类状态是,所有密度可达的和密度相连的被划分到一个簇。

3. Python聚类工具 scipy cluster

相关链接:https://blog.csdn.net/justdoithai/article/details/52852843

层次聚类 + k_means聚类:

# 导入相应的包
import scipy
import scipy.cluster.hierarchy as sch #层次聚类
from scipy.cluster.vq import vq, kmeans, whiten #矢量化聚类
import numpy as np
import matplotlib.pylab as plt

# 生成待聚类的数据点,这里生成了20个点,每个点4维:
points = np.random.randn(20, 4)
print(points)

# 1. 层次聚类________________________________________________________________________________________
# 生成点与点之间的距离矩阵,这里用的欧氏距离:
disMat = sch.distance.pdist(points, 'euclidean')
# 进行层次聚类:
Z = sch.linkage(disMat, method='average')
# 将层级聚类结果以树状图表示出来并保存为plot_dendrogram.png
P = sch.dendrogram(Z)
plt.savefig('plot_dendrogram.png')
# 根据linkage matrix Z得到聚类结果:
cluster = sch.fcluster(Z, t=1, criterion='inconsistent')
print("Original cluster by hierarchy clustering:\n", cluster)
# 1. 层次聚类________________________________________________________________________________________

# 2. k-means聚类_____________________________________________________________________________________
# 将原始数据做归一化处理
data = whiten(points)
# 使用kmeans函数进行聚类,输入第一维为数据,第二维为聚类个数k.
# 有些时候我们可能不知道最终究竟聚成多少类,一个办法是用层次聚类的结果进行初始化.当然也可以直接输入某个数值.
# k-means最后输出的结果其实是两维的,第一维是聚类中心,第二维是损失distortion,我们在这里只取第一维,所以最后有个[0]
centroid = kmeans(data, max(cluster))[0]
# 使用vq函数根据聚类中心对所有数据进行分类,vq的输出也是两维的,[0]表示的是所有数据的label
label = vq(data, centroid)[0]
print("Final clustering by k-means:\n", label)
# 2. k-means聚类_____________________________________________________________________________________

问题2

  • 预处理:将出现频率高的货品种类交换到矩阵中心
  • 贪心算法
    1. 局部最优求解
    2. 逐列判断
    3. 交换货品摆放位置
    4. 循环上述操作直至没有最优解

问题3

结合MTSP(多旅行商问题)
目标函数:分拣用时——要求最短
采用模拟退火算法:交换法、倒置法、移位法
惩罚函数算法:均衡分配

MTSP问题:

MTSP:m个旅行商去旅游 n个城市,规定都必须从同一个出发点出发,而且返回原出发点,需要将所有的城市遍历完毕,每个城市只能游历一次,但是为了路径最短可以路过这个城市多次。这个就是多旅行商问题。是在TSP问题的基础上进行了扩展。

MTSP与TSP问题的区别:

  •  TSP指的是单个旅行商遍历一圈,将所有城市旅行一遍,
  •   MTSP指的是将城市群划分成M个组,每组采用TSP得到最短的旅行路线,所以问题的关键在于如何确定城市群的分组

『数学建模』TSP和MTSP问题:https://zhuanlan.zhihu.com/p/94884227
MTSP问题遗传算法解决及其代码与案例:https://blog.csdn.net/weixin_42141390/article/details/103787788
TSP/MTSP问题智能算法原理:https://zhuanlan.zhihu.com/p/383035070



这篇关于# 基于聚类、贪心、模拟退火的分拣问题的研究的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程