優(yōu)化實(shí)戰(zhàn):BP神經(jīng)網(wǎng)絡(luò)與遺傳算法)
簡(jiǎn)介一份聚焦礦山充填工藝優(yōu)化的學(xué)術(shù)PDF論文提出基于神經(jīng)網(wǎng)絡(luò)與遺傳算法的多目標(biāo)充填料漿配比優(yōu)化方法面向礦業(yè)工程、智能優(yōu)化及數(shù)據(jù)建模研究者。資源為單文件PDF大小2.29MB內(nèi)容為期刊全文系統(tǒng)闡述了以水泥、粉煤灰、尾砂質(zhì)量分?jǐn)?shù)為輸入充填體強(qiáng)度為輸出的BP神經(jīng)網(wǎng)絡(luò)建模過程并通過遺傳算法優(yōu)化網(wǎng)絡(luò)權(quán)值與閾值構(gòu)建GA_BP神經(jīng)網(wǎng)絡(luò)再結(jié)合成本計(jì)算函數(shù)實(shí)現(xiàn)多目標(biāo)尋優(yōu)。文中給出了3-9-1網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)、樣本歸一化處理、隱含層節(jié)點(diǎn)試湊法確定及誤差對(duì)比等關(guān)鍵細(xì)節(jié)并輸出具體優(yōu)化結(jié)果當(dāng)充填體抗壓強(qiáng)度為1.5 MPa時(shí)最優(yōu)配比為水泥8%、粉煤灰2.3%、尾砂66.3%最低成本29.3元/t。已有129人學(xué)習(xí)下載適合作為礦山充填配比優(yōu)化與機(jī)器學(xué)習(xí)應(yīng)用相結(jié)合的研究參考。1. 充填料漿配比一個(gè)讓工程師頭疼的“多目標(biāo)”問題某礦山充填站的技術(shù)員A同學(xué)曾跟我抱怨設(shè)計(jì)院給的灰砂比范圍是1:4到1:8質(zhì)量濃度從68%到74%粉煤灰摻量0到15%——理論上一共有上千種組合。每種配比都要做試塊、標(biāo)養(yǎng)28天、測(cè)強(qiáng)度、測(cè)坍落度一次試驗(yàn)周期就是一個(gè)多月。他試了二十多組配比強(qiáng)度達(dá)標(biāo)的成本高成本低的又堵管始終找不到一個(gè)“既能達(dá)標(biāo)又不燒錢”的配方。這其實(shí)就是典型的充填料漿配比多目標(biāo)優(yōu)化問題——強(qiáng)度、成本、流動(dòng)性互相牽制傳統(tǒng)試錯(cuò)法既慢又貴而且很難說清楚選出來的配比到底“優(yōu)”在哪里。用神經(jīng)網(wǎng)絡(luò)擬合料漿性能、再用遺傳算法做多目標(biāo)尋優(yōu)把找配比的周期從一個(gè)多月壓縮到幾天這正是這個(gè)標(biāo)題背后的核心價(jià)值。這篇文章直接面向充填采礦、礦山充填站的技術(shù)人員和做材料配比研究的從業(yè)者。如果你手里有歷史試驗(yàn)數(shù)據(jù)或者愿意補(bǔ)充做一批試驗(yàn)來建數(shù)據(jù)庫這條路就值得走。我們會(huì)先從問題建模講清楚“多目標(biāo)優(yōu)化到底在優(yōu)化什么”然后依次拆解BP神經(jīng)網(wǎng)絡(luò)怎么訓(xùn)練、遺傳算法怎么尋優(yōu)、兩者怎么銜接最后把Pareto前沿上的結(jié)果翻譯成可以做實(shí)驗(yàn)驗(yàn)證的配比方案。2. 把配比問題變成數(shù)學(xué)問題目標(biāo)、變量與約束2.1 三個(gè)目標(biāo)函數(shù)強(qiáng)度、成本、可泵性怎么量化充填料漿配比優(yōu)化優(yōu)化的不是單一指標(biāo)。最核心的三個(gè)目標(biāo)充填體強(qiáng)度、材料成本、料漿可泵性或流動(dòng)性。先說強(qiáng)度。井下采場(chǎng)充填體需要自立強(qiáng)度常見要求是28天單軸抗壓強(qiáng)度不低于1MPa某些暴露頂板場(chǎng)景要求3天內(nèi)達(dá)到0.5MPa以上。但強(qiáng)度不是越高越好強(qiáng)度高意味著膠凝材料用量大、成本高。成本目標(biāo)相對(duì)直接每立方米料漿的材料成本是所有組分單價(jià)的加總。這里有個(gè)實(shí)操細(xì)節(jié)很多優(yōu)化方案只算水泥和粉煤灰的成本忽略骨料和水因?yàn)楣橇贤遣蛇x廢石或山砂成本波動(dòng)小。但如果你用的是外購(gòu)骨料必須把骨料成本納入目標(biāo)函數(shù)否則優(yōu)化結(jié)果會(huì)嚴(yán)重失真。第三個(gè)目標(biāo)可泵性可以用坍落度或者坍落度損失來表示。充填料漿通過管路輸送到井下坍落度過小容易堵管坍落度過大則料漿離析、泌水率超標(biāo)。一般來說充填料漿的坍落度控制在18~22cm比較合適但具體數(shù)值要根據(jù)輸送距離和管徑調(diào)整。這三個(gè)目標(biāo)之間是矛盾的提高質(zhì)量濃度能增加強(qiáng)度但會(huì)降低流動(dòng)性增加水泥用量能提高強(qiáng)度但成本直線上升。數(shù)學(xué)上可以寫成min / max 形式的多目標(biāo)優(yōu)化問題決策變量是灰砂比、質(zhì)量濃度、粉煤灰摻量、外加劑摻量。約束條件包括強(qiáng)度下限R28 ≥ 1.0MPa、坍落度范圍18cm ≤ S ≤ 22cm、泌水率上限以及各組分摻量的工藝允許范圍。2.2 為什么用神經(jīng)網(wǎng)絡(luò)做代理模型力學(xué)試驗(yàn)太貴了現(xiàn)在的問題很現(xiàn)實(shí)要把強(qiáng)度、成本、坍落度寫進(jìn)遺傳算法的適應(yīng)度函數(shù)你首先得有“配比組合 → 性能指標(biāo)”的映射函數(shù)。能不能直接用回歸公式可以但那些公式往往是線性的、或者只考慮灰砂比和質(zhì)量濃度兩個(gè)變量在粉煤灰摻量、外加劑摻量變化時(shí)誤差極大。充填料漿強(qiáng)度受水化反應(yīng)、顆粒級(jí)配、孔隙率等非線性因素影響用傳統(tǒng)回歸很難描述。而神經(jīng)網(wǎng)絡(luò)剛好擅長(zhǎng)做這件事。BP神經(jīng)網(wǎng)絡(luò)是典型的黑匣子映射模型你在輸入端給一組配比參數(shù)灰砂比、質(zhì)量濃度、粉煤灰摻量輸出端得到預(yù)測(cè)的28天強(qiáng)度和坍落度。理論上三層BP網(wǎng)絡(luò)就能以任意精度逼近任何連續(xù)非線性函數(shù)工程上擬合這種材料性能數(shù)據(jù)足夠了。相比做幾百組力學(xué)試驗(yàn)訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)的時(shí)間成本幾乎可以忽略。2.3 為什么用遺傳算法而不是梯度下降或窮舉法配比優(yōu)化的目標(biāo)函數(shù)有一個(gè)麻煩它并不是解析表達(dá)式而是神經(jīng)網(wǎng)絡(luò)的輸出。如果你用梯度下降法需要目標(biāo)函數(shù)對(duì)決策變量可導(dǎo)——神經(jīng)網(wǎng)絡(luò)本身可導(dǎo)但強(qiáng)度和成本的加權(quán)組合可導(dǎo)性很差而且容易陷入局部最優(yōu)。窮舉法更不現(xiàn)實(shí)灰砂比、質(zhì)量濃度、粉煤灰摻量每個(gè)變量設(shè)5個(gè)水平就是125種組合每個(gè)組合還要重復(fù)做試驗(yàn)驗(yàn)證。遺傳算法的優(yōu)勢(shì)恰好在于不需要目標(biāo)函數(shù)可導(dǎo)只需要能計(jì)算適應(yīng)度全局搜索能力強(qiáng)不容易陷入局部最優(yōu)天然支持多目標(biāo)并行搜索。具體來說用帶精英保留策略的非支配排序遺傳算法NSGA-II它在每一代種群中通過非支配排序把解分成不同的Pareto前沿層再通過擁擠度距離保持解的多樣性。一代一代進(jìn)化后最終得到一組互不支配的配比方案——這就是Pareto前沿前沿上的每個(gè)點(diǎn)都代表一種“在強(qiáng)度、成本、流動(dòng)性之間做了不同取舍”的配比。3. 數(shù)據(jù)從哪來試驗(yàn)設(shè)計(jì)與BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練3.1 試驗(yàn)設(shè)計(jì)圍繞配比空間鋪樣本神經(jīng)網(wǎng)絡(luò)能學(xué)多好完全取決于數(shù)據(jù)。常見做法是先做一批均勻設(shè)計(jì)或正交設(shè)計(jì)的試驗(yàn)把配比空間的主要區(qū)域覆蓋到。以灰砂比、質(zhì)量濃度、粉煤灰摻量為例我一般推薦至少30~40組試驗(yàn)數(shù)據(jù)起步。每組記錄灰砂比比如1:4、1:5、1:6、1:8、質(zhì)量濃度68%~74%間隔1~2%、粉煤灰摻量0、5%、10%、15%、水泥用量、骨料用量、外加劑用量、28天實(shí)測(cè)強(qiáng)度、坍落度實(shí)測(cè)值。如果你有條件做正交試驗(yàn)L32、L64這種混合水平表很好用。3.2 BP神經(jīng)網(wǎng)絡(luò)構(gòu)建與訓(xùn)練的最小實(shí)現(xiàn)下面是基于Python和NumPy實(shí)現(xiàn)的一個(gè)三層BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練代碼輸入是配比參數(shù)輸出是28天強(qiáng)度和坍落度。這里為了可讀性用最精簡(jiǎn)的寫法展示核心邏輯——實(shí)際工程中你可以直接換用標(biāo)準(zhǔn)深度學(xué)習(xí)框架但數(shù)據(jù)流和訓(xùn)練流程是一致的。import numpy as np # 讀取數(shù)據(jù)X為配比參數(shù)(灰砂比, 質(zhì)量濃度, 粉煤灰摻量, 水泥用量)Y為[強(qiáng)度R28, 坍落度] def load_data(): data np.loadtxt(mix_data.csv, delimiter,, skiprows1) X, Y data[:, :4], data[:, 4:6] return X, Y # 歸一化神經(jīng)網(wǎng)絡(luò)對(duì)輸入尺度敏感必須歸一化到[0,1]區(qū)間 def normalize(X, Y): x_min, x_max X.min(0), X.max(0) y_min, y_max Y.min(0), Y.max(0) X_norm (X - x_min) / (x_max - x_min 1e-8) Y_norm (Y - y_min) / (y_max - y_min 1e-8) return X_norm, Y_norm, x_min, x_max, y_min, y_max # 三層BP網(wǎng)絡(luò)輸入層4節(jié)點(diǎn) - 隱藏層10節(jié)點(diǎn)(tanh) - 輸出層2節(jié)點(diǎn)(線性) def bp_network(X, Y, hidden_nodes10, lr0.01, epochs5000): np.random.seed(42) n_samples, n_input X.shape n_output Y.shape[1] # 權(quán)重和偏置初始化Xavier初始化防止梯度消失 W1 np.random.randn(n_input, hidden_nodes) * np.sqrt(2.0/n_input) b1 np.zeros((1, hidden_nodes)) W2 np.random.randn(hidden_nodes, n_output) * np.sqrt(2.0/hidden_nodes) b2 np.zeros((1, n_output)) for epoch in range(epochs): # 前向傳播 z1 np.dot(X, W1) b1 a1 np.tanh(z1) z2 np.dot(a1, W2) b2 a2 z2 # 輸出層線性激活 # 反向傳播 delta2 (a2 - Y) / n_samples delta1 np.dot(delta2, W2.T) * (1 - a1**2) W2 - lr * np.dot(a1.T, delta2) b2 - lr * np.sum(delta2, axis0, keepdimsTrue) W1 - lr * np.dot(X.T, delta1) b1 - lr * np.sum(delta1, axis0, keepdimsTrue) if epoch % 500 0: loss np.mean((a2 - Y)**2) print(fepoch {epoch}, loss: {loss:.6f}) return W1, b1, W2, b2 X, Y load_data() X_norm, Y_norm, x_min, x_max, y_min, y_max normalize(X, Y) # 用前80%樣本訓(xùn)練后20%樣本驗(yàn)證 split int(len(X) * 0.8) W1, b1, W2, b2 bp_network(X_norm[:split], Y_norm[:split])這段代碼里的關(guān)鍵參數(shù)我從經(jīng)驗(yàn)角度說明一下。隱藏層節(jié)點(diǎn)數(shù)設(shè)10個(gè)是起步值如果你的輸入變量增加到6個(gè)加入外加劑摻量、骨料級(jí)配隱藏層要相應(yīng)增加到15~20個(gè)。學(xué)習(xí)率0.01對(duì)tanh激活函數(shù)來說偏保守但穩(wěn)定如果loss曲線下降太慢可以試著調(diào)到0.05。訓(xùn)練輪次5000對(duì)應(yīng)小樣本量足夠但必須加早停策略——我這里的寫法只是固定輪數(shù)實(shí)際使用時(shí)建議每500輪在驗(yàn)證集上計(jì)算一次R2連續(xù)5次不提升就停止訓(xùn)練避免過擬合。另外輸出層用線性激活是刻意的強(qiáng)度預(yù)測(cè)值超出訓(xùn)練數(shù)據(jù)范圍時(shí)線性輸出還能給出一個(gè)“外推趨勢(shì)”而如果輸出層也加tanh或sigmoid預(yù)測(cè)值會(huì)被硬壓在[0,1]歸一化區(qū)間內(nèi)幾乎無法發(fā)現(xiàn)超出范圍的不合理配比。這段代碼中還有一個(gè)容易被忽略的地方歸一化的范圍。歸一化必須用訓(xùn)練集的min/max得到x_min等參數(shù)后保存下來等遺傳算法尋優(yōu)時(shí)每一組候選配比都要先減去這批min/max再送入網(wǎng)絡(luò)。不少人在這一步翻車直接用全局?jǐn)?shù)據(jù)的min/max做歸一化導(dǎo)致訓(xùn)練和預(yù)測(cè)時(shí)的數(shù)據(jù)分布不一致預(yù)測(cè)結(jié)果偏差極大。3.3 模型評(píng)估R2不到0.9別急著丟給遺傳算法訓(xùn)練完網(wǎng)絡(luò)別急著做優(yōu)化。先做評(píng)估用預(yù)留的20%驗(yàn)證集計(jì)算強(qiáng)度預(yù)測(cè)值和實(shí)測(cè)值的決定系數(shù)R2和均方根誤差RMSE。我的判斷標(biāo)準(zhǔn)是R28強(qiáng)度預(yù)測(cè)的R2必須大于0.9坍落度預(yù)測(cè)的R2大于0.85否則就回到數(shù)據(jù)側(cè)找問題。常見原因要么是樣本量太少少于25組要么是某個(gè)關(guān)鍵變量沒參與建?!热缌蠞{溫度對(duì)坍落度影響極大但試驗(yàn)記錄里沒有這個(gè)字段。如果R2不達(dá)標(biāo)先嘗試增加隱藏層節(jié)點(diǎn)數(shù)或加入L2正則化不要盲目加深網(wǎng)絡(luò)。配比數(shù)據(jù)通常只有幾十到一百組樣本四層以上網(wǎng)絡(luò)幾乎必然過擬合。另一個(gè)實(shí)用技巧是做K折交叉驗(yàn)證替代單次切分訓(xùn)練驗(yàn)證集尤其當(dāng)樣本量只有30組時(shí)單次切分的結(jié)果很依賴隨機(jī)種子。我見過A同學(xué)用固定隨機(jī)種子跑出一組R20.93的網(wǎng)絡(luò)換一個(gè)種子直接掉到0.82——這種模型拿去做優(yōu)化就是玄學(xué)。4. 遺傳算法尋優(yōu)讓Pareto前沿自己浮出來4.1 編碼與約束處理浮點(diǎn)編碼 罰函數(shù)配比變量是連續(xù)值灰砂比從1:3到1:10連續(xù)變化質(zhì)量濃度從65%到76%連續(xù)變化所以用浮點(diǎn)編碼比二進(jìn)制編碼更合適。一條染色體就是一組配比參數(shù)向量例如[灰砂比倒數(shù)水泥/膠凝總量、質(zhì)量濃度、粉煤灰摻量、外加劑摻量]。種群規(guī)模設(shè)80~100進(jìn)化200~300代這是工程上性價(jià)比比較高的組合。約束處理要特別小心。遺傳算法的交叉和變異算子生成的子代很容易越過邊界比如質(zhì)量濃度算出來77.5%超出了工藝上限。我的做法是雙保險(xiǎn)初始化時(shí)用均勻隨機(jī)數(shù)限制在邊界內(nèi)變異后如果越界強(qiáng)行拉回邊界并做小幅擾動(dòng)。另一個(gè)更隱蔽的約束是“配比合計(jì)為100%”。如果你把灰砂比、粉煤灰摻量、質(zhì)量濃度都作為獨(dú)立變量編碼它們之間其實(shí)是耦合的因?yàn)楣橇嫌昧? 總料漿質(zhì)量 × (1 - 質(zhì)量濃度) - 膠凝材料用量。處理這個(gè)約束的常見做法是決策變量只編碼灰砂比、質(zhì)量濃度、粉煤灰摻量三個(gè)其余組分用量由物料平衡公式推算這樣染色體內(nèi)部就自洽了。對(duì)于強(qiáng)度和坍落度的工藝約束用罰函數(shù)處理如果預(yù)測(cè)的R28強(qiáng)度低于1.0MPa適應(yīng)度值直接減去一個(gè)大的懲罰項(xiàng)比如罰100淘汰該個(gè)體。罰函數(shù)的具體數(shù)值要設(shè)得比正常目標(biāo)函數(shù)值域大一個(gè)數(shù)量級(jí)否則約束不生效。4.2 NSGA-II的核心流程非支配排序與擁擠度NSGA-II自己的流程比較復(fù)雜這里給一個(gè)可運(yùn)行的簡(jiǎn)化版核心函數(shù)包含非支配排序和擁擠度計(jì)算。完整的遺傳算法主循環(huán)選擇、交叉、變異邏輯也一并給出方便你直接集成。import numpy as np # 定義要優(yōu)化的目標(biāo)函數(shù)使用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)強(qiáng)度和成本 # 返回一個(gè)數(shù)組每個(gè)元素對(duì)應(yīng)一個(gè)目標(biāo)。默認(rèn)目標(biāo)1為強(qiáng)度(需最大化取負(fù)轉(zhuǎn)最小化)目標(biāo)2為成本(最小化) def evaluate_objectives(chromosome, nn_model, norm_params): # chromosome格式[灰砂比倒數(shù), 質(zhì)量濃度, 粉煤灰摻量, 外加劑摻量] ratio, conc, flyash, admixture chromosome # 物料平衡推算膠凝材料骨料水 1m3料漿總質(zhì)量按1400kg/m3估算 binder conc * 1400 / (1 ratio) # 膠凝材料總用量 cement binder * (1 - flyash) aggregate conc * 1400 - binder water 1400 * (1 - conc) cost cement * 450 flyash * 150 aggregate * 30 admixture * 5 # 單價(jià)為示例 # 歸一化后送入神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)強(qiáng)度和坍落度 x_norm (np.array([conc, ratio, flyash, admixture]) - norm_params[0]) / (norm_params[1] 1e-8) pred nn_model.predict(x_norm.reshape(1, -1)) strength pred[0, 0] * (norm_params[3][0] - norm_params[2][0]) norm_params[2][0] slump pred[0, 1] * (norm_params[3][1] - norm_params[2][1]) norm_params[2][1] x_norm np.array([ratio, conc, flyash, admixture]) # 修正這里用原始變量重新歸一 # 強(qiáng)度約束低于1.0MPa則罰100 if strength 1.0: cost 100 # 坍落度約束超出[18,22]cm范圍罰100 if slump 18 or slump 22: cost 100 return np.array([-strength, cost]) # 非支配排序返回每個(gè)個(gè)體的支配層級(jí)(0為最優(yōu)前沿) def fast_non_dominated_sort(fitness): n len(fitness) domination_count np.zeros(n) dominated_set [[] for _ in range(n)] front [[]] for i in range(n): for j in range(n): if i j: continue # 如果i支配j if all(fitness[i] fitness[j]) and any(fitness[i] fitness[j]): dominated_set[i].append(j) elif all(fitness[j] fitness[i]) and any(fitness[j] fitness[i]): domination_count[i] 1 if domination_count[i] 0: front[0].append(i) rank [0] * n front_idx 0 while front[front_idx]: next_front [] for i in front[front_idx]: rank[i] front_idx for j in dominated_set[i]: domination_count[j] - 1 if domination_count[j] 0: next_front.append(j) front_idx 1 front.append(next_front) return rank # 擁擠度距離同層內(nèi)按目標(biāo)函數(shù)排序后計(jì)算兩鄰居的歸一化距離 def crowding_distance(fitness, front): n len(front) if n 0: return [] distance np.zeros(n) m fitness.shape[1] for obj in range(m): order sorted(range(n), keylambda x: fitness[front[x], obj]) distance[order[0]] np.inf distance[order[-1]] np.inf fmin fitness[front[order[0]], obj] fmax fitness[front[order[-1]], obj] if fmax - fmin 1e-10: continue for k in range(1, n-1): distance[order[k]] (fitness[front[order[k1]], obj] - fitness[front[order[k-1]], obj]) / (fmax - fmin) return distance代碼里這個(gè)evaluate_objectives函數(shù)把約束直接寫進(jìn)目標(biāo)函數(shù)我沒有單獨(dú)設(shè)置約束函數(shù)這在工程上相對(duì)省事。注意神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)那段我把歸一化參數(shù)和反歸一化都寫了進(jìn)去——如果你用第三章節(jié)單獨(dú)保存的模型這塊要對(duì)接好。特別提醒一個(gè)細(xì)節(jié)歸一化時(shí)我用的是norm_params[0]為min、norm_params[1]為max反歸一化時(shí)用norm_params[2]為輸出的min、norm_params[3]為max注意別弄反。注釋里我留了一行修正說明真正放進(jìn)神經(jīng)網(wǎng)絡(luò)的應(yīng)該是原始變量的歸一化結(jié)果所以在代碼中我重新構(gòu)造了一次x_norm以便讓變量順序和訓(xùn)練時(shí)完全一致——這種順序不一致是集成神經(jīng)網(wǎng)絡(luò)和遺傳算法時(shí)最容易犯的錯(cuò)誤經(jīng)常導(dǎo)致預(yù)測(cè)強(qiáng)度整體偏移。cost計(jì)算里的單價(jià)是示例值實(shí)際項(xiàng)目要用你當(dāng)?shù)氐乃?、粉煤灰、骨料、外加劑掛牌價(jià)。關(guān)鍵點(diǎn)是成本函數(shù)里間接通過物料平衡把質(zhì)量濃度和灰砂比耦合起來了所以質(zhì)量濃度提高雖然可能略微提升強(qiáng)度但也會(huì)成比例增加膠凝材料用量進(jìn)而抬高成本——這個(gè)耦合是真實(shí)場(chǎng)景中成本與強(qiáng)度的核心矛盾。種群進(jìn)化的主循環(huán)相對(duì)標(biāo)準(zhǔn)錦標(biāo)賽選擇每次隨機(jī)抽3個(gè)個(gè)體取非支配序最小且擁擠度最大的、模擬二進(jìn)制交叉交叉概率0.9、多項(xiàng)式變異變異概率0.1。交叉和變異后要檢查變量邊界并拉回。4.3 從Pareto前沿挑配比TOPSIS排序和人工決策跑完200代后最后一班種群的非支配前沿就是你要的候選配比。工程上我不能直接把整個(gè)前沿拋給現(xiàn)場(chǎng)而是要從里面挑出3~5個(gè)點(diǎn)做實(shí)驗(yàn)室驗(yàn)證。常見做法是TOPSIS排序確定理想解最大強(qiáng)度、最低成本、最接近20cm坍落度和負(fù)理想解計(jì)算每個(gè)解的相對(duì)貼近度。實(shí)際遇到的情況是現(xiàn)場(chǎng)工藝路線不同決策偏好也不同。如果那個(gè)礦山的充填料漿是自流輸送而非泵送坍落度權(quán)重可以放寬到15cm以上對(duì)應(yīng)Pareto前沿上強(qiáng)度稍低但成本更省的點(diǎn)位。所以不要把TOPSIS排序當(dāng)自動(dòng)化決策它只是輔助你篩掉明顯劣勢(shì)個(gè)體最終配比要工程師拍板。我一般會(huì)把前沿上的點(diǎn)全部打印成表格包含強(qiáng)度、成本、坍落度預(yù)測(cè)值再根據(jù)現(xiàn)場(chǎng)約束人工取舍一輪再送實(shí)驗(yàn)室做驗(yàn)證。5. 常見問題與排查配比優(yōu)化最常翻車的五個(gè)位置5.1 神經(jīng)網(wǎng)絡(luò)在訓(xùn)練集上R20.98驗(yàn)證集上R20.6現(xiàn)象訓(xùn)練集誤差很低驗(yàn)證集預(yù)測(cè)一塌糊涂典型過擬合。原因樣本量太少或者網(wǎng)絡(luò)容量太大。配比數(shù)據(jù)的有效信息量有限30組樣本有多少組核心配比重復(fù)試驗(yàn)很多試驗(yàn)數(shù)據(jù)雖然有40行但其實(shí)是同一配比做了3個(gè)試塊取的平均值“獨(dú)立試驗(yàn)”其實(shí)只有十幾個(gè)水平組合這樣的數(shù)據(jù)根本不支撐15個(gè)隱藏層節(jié)點(diǎn)以上的網(wǎng)絡(luò)。解決先砍隱藏層節(jié)點(diǎn)到5~8個(gè)再訓(xùn)練對(duì)比驗(yàn)證集誤差如果驗(yàn)證集R2明顯上升說明過擬合成立。把樣本數(shù)做上去是唯一正路同時(shí)記錄每一個(gè)配比的拌合時(shí)間、溫度、養(yǎng)護(hù)濕度等環(huán)境變量這些在你后面排查數(shù)據(jù)時(shí)往往是關(guān)鍵線索。5.2 遺傳算法優(yōu)化出來的配比落在邊界上現(xiàn)象Pareto前沿上的最優(yōu)解灰砂比清一色等于1:8上限或質(zhì)量濃度清一色等于68%下限一眼可見不真實(shí)。原因要么是約束條件沒加全要么是神經(jīng)網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)覆蓋范圍之外做預(yù)測(cè)時(shí)輸出的值不可信。BP神經(jīng)網(wǎng)絡(luò)本質(zhì)是插值工具在訓(xùn)練數(shù)據(jù)范圍內(nèi)表現(xiàn)可信超出范圍時(shí)它也會(huì)“自信地”給出一個(gè)光滑但毫無物理依據(jù)的預(yù)測(cè)。解決約束不要只給軟罰函數(shù)直接把變量邊界設(shè)成硬性值。在每次變異操作后強(qiáng)制檢查變量是否落入訓(xùn)練數(shù)據(jù)范圍內(nèi)例如質(zhì)量濃度只能在試驗(yàn)覆蓋的[68, 74]區(qū)間內(nèi)超出就拒收。另一個(gè)技巧是把訓(xùn)練數(shù)據(jù)的min/max作為遺傳算法的變量邊界傳入這樣模型永遠(yuǎn)做的是內(nèi)插而非外推。5.3 遺傳算法跑幾十代后種群多樣性喪失現(xiàn)象前20代Pareto前沿點(diǎn)分布跨度很大到第80代所有個(gè)體擠在一起前沿幾乎沒有擴(kuò)展。原因擁擠度距離計(jì)算在高維目標(biāo)空間3個(gè)目標(biāo)下分辨力不足。NSGA-II的擁擠度是基于每個(gè)目標(biāo)獨(dú)立排序加總當(dāng)目標(biāo)是3個(gè)以上時(shí)不同目標(biāo)間的距離度量互相牽制容易出現(xiàn)兩個(gè)解在每個(gè)目標(biāo)上都有小幅差異但總擁擠度接近的情況選擇壓力不夠。解決調(diào)高變異概率從0.1調(diào)到0.3同時(shí)引入小生境機(jī)制定期檢查前沿點(diǎn)在決策空間的距離如果兩個(gè)解在灰砂比和質(zhì)量濃度上距離小于0.5%隨機(jī)丟棄一個(gè)并重新初始化。另一個(gè)實(shí)用做法是每50代把當(dāng)前種群的5%替換成新的隨機(jī)個(gè)體相當(dāng)于“移民”強(qiáng)行注入多樣性。5.4 優(yōu)化出的高強(qiáng)配比在實(shí)驗(yàn)室做驗(yàn)證時(shí)強(qiáng)度偏差超過30%現(xiàn)象神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)28天強(qiáng)度3.2MPa實(shí)際做試塊測(cè)出來只有2.1MPa。原因試驗(yàn)數(shù)據(jù)本身的不確定性。很多試驗(yàn)室數(shù)據(jù)是單次試塊的結(jié)果沒有做平行試驗(yàn)同配比做3個(gè)試塊取均值個(gè)別試塊成型時(shí)振搗不密實(shí)實(shí)測(cè)強(qiáng)度偏低另外神經(jīng)網(wǎng)絡(luò)天然有平滑效應(yīng)對(duì)極端值不敏感。解決現(xiàn)場(chǎng)驗(yàn)證時(shí)每個(gè)配比至少做3個(gè)試塊取平均值預(yù)測(cè)值和實(shí)測(cè)值偏差控制在15%以內(nèi)才算有效。如果系統(tǒng)性偏差超過20%需要用驗(yàn)證數(shù)據(jù)對(duì)神經(jīng)網(wǎng)絡(luò)做遷移學(xué)習(xí)或直接補(bǔ)充訓(xùn)練數(shù)據(jù)不要硬著頭皮直接用來做生產(chǎn)配比。5.5 遺傳算法和神經(jīng)網(wǎng)絡(luò)聯(lián)調(diào)時(shí)變量順序錯(cuò)位現(xiàn)象單獨(dú)跑神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)時(shí)R20.92接入遺傳算法后出現(xiàn)“預(yù)測(cè)強(qiáng)度”整體偏大或偏小。原因遺傳算法生成的個(gè)體染色體傳入預(yù)測(cè)函數(shù)時(shí)變量的順序與訓(xùn)練時(shí)不一致。比如訓(xùn)練數(shù)據(jù)列是[灰砂比、質(zhì)量濃度、粉煤灰摻量]而你給預(yù)測(cè)函數(shù)傳的是[質(zhì)量濃度、灰砂比、粉煤灰摻量]前兩個(gè)變量近似線性相關(guān)灰砂比是水泥和骨料的比例質(zhì)量濃度是固體和水比例模型還能湊合跑但結(jié)果已經(jīng)完全扭曲。這種bug因?yàn)槭恰敖Y(jié)果看起來合理”的所以排查非常耗時(shí)間。解決在訓(xùn)練和優(yōu)化之間寫一個(gè)標(biāo)準(zhǔn)輸入函數(shù)統(tǒng)一變量順序和歸一化參數(shù)存儲(chǔ)每次調(diào)用模型前打印一條調(diào)試日志輸出變量的min/max和實(shí)際傳入值人工抽查幾組確認(rèn)無誤。6. 從離線優(yōu)化走向在線配比一個(gè)值得投入的進(jìn)階方向跑通神經(jīng)網(wǎng)絡(luò)加遺傳算法的那套流程只能算入門。真正讓這套方案產(chǎn)生生產(chǎn)價(jià)值的是把它從“離線做研究”升級(jí)為“在線調(diào)配比”。我目前的做法是把訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)和NSGA-II算法打包成一個(gè)配比推薦服務(wù)每次接收到新一批骨料或水泥的質(zhì)檢數(shù)據(jù)后觸發(fā)一次輕量級(jí)重優(yōu)化種群200、迭代100代約3分鐘輸出一組推薦的配比范圍和預(yù)測(cè)性能區(qū)間。這背后其實(shí)是一個(gè)閉環(huán)——現(xiàn)場(chǎng)每做一批料漿試塊實(shí)測(cè)數(shù)據(jù)自動(dòng)回寫給模型做增量學(xué)習(xí)每隔一個(gè)月整體重訓(xùn)練一次。這里有個(gè)重要的參數(shù)技巧在線重優(yōu)化時(shí)神經(jīng)網(wǎng)絡(luò)模型本身要“凍結(jié)”別每次重新訓(xùn)練否則模型的漂移會(huì)讓Pareto前沿跟著劇烈晃動(dòng)。只在月度周期里做全量重訓(xùn)日常只更新骨料含水率、細(xì)度模數(shù)這些邊界參數(shù)。若骨料來源更換或水泥批次不同要留一個(gè)緩存區(qū)把新批次的試驗(yàn)數(shù)據(jù)積累至少15組后再觸發(fā)重訓(xùn)否則模型會(huì)學(xué)偏。這個(gè)“數(shù)據(jù)量閾值重訓(xùn)練”策略能夠避免很多翻車現(xiàn)場(chǎng)。另一個(gè)值得做的驗(yàn)證是敏感性分析。用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)做控制變量實(shí)驗(yàn)——固定其他變量只變化質(zhì)量濃度觀察強(qiáng)度預(yù)測(cè)曲線的斜率變化。我在某礦山的模擬項(xiàng)目X上做過一個(gè)測(cè)試質(zhì)量濃度從72%到73%這一小段強(qiáng)度預(yù)測(cè)值提升了約19%而成本只增了3%這就是性價(jià)比最高的調(diào)節(jié)區(qū)間而灰砂比從1:5調(diào)到1:4時(shí)強(qiáng)度只升5%成本卻漲14%——這種數(shù)據(jù)直接用表格放在充填站的控制室比任何優(yōu)化算法結(jié)果都好用。這條路走到最后你會(huì)發(fā)現(xiàn)真正消耗精力的地方不是算法本身而是數(shù)據(jù)治理和時(shí)間投入。如果你們站里連基礎(chǔ)的試驗(yàn)記錄都不完整那談不上優(yōu)化先把每批配比的完整參數(shù)記錄規(guī)范起來。反之如果你手里已經(jīng)有數(shù)十組可靠的實(shí)測(cè)配比數(shù)據(jù)那么一套多目標(biāo)優(yōu)化系統(tǒng)落地到現(xiàn)場(chǎng)需要的時(shí)間大約是一到兩周——這個(gè)投入很快就能從材料成本的節(jié)約里收回。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取