如何在NetLogo中实现客户供应商一年期黑名单机制?
嘿,这个供应商轮换+短期黑名单的需求很实际,我来帮你拆解一下代码逻辑的设计思路,再给你个可运行的Python示例参考!
核心思路梳理
首先得明确几个关键规则,避免踩坑:
- 每个客户有独立的黑名单(不是全局拉黑,是客户自己不想合作的供应商)
- 黑名单有效期仅1年:比如第2年拉黑的供应商,第3年还不能选,第4年就可以重新考虑了
- 每年流程分两步:先评估当前供应商,不满意就换;然后清理过期黑名单,为下一年做准备
关键数据结构设计
我们需要两个核心类来封装客户和供应商的属性,还有黑名单的存储方式:
Supplier:存储供应商的基础信息(比如ID、评分,用于选择规则)Customer:存储客户ID、当前合作供应商、黑名单(用字典存「供应商ID: 拉黑年份」,方便判断是否过期)
完整代码示例
import random class Supplier: def __init__(self, supplier_id): self.id = supplier_id # 示例:可以扩展更多属性,比如服务评分、报价、交付时效等 self.service_rating = random.uniform(7.0, 9.5) # 随机初始化评分,模拟差异 class Customer: def __init__(self, customer_id): self.id = customer_id self.current_supplier = None # 黑名单格式:{供应商ID: 被拉黑的年份} self.blacklist = {} def evaluate_supplier(self, current_year): """自定义评估规则:返回True表示满意,False表示不满意""" # 示例规则:如果供应商评分低于7.5,或者15%概率随机不满意 if self.current_supplier.service_rating < 7.5 or random.random() < 0.15: return False return True def clean_expired_blacklist(self, current_year): """清理拉黑超过1年的供应商""" expired_suppliers = [sid for sid, blocked_year in self.blacklist.items() if current_year - blocked_year > 1] for sid in expired_suppliers: del self.blacklist[sid] def pick_new_supplier(self, all_suppliers, current_year): """从可用供应商中按规则选择新合作方""" # 先清理过期黑名单,确保可选范围正确 self.clean_expired_blacklist(current_year) # 过滤掉当前在黑名单里的供应商 available = [s for s in all_suppliers if s.id not in self.blacklist] # 自定义选择规则:这里选评分最高的,你可以换成轮询、随机或其他业务规则 available.sort(key=lambda x: x.service_rating, reverse=True) return available[0] def run_5year_simulation(): # 初始化3个供应商 suppliers = [Supplier(1), Supplier(2), Supplier(3)] # 初始化150个客户 customers = [Customer(i+1) for i in range(150)] # 初始分配:第0年给每个客户选第一个供应商 for cust in customers: cust.current_supplier = cust.pick_new_supplier(suppliers, current_year=0) # 运行5年模拟(第1到第5年) for year in range(1, 6): print(f"\n--- 第 {year} 年 供应商评估与轮换 ---") for cust in customers: if not cust.evaluate_supplier(year): # 不满意:拉黑当前供应商,选新的 cust.blacklist[cust.current_supplier.id] = year new_supplier = cust.pick_new_supplier(suppliers, year) print(f"客户{cust.id}: 更换供应商 {cust.current_supplier.id} → {new_supplier.id}") cust.current_supplier = new_supplier # 满意的话直接跳过,继续合作 # 输出最终统计结果 print("\n--- 5年模拟结束 供应商客户分布 ---") supplier_customer_count = {s.id: 0 for s in suppliers} for cust in customers: supplier_customer_count[cust.current_supplier.id] += 1 for sid, count in supplier_customer_count.items(): print(f"供应商{sid} 合作客户数: {count}") # 启动模拟 run_5year_simulation()
可扩展的关键点
- 评估规则:你可以把
evaluate_supplier函数换成真实的业务逻辑,比如结合客户的订单满意度、供应商的交付延迟率等 - 选择规则:
pick_new_supplier里的排序逻辑可以替换成轮询(比如上次选了1,这次选2)、随机选择,或者基于成本/距离的规则 - 数据持久化:如果需要保存每年的记录,可以把客户的年度供应商历史存在
Customer类的history列表里,方便后续分析 - 异常处理:比如极端情况下(虽然这里3个供应商不可能出现),如果所有供应商都在黑名单,可以加兜底逻辑随机选一个
内容的提问来源于stack exchange,提问作者Mahsa soltani
相关产品推荐
相关产品推荐

