Python遍历所有点寻找路径(类似于深度优先)

       最近在跟着一个老师做一个关于聚类的研究,中途需要写一个算法,类似于深度优先的方式,需遍历出每个点的可形成路径的列表,结束条件是每个点对应的可形成路径的列表的长度为0,即其为终点,最终写出了以下代码。

​
def DFS(g, num, path, ctrp):  # 传入新的能够产生路径的点的矩阵,无出度的点
    path.append(num)  # 将第一个点加入路径列表
    if len(g[num]) == 0:  # 如果该点没有下一个邻接点
        ctrp.extend(path)  # 用extend函数,将路径添加进来
        return  # 返回到else中的DFS
    else:
        for i in range(0, len(g[num])):  # 遍历该点的所有邻接点
            flag = g[num]  # 该点的邻接点列表
            num1 = flag[i]  # 遍历每一个邻接点
            DFS(g, num1, path, ctrp)  # 调用DFS,判断是否为最终点
            path.pop()  # 删除已经遍历完其所有邻接点的点
tp = []
ctrp = []  # 每个簇心下的集合 cluster center reverse path
for i in range(0, len(Maxquality_list)):
    path = []  # 某一条路径
    DFS(new_able_create_path, Maxquality_list[i], path, ctrp)  
    # 传入新的能够产生路径的点的矩阵,无出度的点
    tp.append(ctrp)  # 将此次簇心下的路径添加进总路径中
    ctrp = []  # 此次簇心路径清空,便于下次记录。

为了方便理解,请看例子:

   able_create_path={0: [2], 1: [3], 2: [3], 3: [], 4: [0], 5: [2], 6: [0], 7: [1], 8: [10], 9: [8], 10: [12],                                       11: [8], 12: [], 13: [9], 14: [12]}

由于键0在4,6的值列表中出现过,故将所有键都如此整理得到下面:

    new_able_create_path={0: [4, 6], 1: [7], 2: [0, 5], 3: [1, 2], 4: [], 5: [], 6: [], 7: [], 8: [9, 11], 9:                                        [13], 10: [8], 11: [], 12: [10, 14], 13: [], 14: []}

    Maxquality_list=[3, 12]  #即 able_create_path中值长度为0的键(每条路径的终点)

调用DFS的时候,传入一个ctrp,作用:在每次将ctrp添加进tp时,避免tp跟着一起改变(清空)

代码结果:

     tp=[[3, 1, 7, 3, 2, 0, 4, 3, 2, 0, 6, 3, 2, 5], [12, 10, 8, 9, 13, 12, 10, 8, 11, 12, 14]]

经过整理(并将每一条路径单独提出):

      new_tp=[[3, 1, 7], [3, 2, 0, 4], [3, 2, 0, 6], [3, 2, 5], [12, 10, 8, 9, 13], [12, 10, 8, 11], [12, 14]]

整理代码:

def new_total_path(tp):
    new_tp = []  # 一个新的簇心总路径列表
    for n in range(0, len(tp)):  # 遍历每个簇心的所有路径
        cluster_list = []  # 建立一个新的列表 存储当前簇心在其路径列表里的位置
        for i in range(0, len(tp[n])):  # 遍历当前簇心路径下的所有点
            if tp[n][i] == tp[n][0]:  # 判断该点与簇心序号是否相同
                cluster_list.append(i)  # 如果相同,则加入存储簇心位置的列表
        for j in range(0, len(cluster_list) - 1):  # 遍历每一个簇心的位置
            x = cluster_list[j]  # 第一个空格的位置
            y = cluster_list[j + 1]  # 下一个空格的位置
            new_tp.append(tp[n][x:y])  
            # 在当前簇心路径列表切取两个簇心间的点,包括第一个簇心
        b = cluster_list[len(cluster_list) - 1]
        new_tp.append(tp[n][b + 1:])  # 添加最后一个簇心以及簇心后的点
    return new_tp

    如若在阅读过程中,遇到问题和错误,希望读者能在评论区指出,一起进步!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值