NetLogo:如何让emps4海龟结合价格与距离选择最优商品?
NetLogo中emps4基于价格和距离选择最优商品的实现方案
核心思路
把商品价格和到卖家的距离整合为一个综合成本得分,得分越低代表商品越优。通过加权求和(或归一化加权)将二维信息转化为一维数值,直接排序即可快速选出最优的2种商品,无需复杂的列表操作。
步骤实现
1. 定义海龟品种与变量
先为emps3设置两种商品的价格变量,为emps4添加记录购买结果的变量:
breed [emps1 emp1] breed [emps2 emp2] breed [emps3 emp3] breed [emps4 emp4] emps3-own [good1-price good2-price] ; 存储emps3的两种商品定价 emps4-own [purchased-goods] ; 记录emps4最终购买的商品信息
2. 简单加权法(快速实现)
如果价格和距离的量级相近,直接用加权求和计算综合得分,权重可根据模拟需求调整(比如距离影响更大就提高距离的权重):
to go ask emps4 [ let all-goods [] ; 遍历所有emps3,收集每种商品的类型、卖家、综合得分 ask emps3 [ let dist distance myself ; 计算两种商品的综合得分:价格 + 距离*权重(这里权重设为0.1,可自行调整) let good1-score good1-price + dist * 0.1 let good2-score good2-price + dist * 0.1 set all-goods lput (list "good1" self good1-score) all-goods set all-goods lput (list "good2" self good2-score) all-goods ] ; 按综合得分从小到大排序(得分越低越优) set all-goods sort-by [a b -> last a < last b] all-goods ; 选取得分最低的前2种商品 let top-two sublist all-goods 0 2 set purchased-goods top-two ; 打印结果(可选) print (word "Emps4 " self " 购买的最优商品:" top-two) ] end
3. 归一化加权法(消除量纲影响)
如果价格和距离的量级差异较大(比如价格在100以内,距离在1000以上),直接加权会导致某一因素主导结果,此时可以先对价格和距离做归一化处理,再加权:
to go ask emps4 [ ; 先收集所有商品的原始信息(类型、卖家、价格、距离) let all-goods-pre [] ask emps3 [ let dist distance myself set all-goods-pre lput (list "good1" self good1-price dist) all-goods-pre set all-goods-pre lput (list "good2" self good2-price dist) all-goods-pre ] ; 计算价格和距离的归一化参数(最大值、最小值) let all-prices map item 2 all-goods-pre let price-range (max all-prices) - (min all-prices) let all-dists map item 3 all-goods-pre let dist-range (max all-dists) - (min all-dists) ; 计算每个商品的归一化得分(权重可调整,这里价格占60%,距离占40%) let all-goods map [g -> let norm-price ifelse-value (price-range > 0) [ (item 2 g - min all-prices) / price-range ] [ 0 ] let norm-dist ifelse-value (dist-range > 0) [ (item 3 g - min all-dists) / dist-range ] [ 0 ] let score (norm-price * 0.6) + (norm-dist * 0.4) list (item 0 g) (item 1 g) score ] all-goods-pre ; 排序并选取前2种最优商品 set all-goods sort-by [a b -> last a < last b] all-goods let top-two sublist all-goods 0 2 set purchased-goods top-two print (word "Emps4 " self " 购买的最优商品:" top-two) ] end
关键说明
- 权重调整:可以根据模拟需求修改加权系数,比如更看重价格就提高价格的权重,更看重距离就提高距离的权重。
- 灵活性:代码支持emps4从不同emps3购买商品,也允许从同一只emps3购买两种商品,完全符合需求。
- 低编程成本:通过将二维指标转化为一维得分,避免了复杂的多条件排序逻辑,代码简洁易维护。
内容的提问来源于stack exchange,提问作者Ana Coelho
相关产品推荐
相关产品推荐

