# 基于聚类、贪心、模拟退火的分拣问题的研究
作者:互联网
基于聚类、贪心、模拟退火的分拣问题的研究
问题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:
- 从数据集D中随机选择K个对象作为初始簇中心
- 将每个对象分配到与其最近的簇中心的簇中
- 重新计算簇的均值,使用新的均值作为当前簇的中心
- 重复步骤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
- 预处理:将出现频率高的货品种类交换到矩阵中心
- 贪心算法
- 局部最优求解
- 逐列判断
- 交换货品摆放位置
- 循环上述操作直至没有最优解
问题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
标签:分拣,层次,means,MTSP,cluster,模拟退火,聚类,TSP 来源: https://www.cnblogs.com/litecdows/p/16479379.html