基于Python列表的供需唯一匹配模拟实现技术问询
供需唯一匹配的Python模拟实现
我来帮你完成这个一对一的供需匹配模拟实现~ 你的需求是让每个需求ID唯一对应一个未被使用的供给ID,同时每个供给ID只能被分配一次,下面是基于你给出的初始框架完善后的完整代码:
dmndId_w_freq = [['a',4,[1,2,3,4]],['b',6,[5,6,7,8,3,4]],['c',7,[6,5,7,9,8,3,4]],['d',8,[1,6,3,4,5,6,7,10]]] num_sims = 1 for sim_count in range(num_sims): # 初始化标记字典:记录需求是否已完成匹配 dmndID_used_flag = {} # 初始化标记字典:记录供给是否已被占用 splID_used_flag = {} # 存储最终的一对一匹配关系 dmndID_splId_one_match = {} # 遍历每个需求项 for dmnd_item in dmndId_w_freq: dmnd_id = dmnd_item[0] spl_candidates = dmnd_item[2] # 如果当前需求还未匹配 if dmnd_id not in dmndID_used_flag or not dmndID_used_flag[dmnd_id]: # 遍历该需求的可选供给列表,找第一个未被占用的供给 for spl_id in spl_candidates: if spl_id not in splID_used_flag or not splID_used_flag[spl_id]: # 完成匹配 dmndID_splId_one_match[dmnd_id] = spl_id # 标记需求已匹配,供给已占用 dmndID_used_flag[dmnd_id] = True splID_used_flag[spl_id] = True # 找到匹配后就跳出循环,不再继续检查后续供给 break # 打印本次模拟的匹配结果 print(f"模拟 {sim_count+1} 的匹配结果:") for dmnd, spl in dmndID_splId_one_match.items(): print(f"需求 {dmnd} -> 供给 {spl}")
代码关键逻辑说明
- 标记字典的作用:
dmndID_used_flag和splID_used_flag分别用来跟踪需求和供给的使用状态,确保不会重复匹配 - 匹配优先级:按照需求的遍历顺序,以及每个需求内部供给列表的顺序,优先分配靠前的未被占用供给
- 终止条件:每个需求找到第一个可用供给后立即停止遍历该需求的供给列表,保证效率
可选优化:基于频率调整匹配优先级
如果需要优先给频率高的需求分配供给,可以先对需求列表按频率降序排序,只需要在遍历前添加一行代码:
# 按需求频率降序排序,优先处理高频需求 dmndId_w_freq_sorted = sorted(dmndId_w_freq, key=lambda x: -x[1])
之后遍历dmndId_w_freq_sorted即可实现高频需求优先匹配的逻辑。
内容的提问来源于stack exchange,提问作者Alhpa Delta
相关产品推荐
相关产品推荐

