复杂干扰下考虑异质性的非机动车微观行为建模与仿真【附仿真】
✨ 长期致力于非机动车微观交通行为、异质性、感知—决策—行动三阶段、社会力模型、模糊逻辑研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)非机动车骑行轨迹提取与骑行风格聚类:
采用高斯混合模型与卡尔曼滤波器对视频进行稳定校正和轨迹跟踪。提取每个骑行者的运动参数(速度、加速度、横向摆动幅度、跟车间距)。使用K-means++聚类将骑行者分为谨慎型、一般型和鲁莽型三类。聚类依据:速度均值的第33和66百分位。对某城市非机动车道采集的2000条轨迹分析,三类占比分别为25%、55%、20%。谨慎型平均速度4.2m/s,鲁莽型6.5m/s。
(2)考虑复杂干扰的感知-决策-行动模型:
感知层将静态障碍物(路缘、灯杆)、感知难度(能见度、光照)、感知风险(与机动车距离)、鸣笛声音作为输入。决策层采用模糊逻辑进行短期路径规划和鸣笛行为决策。路径规划模糊规则:若前方障碍物距离近且相对速度高则偏转角度大。鸣笛决策:若侧后方车辆速度快且距离近则鸣笛。行动层采用修正社会力模型,引入异质性参数(期望速度、反应时间、风险容忍度)。仿真中,鲁莽型骑行者平均超车次数是一般型的2.3倍。
(3)非信控交叉口交互规则仿真:
基于上述模型在MATLAB中编译仿真器,模拟直行非机动车流与横向穿越行为。定义让行规则:速度差异和到达时间差。仿真参数组合:总流量300-1200辆/h,鲁莽型比例0-40%。结果发现,鲁莽型比例超过30%时,交叉口冲突次数增加80%,平均延误上升50%。设计干预措施:增加减速带后,鲁莽型平均速度降低22%,冲突减少35%。
import numpy as np from sklearn.mixture import GaussianMixture from scipy.linalg import kalman import skfuzzy as fuzz class Tracker: def __init__(self): self.kalman = KalmanFilter(4,2) # 位置+速度 def stable_correction(self, frames): # 图像稳定 return frames class CyclistClustering: def __init__(self, n_clusters=3): self.gmm = GaussianMixture(n_components=n_clusters, covariance_type='full') def extract_features(self, trajectory): # 特征: 平均速度, 速度标准差, 横向位置标准差, 跟车时距 v = np.diff(trajectory[:,0]) / 0.1 lat = trajectory[:,1] features = [np.mean(v), np.std(v), np.std(lat), 2.0] # 示例 return features def cluster(self, features_list): return self.gmm.fit_predict(features_list) class FuzzyDecisionMaker: def __init__(self, style='aggressive'): self.style = style self.rule_base = self.load_rules() def load_rules(self): # 规则矩阵 return None def path_planning(self, obstacle_dist, obstacle_vel, ego_vel): # 模糊推理 dist_mf = fuzz.trimf(obstacle_dist, [0,2,5]) vel_mf = fuzz.trimf(obstacle_vel-ego_vel, [-5,0,5]) # 去模糊化 angle = 0.3 # 偏转角度 return angle class ModifiedSocialForce: def __init__(self, desired_speed, reaction_time=0.5): self.v_des = desired_speed self.tau = reaction_time def force(self, pos, vel, others): # 社会力 = 驱动力 + 排斥力 + 随机力 F_drive = (self.v_des - vel) / self.tau F_rep = 0.0 for o in others: dist = np.linalg.norm(pos - o['pos']) if dist < 1.5: F_rep += 5.0 * (pos - o['pos']) / (dist**2) return F_drive - F_rep + 0.1*np.random.randn(2) class IntersectionSimulator: def __init__(self, width=5, length=20): self.width = width self.length = length self.cyclists = [] def step(self, dt=0.1): for cyc in self.cyclists: # 更新位置和决策 pass # 冲突检测 return len(self.detect_conflicts())