综合管廊施工这行,凡是下过现场的都清楚,风险点大多藏在你眼睛看不到的地方——十几米深的基坑边坡、封闭管廊内部的通风死角、和既有市政管线交叉的顶管断面。要把这些风险量化到能给班组交底、能给监理和业主签字确认的程度,光靠"我感觉这段有点悬"肯定是不够的。这些年工程上比较主流的一套做法,是拿作业条件危险性评价法也就是LEC法,对每个风险点从可能性、暴露频率、后果严重度三个维度打分,算出D值再定级。可真正用过的人都知道,LEC落地时有三道绕不过去的坎:专家打分太主观、LEC本身是精确数表达不了模糊判断、等级边界又是一刀切。我这篇要聊的,就是把三角模糊数和云模型这两样东西嵌进LEC里,再配合matlab把整条评估链路跑通的一套完整方案。说白了,基于三角模糊LEC云模型的综合管廊施工安全风险评估研究,核心目标就是让评估结论更贴近现场的真实感受,而不是专家拍脑袋拍出来一个看着很精确、实际上站不住脚的数字,顺带附上能直接复现的matlab代码。
1. 传统LEC为什么在管廊施工里不够用
1.1 LEC法的适用场景和它天生的短板
LEC这套方法能流行几十年,不是没有道理的。它的公式简单到一句话能说清:D = L × E × C,其中L代表事故或危险事件发生的可能性,E代表人员暴露在危险环境中的频繁程度,C代表一旦发生事故可能造成的后果严重度。三个因子各自按一套经典标度取值,L从0.1到10,E从0.5到10,C从1到100,乘出来的D值再对照一个分级表,比如D大于320算极其危险、160到320算高度危险、70到160算显著危险、20到70算一般危险、小于20算稍有危险。优点是直观、可操作、有明确的出处,交底的时候工人也能听懂。我做过几个市政项目,监理和总包基本都认这套。
但它的问题从第一天用就暴露了。首先是打分环节,L、E、C本质上都是专家凭经验给的判断,老师傅说"这东西可能性大概3",可他心里想的其实是"可能2到4之间,取个中间值3吧"。你把这个3写进表里,后面的乘法就把这个不确定性彻底抹平了,最后算出来的D值看起来精确到小数点后两位,实际上从源头就已经蒙上了一层模糊。其次是边界问题,70和71这两个D值,按规则一个算一般危险一个算显著危险,可就差一分,现场的危险程度真的有那么大台阶吗?这种硬阈值在实际评估里经常导致"踩线"争议,专家吵半天就为了这1分该算哪一级。管廊施工的风险恰恰又高度依赖经验判断、边界又天然模糊,这两个短板在这里被放得特别大。
1.2 三角模糊数补上"专家说不清"这一环
三角模糊数就是用来装这种"说不清"的。一个三角模糊数用三个参数表示,记作A=(a,b,c),其中a是悲观值,b是最可能值,c是乐观值,且满足a≤b≤c。它的隶属度函数是一条三角形,在b处取到1,向两边线性衰减到0。为什么是三个而不是一个或者两个?因为专家做判断时的思维结构本来就是三段的:最坏能坏到哪、最可能是什么情况、最好也就这样。你让老师傅对基坑支护失稳的可能性打分,他嘴上说"大概3",但你追问一句,他往往会补上"保守点至少2、乐观了说4"。这三个数就是天然的三角模糊数(2,3,4)。
相比单一精确数,三角模糊数最大的好处是保留了专家判断的"带宽"。带宽越宽,说明这个专家越没把握;带宽越窄,说明他经验足、判断稳。这个信息在传统LEC里是被完全丢弃的。而且三角模糊数有一整套成熟的运算规则,加法、数乘、加权平均都能闭式算,聚合多位专家意见的时候也不会引入额外的失真。把它塞进LEC的L、E、C三个维度里,等于给每个专家打分装了一个"置信区间",后面再谈综合评估就有了分寸感。这一步是整个方法能不能立得住的地基。
1.3 云模型把等级边界的"一刀切"变成渐变
云模型解决的是另一头的问题。它是用期望Ex、熵En、超熵He三个数字去描述一个定性概念——注意,这里描述的不是一个数,而是一个"概念"。Ex是概念的中心值,En刻画这个概念的模糊程度也就是取值范围,He刻画云滴的离散程度也就是随机性。用正向云发生器一跑,一个定性概念就会在论域上散成一片密密麻麻的云滴,中心密、边缘稀,非常直观。
拿风险等级来说,"显著危险"这个概念传统上被定义成D在70到160之间,边界是死的。可你一旦用云模型表示它,中心大概在115附近,En大约15,那么一个D值等于70的评估对象,它对"显著危险"的隶属度可能只有零点几,对"一般危险"的隶属度也不高,它是处在两个云的过渡带里,隶属度是渐变的。这就把"71和70差一级"的荒谬问题化解了。管廊施工的风险等级划分本身就带着人为约定的成分,用云模型表示,等于承认边界附近确实存在"说不清到底算哪级"的区域,这比硬划一条线要诚实得多,也更符合工程实际。
2. 整体建模方案拆解:从专家打分到风险等级的四步链路
2.1 风险评估指标体系怎么搭才贴合管廊施工
方法再好,指标搭错了也是白搭。综合管廊施工和普通房建、普通市政差别很大,它的风险是复合型的。我一般从几个维度切:基坑工程是头号风险源,深基坑支护失稳、地下水突涌、周边地表沉降几乎每个项目都要盯;结构工程里模板支架坍塌、大体量混凝土浇筑的侧压力也是老问题;管廊特有的有限空间作业是重灾区,廊内通风不足导致中毒窒息、缺氧这类事故一旦发生就是群死群伤;再有顶管和盾构推进段的地表隆起沉降、既有管线的破坏;加上通用性的高处坠落、起重吊装物体打击、临时用电触电这些。
我建议指标体系别贪多,一层一层的往下拆,最终落到可以直接打分的底层因素上,一般控制在一级指标5到6类、底层因素8到12个比较合适。因素太少覆盖面不够,太多专家打分质量直线下降,到了七八十个因素,专家基本就是随手勾了,那模糊数带宽反而全是噪声。我这次演示取9个底层因素:深基坑支护失稳、有限空间中毒窒息、顶管盾构段地表沉降、高处坠落、起重吊装伤害、临时用电触电、模板支架坍塌、地下水突涌、周边既有管线破坏。这个粒度既能覆盖主要风险,又不至于让专家打崩溃。
2.2 四步链路:打分、聚合、转云、定级
整套方法的骨架我拆成四步。第一步,专家对每个因素的L、E、C分别用语言变量打分,每个语言变量对应一个预设的三角模糊数,这一步把定性判断变成模糊数。第二步,把多位专家的三角模糊数按权重加权平均,聚合出每个因素在每个维度上的综合三角模糊数,再近似算出D值的三角模糊数,这样每个因素就有了一个带带宽的危险值。第三步,把每个因素的D值三角模糊数转换成云参数,也就是从(a,b,c)映射到Ex、En、He,这样每个因素就从"模糊数"升级成了"云"。第四步,按因素权重把各因素的云合成一个总的综合云,再拿这个综合云去和五个标准等级云比对相似度,相似度最高的那个等级就是最终的风险等级。
这四步是一条链,每一环都对应一个具体的痛点。第一步和第二步对付的是专家主观性和个体差异,第三步是为云模型做准备,第四步对付的是等级边界模糊。整条链路既保留了LEC"三个维度相乘"的核心思想,又把模糊性和随机性这两个在工程判断里躲不开的东西显式地建了模。相比直接上神经网络、支持向量机那类需要大样本的黑箱模型,这套方法在管廊施工这种样本量小、强依赖专家经验的场景里反而更实用,因为它的每一步都能解释清楚,评审专家问起来你能说出为什么。
2.3 关键标度和参数的选取逻辑
有两个地方特别容易出问题,一个是语言变量到三角模糊数的映射表,一个是权重的确定。映射表的选择直接影响结果,我不建议自己凭空造,最好参照经典LEC标度去反推。比如L维度,经典LEC里"完全可能"对应10、"相当可能"对应6、"可能但不经常"对应3、"可能性小"对应1,那么我给它配的三角模糊数就围绕这些中心值展开,取(8,10,10)、(4,6,8)、(2,3,4)、(0.5,1,2)这样,悲观值和乐观值往两边拉一点,幅度控制在±30%到50%之间。拉太开,模糊性过强结果会失真;拉太窄,跟直接用精确数没区别。
权重这块,可以用层次分析法算,也可以请专家直接给区间。我倾向于用AHP先算一遍主客观结合的权重,再用它来做云的加权合成。要注意权重必须归一化,五个八九个因素加起来等于1。还有一个隐藏的坑是量大不同的因素权重不能一刀切,比如地质灾害类的因素虽然权重不一定最高,但一旦发生后果很重,这时候可以在C的标度上把它拉高,而不是硬去调权重。这些取舍逻辑,我在第四节代码里会对照着再讲一遍,避免只看公式不知道为什么要这么配。
3. 三角模糊数与云模型的核心数学细节
3.1 三角模糊数的表示、运算与去模糊化
先明确记号。三角模糊数A=(a,b,c),隶属度函数写出来就是:当x在a到b之间时等于(x-a)/(b-a),当x在b到c之间时等于(c-x)/(c-b),其余为0。它有两个基本运算需要掌握:两个三角模糊数相加,结果还是三角模糊数,只是三个参数各自相加,也就是(a1,b1,c1)+(a2,b2,c2)=(a1+a2, b1+b2, c1+c2);用一个正数k去乘,则是(ka,kb,kc)。多位专家聚合用的加权平均也能保持三角模糊数的形式,这也是它比梯形模糊数更受欢迎的原因——运算封闭性好,不会越算越复杂。
去模糊化是把三角模糊数还原成一个清晰数的过程,这一步在计算D值的时候用得上。最简单的是重心法,直接取(a+2b+c)/4,或者更粗暴的(a+b+c)/3。前者给最可能值更高的权重,更符合专家判断的语义;后者计算更快。我个人在工程里倾向用(a+2b+c)/4,因为它强调了最可能值b的地位,而b恰恰是专家最有把握的那个数。也有用积分型重心法的,把一个三角形做二重积分求重心,算出来更精确,但工程意义不大,一般没必要。要注意的是,去模糊化只在需要最终清晰数的时候才做,中间过程能保持模糊数就保持,这样才不会把好不容易保留的模糊信息提前丢掉。
3.2 从三角模糊数到云参数的转换
这一步是整套方法里的关键衔接。云模型的正向发生器需要Ex、En、He三个参数,而我们手上是D值的三角模糊数(da,db,dc),怎么转?我的做法是:Ex取最可能值db,因为它是这个概念的中心;En取(dc-da)/6,这个6不是随便来的,它来自正态分布的3σ原则——三角模糊数的宽度大致对应不确定范围的6倍标准差,所以右端减左端再除以6就得到了合理的熵;He作为超熵,反映随机性,工程上一般取一个很小的常数,比如0.01,或者取En的5%到10%。
这里要提醒一句,三角模糊数的底边宽度和云的熵不是同一回事,前者是区间宽度,后者是标准差量纲,所以除以6这个操作本质上是一种经验对齐,不是严格等价的数学变换。但它在工程上很好用,因为两边都在描述"这个判断有多大不确定性",量级对得上。如果你发现某个因素的En算出来特别大,比如超过了Ex的一半,那说明专家意见分歧极大,这时候要么回去重新组织打分,要么就在报告里明确标注这个因素结论不稳,需要补充调研。转云之后,每个因素就同时携带了中心和带宽两层信息,比单纯的D值信息量大多了。
3.3 综合云合成与等级云构造
有了每个因素的云,下一步就是合成。综合云参数我用的是一种工程上常用的加权线性合成:Ex_c等于各因素Ex按权重的加权和,En_c等于各因素En的加权和,He_c同理。这里其实云模型的合成方式有讲究,严格来说有"虚拟云"的算法,比如把多个云并联或者串联,公式里会出现En平方和开根号这类形式。但在我这个项目里,因为各因素的D值量纲一致、权重之和为1,用简单的加权线性合成既稳定又好解释,评审的时候不容易被挑刺。
等级云就更好办了。把D值的讨论域切成五段,对应五个等级。取等级区间的中点做Ex,取区间宽度除以6做En,He取小常数。比如70到160这一段,中点115就是Ex,宽度90除以6等于15就是En。首尾两段没有自然边界,需要人为设定,比如最低一级取0到20,最高一级取320到400。这里有个小技巧,最高段的右边界设多少其实影响不大,因为管廊施工里超过400的D值基本已经进入"必须停工整改"的区间,评到这个等级后面的处置动作是一样的,设400还是设500对最终定级结果没影响。构造好等级云之后,用综合云去和这五个云逐一算相似度,相似度最高者胜出。
4. MATLAB全流程实现,代码可直接抄
4.1 专家打分表与三角模糊数聚合
先讲数据准备。我这边假设三位专家,对9个因素分别打L、E、C的等级,等级用1到6的序号表示,1代表最低一档。打分矩阵用三维数组存,第一维是因素、第二维是L/E/C三个维度、第三维是专家。下面这段代码可以直接跑,把等级序号映射成三角模糊数再做加权聚合。注意三角模糊数的映射表是按L、E、C三个维度分别定义的,因为三者的经典标度量纲不同,不能混用一张表。
% ===== 4.1 专家打分聚合 ===== % 3位专家对9个因素的[L,E,C]等级打分(1-6) S = cat(3, ... [5 4 4; 4 5 5; 3 3 4; 4 4 3; 3 3 3; 2 4 3; 4 5 4; 3 2 4; 3 3 3], ... % 专家1 [5 5 4; 4 4 5; 3 4 4; 4 3 3; 3 4 3; 3 4 3; 4 4 4; 2 3 4; 3 3 4], ... % 专家2 [4 5 5; 5 5 4; 4 3 4; 5 4 4; 3 3 3; 2 3 3; 5 5 4; 3 3 3; 2 3 3]); % 专家3 nF = size(S,1); nE = size(S,3); % 每个维度的语言变量到三角模糊数的映射表(6级) L_scale = [0.1 0.1 0.2; 0.2 0.3 0.5; 0.5 1 2; 2 3 4; 4 6 8; 8 10 10]; E_scale = [0.3 0.5 0.7; 0.5 1 1.5; 1.5 2 3; 3 4 5; 5 6 8; 8 10 10]; C_scale = [1 1 3; 1 3 5; 3 7 11; 11 15 25; 25 40 60; 60 100 100]; scales = {L_scale, E_scale, C_scale}; % 专家权重(可换成AHP算出的结果) wE = [0.4 0.35 0.25]; wE = wE / sum(wE); % 聚合:得到每个因素每个维度的综合三角模糊数 T_agg = zeros(nF, 3, 3); % 因素 x 维度 x 三角参数 for f = 1:nF for d = 1:3 tmp = zeros(1,3); for k = 1:nE lev = S(f, d, k); tmp = tmp + wE(k) * scales{d}(lev, :); end T_agg(f, d, :) = tmp; end end disp('因素1的L维度综合三角模糊数:'); disp(squeeze(T_agg(1,1,:))');这段跑完,T_agg(f,d,:)就是第f个因素在第d个维度上聚合后的三角模糊数。我第一次写的时候忘了给权重归一化,结果算出来D值整体偏大,后来加了wE = wE/sum(wE)才对上。这个细节很不起眼,但真能坑你半天。
4.2 LEC计算与因素云生成
接下来算每个因素的D值三角模糊数,并转成云。这里我要强调一个近似处理:严格的模糊数乘法结果是梯形而不是三角形,直接算会越算越乱。工程上普遍用参数对应相乘来近似,也就是D的三角参数等于L的a乘E的a乘C的a作为D的a,其他两个同理。这个近似在小带宽的时候误差很小,值得用。转云的时候Ex取D的最可能值,En取(D的c减D的a)除以6。代码接着上面的继续写。
% ===== 4.2 计算D值三角模糊数并转云 ===== D_T = zeros(nF, 3); % 每个因素的D值三角模糊数 clouds = zeros(nF, 3); % [Ex, En, He] He_const = 0.01; for f = 1:nF La = T_agg(f,1,1); Lb = T_agg(f,1,2); Lc = T_agg(f,1,3); Ea = T_agg(f,2,1); Eb = T_agg(f,2,2); Ec = T_agg(f,2,3); Ca = T_agg(f,3,1); Cb = T_agg(f,3,2); Cc = T_agg(f,3,3); % 参数对应相乘,得到D的三角模糊数(近似) D_T(f,:) = [La*Ea*Ca, Lb*Eb*Cb, Lc*Ec*Cc]; % 转云 clouds(f,1) = D_T(f,2); % Ex = 最可能值 clouds(f,2) = (D_T(f,3) - D_T(f,1)) / 6; % En = 宽度/6 clouds(f,3) = He_const; % He 取小常数 end % 打印前三个因素的D值和云参数 for f = 1:3 fprintf('因素%d: D=(%.1f, %.1f, %.1f), Ex=%.2f, En=%.2f\n', ... f, D_T(f,1), D_T(f,2), D_T(f,3), clouds(f,1), clouds(f,2)); end跑出来能在命令行看到每个因素的D值区间和它对应的Ex、En。到这一步其实已经能看出门道了:带宽大的因素,En就大,说明这个风险的不确定性高,后续合成的时候它的影响会摊得比较开。我实测过一个深基坑因素,专家分歧大,En算出来接近20,而一般因素也就三五,这个差异在最终云图上看得非常清楚。
4.3 综合云合成、相似度定级与云滴图
最后一步是合成综合云、跟五个等级云比相似度、画图。相似度我用两条期望曲线的相关系数来算,这个方法比算云滴重叠面积简单,代码短,结果也稳。等级云的区间按经典LEC分级来,最低段补一个[0,20],最高段补到[320,400]。
% ===== 4.3 综合云合成与等级判定 ===== % 9个因素对整体安全的权重(归一化,可用AHP替换) w = [0.18 0.16 0.12 0.14 0.10 0.08 0.09 0.07 0.06]; w = w / sum(w); % 加权线性合成综合云 Ex_c = w * clouds(:,1); En_c = w * clouds(:,2); He_c = w * clouds(:,3); fprintf('综合云参数: Ex=%.2f, En=%.2f, He=%.3f\n', Ex_c, En_c, He_c); % 构造5个等级云 lv_range = [0 20; 20 70; 70 160; 160 320; 320 400]; lv_name = {'稍有危险','一般危险','显著危险','高度危险','极其危险'}; Ex_l = mean(lv_range, 2); En_l = (lv_range(:,2) - lv_range(:,1)) / 6; He_l = He_const * ones(5,1); % 用期望曲线相关系数算相似度 x = linspace(0, 420, 2000)'; y_c = exp(-(x - Ex_c).^2 ./ (2 * En_c^2)); sim = zeros(5,1); for i = 1:5 y_l = exp(-(x - Ex_l(i)).^2 ./ (2 * En_l(i)^2)); R = corrcoef(y_c, y_l); sim(i) = R(1,2); end [~, best] = max(sim); fprintf('最终风险等级: %s (相似度=%.4f)\n', lv_name{best}, sim(best)); % 画综合云和等级云对照图 figure('Color','w'); hold on; for i = 1:5 yy = exp(-(x - Ex_l(i)).^2 ./ (2 * En_l(i)^2)); plot(x, yy, '--', 'LineWidth', 1); end plot(x, y_c, 'k-', 'LineWidth', 2); xlabel('D值'); ylabel('隶属度'); legend([lv_name, {'综合评估'}], 'Location','best'); title('综合管廊施工安全风险云图'); grid on;云滴散点图用正向云发生器再补一段就行,逻辑是先生成随机化熵En_n = En + He*randn,再生成云滴Ex + En_n*randn,隶属度按高斯公式算。这里我把正向发生器的实现代码也写出来,方便直接出那种一大片云滴的经典图:
function [xd, yd] = fwd_cloud(Ex, En, He, n) En_n = En + He * randn(n,1); xd = Ex + En_n .* randn(n,1); yd = exp(-(xd - Ex).^2 ./ (2 * En_n.^2)); end主程序里调用[xd,yd]=fwd_cloud(Ex_c, En_c, He_c, 5000)就能散出综合云的云滴。整套代码不需要任何特殊工具箱,R2016b以上的matlab都能跑,因为用到了数组隐式扩展。网上有些人纠结matlab 2026b、2025那些版本的兼容性,其实这套代码连统计工具箱都不用,corrcoef是内置的,正版授权或者常规安装的matlab装好就能直接执行,省心。
5. 实操中踩过的坑和排查清单
5.1 打分冲突、权重异常、结果突变怎么查
最常见的翻车是专家打分严重冲突。三位专家对一个因素的可能性,一个给5一个给2,聚合出来的带宽(c-a)特别大,转成云之后En巨大,这个因素在云图上就是一团散得没边的雾,跟谁比相似度都很低。遇到这种情况别硬算,先回去看是谁打的分跟别人差这么远,是不是他对这个风险点有特殊的现场认知,问清楚再决定是保留还是重打。我一般会设一个阈值,如果某个因素的En超过它Ex的60%,就标红预警,提示需要复核。这不是代码能自动解决的,得靠人。
权重异常也常遇到。如果权重没归一化,综合云的Ex会整体偏移,最后定级偏高一到两个档。还有一种隐蔽的情况,权重加起来是1,但某个因素权重过大,比如超过0.3,那综合云基本就被它一个人带偏了,其他因素再高也拉不动。这种情况要么是AHP矩阵一致性没通过,要么是专家对权重理解有偏差。我建议每次算完都打印一下权重向量,人工扫一眼有没有异常大的值,一眼就能看出来。结果突变则多半是等级边界附近,综合云Ex落在两个等级云交叠区,相似度前两名很接近,这时候别只报第一名,把前两名的相似度都列出来,让决策者知道这处在过渡带,需要结合现场实际再判断。
5.2 量纲、参数、出图的避坑清单
下面这张表是我整理的高频坑,做这个课题的同学照着核对一遍能省不少事。
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| D值整体偏大 | L/E/C映射表量纲没分开定义 | 三个维度各用一张标度表,别共用 |
| 综合云En异常大 | 某因素专家意见分歧过大 | 检查该因素打分,必要时重新打分 |
| 相似度全部很低 | 综合云Ex离所有等级云都远 | 检查权重是否归一化、论域是否合理 |
| 云滴图散得看不出形状 | He取太大 | He取0.01或En的5%左右 |
| 定级结果在边界反复横跳 | 综合云落在两等级交叠区 | 同时报告前两名相似度,人工复核 |
| 代码报错维度不匹配 | 权重向量方向不对 | 权重转成行向量用w*x,或列向量用w'*x |
出图这块还有个细节,matlab默认的legend多曲线混在一起会很乱,建议把等级云用虚线、综合云用粗实线,颜色错开,评审的时候一眼能分清哪个是哪个。另外论域范围别设得太小,如果综合云Ex接近420就会被截断,图会很难看,把linspace的上限留够余量。
注意:三角模糊数转云时