plain python两两循环比较算法

本文介绍了一种基于代码相似度评估的聚类算法,通过定义代码元素间的相似度,将具有相似特征的代码片段进行聚类,形成代码簇。此方法有助于代码管理和维护,提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

測試代碼

import numpy as np

lst = np.arange(1500)
tmp = list(lst[:5])
print(tmp)

[0, 1, 2, 3, 4]

for i in tmp[::-1]:   
    tmp.pop()
    print(i)

4
3
2
1
0

%time
dic = {}
def make_dic(p,center):
#     if tar in dic:
#         dic[tar].append(e)
#     else:
#         dic[tar] = [e]
    if center in dic:
        ele = dic[center]
        del dic[center]
        dic[p] =  ele + [center]
    else:
        dic[p] = [center]
    
        
def simi(num1,num2):
    if ((num1 - num2) <= 100) and ((num1 - num2) >= -100):
        return True
    else:
        return False

def main(lst):
    for i in range(len(lst)-1,-1,-1):
        center = lst[i]
        for p in lst[:i]:
            if simi(p,center):
                make_dic(p,center)
                break
    print(dic)
    
main(lst)

CPU times: user 3 µs, sys: 1 µs, total: 4 µs
Wall time: 7.87 µs
{0: [1401, 1301, 1201, 1101, 1001, 901, 801, 701, 601, 501, 401, 301, 201, 101, 1]}

實際運行代碼

import json
from tqdm import tqdm
import pandas as pd
from nlutools import tools as nlu


def maintain_dic(p, center):
    """
    dic = {"b":["c"]}

    p="a", center="b"

    dic = {"a":["b","c"]}
    """
    if center in dic:
        ele = dic[center]
        del dic[center]
        dic[p] = [center] + ele
    else:
        dic[p] = [center]


def simi(a, b):
    try:
        score = nlu.simiscore(a, b, type='tencent')
    except:
        score = 0

    if score >= 0.8:
        print(a, b, score)
        line = a + ',' + b + ',' + str(score) + '\n'
        fout_tmp.write(line)
        return True
    else:
        return False


def my_cluster(lst):
    for i in tqdm(range(len(lst)-1, -1, -1)):
        center = lst[i]
        for p in lst[:i]:
            if simi(p, center):
                maintain_dic(p, center)
                break
    return dic


if __name__ == "__main__":
    dic = {}
    fout_tmp = open("concat_tmp_all.csv", mode="w", encoding="utf8")
    fout = open("concat_result_all.json", mode="w", encoding="utf8")

    df = pd.read_csv("to_merge_all.tsv", sep="\t")
    entity_lst = df['entity'].to_list()

    re = my_cluster(entity_lst)
    fout.write(json.dumps(re))

    fout_tmp.close()
    fout.close()

dic:
{‘塑胶模具’: [‘五金模具’],
‘网络-局域网’: [‘无线局域网’, ‘无线网络’],
‘污泥处理’: [‘污水厂’],
‘体育中心’: [‘文体中心’],
‘市场策划’: [‘文案策划’],
‘网络营销’: [‘微信营销’],
‘网页设计’: [‘网站设计’],
‘网站策划’: [‘网站建设’],
‘手机银行’: [‘网上银行’, ‘网上支付’],
‘网购’: [‘网上购物’],
‘网络安全’: [‘网络信息安全’],
‘投行’: [‘投资银行’],
‘投资’: [‘投资项目’],
‘收购并购’: [‘收购兼并’],
‘通信’: [‘通讯’],
‘调度平台’: [‘调度系统’],
‘诉讼’: [‘诉讼案件’],
‘税局业务’: [‘税务业务’],
‘水泵项目’: [‘水利项目’],
‘汽轮机’: [‘水轮发电机’],
‘数据营销’: [‘数字营销’, ‘整合营销’],
‘数据管理系统’: [‘数字管理系统’],
‘数据分析’: [‘数据统计分析’],
‘数据服务’: [‘数据服务平台’],
‘数据采集’: [‘数据处理’, ‘数据管理’],
‘石油管道’: [‘输油管道’],
‘票务系统’: [‘售票系统’],
‘售楼处’: [‘售楼中心’],
‘融资租赁’: [‘融资租赁业务’, ‘租赁业务’],
‘示范项目’: [‘试点项目’],
‘施工’: [‘施工现场’],
‘社保审计业务’: [‘审计业务’],
‘社交平台’: [‘社交网络’],
‘商业地产’: [‘商业物业’],
‘侵权案件’: [‘商标侵权案件’],
‘融资’: [‘融资计划’],
‘品牌策划’: [‘全案策划’]}

### 标准节约里程算法的流程图 标准节约里程算法(Clarke-Wright Savings Algorithm)是一种经典的优化方法,用于解决车辆路径问题(CVRP),其核心思想是通过计算每两个客户节点之间因合并路径而节省的距离来逐步构建最优路径。以下是该算法的标准流程描述及其对应的伪代码实现。 #### 算法主要步骤 1. **初始化阶段** 计算所有可能的两两客户节点间的节约值 $ S_{ij} = D_i + D_j - D_{ij} $,其中 $ D_i $ 和 $ D_j $ 是配送中心到客户 $ i $ 和 $ j $ 的距离,$ D_{ij} $ 是客户 $ i $ 到客户 $ j $ 的直接距离[^1]。将这些节约值按降序排列形成节约表。 2. **初始路径创建** 创建一组单独访问客户的简单路径,即每个客户对应一条独立路径,形如 [Depot -> Customer_i -> Depot]。 3. **路径合并过程** 遍历节约表中的每一项,尝试将当前节约值所涉及的两条路径进行合并。具体操作包括检查路径合并后的可行性条件(如容量限制、时间窗等)。如果可行,则更新路径集合;否则跳过该项并继续处理下一节约值[^2]。 4. **终止条件判断** 当遍历完成整个节约表或者无法再找到可合并的路径时,停止迭代,最终得到一系列满足约束条件的最佳路径组合。 --- #### 流程图说明 下面是标准节约里程算法的一个典型流程图表示: ```plaintext 开始 | v 输入数据:配送中心位置、客户需求量、各点间距离矩阵 | v 计算所有客户对之间的节约值S_ij,并按降序排序 | v 初始化每条路径为单一客户往返配送中心的形式 | v 循环直到节约列表为空或无更多可合并路径: |-> 取下一个最大节约值S_ij |-> 找到关联的两条路径R_a和R_b |-> 如果R_a和R_b可以合法连接(考虑容量/其他约束) |-> 合并路径R_a和R_b为新路径R_new |-> 更新剩余未分配路径集 <-否| 继续取下一个节约值 <-否| | v 输出最终路径方案及总行驶距离 | v 结束 ``` 此流程图清晰展示了从输入准备到路径生成的核心逻辑链条。 --- #### Python 实现示例 下面是一个简单的Python代码片段展示如何实现部分关键功能: ```python def calculate_savings(distance_matrix, depot_index): """计算节约值""" n = len(distance_matrix) savings_list = [] for i in range(n): for j in range(i+1, n): if i != depot_index and j != depot_index: save = distance_matrix[depot_index][i] + \ distance_matrix[depot_index][j] - \ distance_matrix[i][j] savings_list.append((save, i, j)) # 按节约值降序排序 savings_list.sort(reverse=True, key=lambda x: x[0]) return savings_list def merge_routes(routes, savings_entry, capacity_limit, demands): """尝试合并路径""" _, customer_i, customer_j = savings_entry # 查找包含customer_i和customer_j的路径 route_containing_i = None route_containing_j = None for r in routes: if r[-1] == customer_i: route_containing_i = r if r[0] == customer_j: route_containing_j = r if not (route_containing_i and route_containing_j) or \ route_containing_i is route_containing_j: return False combined_demand = sum(demands[node] for node in route_containing_i + route_containing_j[:-1]) if combined_demand > capacity_limit: return False # 合并路径 new_route = route_containing_i + route_containing_j[1:] routes.remove(route_containing_i) routes.remove(route_containing_j) routes.append(new_route) return True ``` --- #### 注意事项 - 节约值计算需确保仅针对有效客户节点对。 - 在实际应用中应加入额外约束验证机制以适应复杂场景需求[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值