學(xué)建模競賽實戰(zhàn):從預(yù)測模型到動態(tài)優(yōu)化求解的完整復(fù)盤)
1. 從“分享”到“復(fù)盤”一次數(shù)學(xué)建模競賽的深度拆解最近在整理去年的項目資料翻到了去年帶隊參加“華數(shù)杯”數(shù)學(xué)建模競賽C題的完整代碼和論文。當(dāng)時我們團隊花了不少心思最終也拿到了一個不錯的成績。今天不打算只是簡單地把文件甩出來那樣意義不大。我更想借著這個機會和大家一起復(fù)盤一下這道題聊聊我們當(dāng)時的解題思路、遇到的坑、以及那些在最終論文里可能一筆帶過但實際上至關(guān)重要的實現(xiàn)細節(jié)。無論你是正在備賽的學(xué)生還是對數(shù)學(xué)建模感興趣的朋友希望這篇深度復(fù)盤能給你帶來一些實實在在的啟發(fā)而不僅僅是一堆代碼和PDF。“華數(shù)杯”的C題通常以綜合性、應(yīng)用性強著稱往往涉及數(shù)據(jù)處理、模型構(gòu)建、算法設(shè)計和結(jié)果分析等多個環(huán)節(jié)。我們的復(fù)盤將圍繞“問題理解-模型構(gòu)建-求解實現(xiàn)-論文撰寫”這條主線展開我會把每個環(huán)節(jié)我們是怎么想的、為什么這么做、以及中途調(diào)整了什么都掰開揉碎了講清楚。你會發(fā)現(xiàn)一個成功的建模項目其核心價值遠不止于最終的答案更在于整個求解過程的邏輯鏈條和決策依據(jù)。2. 賽題回顧與核心問題界定去年的C題題目背景是關(guān)于“城市低碳發(fā)展路徑的優(yōu)化研究”。題目給了一大堆數(shù)據(jù)包括該城市過去十年的能源消耗結(jié)構(gòu)煤炭、石油、天然氣、非化石能源、GDP、人口、產(chǎn)業(yè)結(jié)構(gòu)比例、碳排放量等同時也給出了一些未來發(fā)展的政策情景假設(shè)比如碳稅稅率、新能源補貼力度、技術(shù)進步率等。題目要求很明確分幾個子問題預(yù)測分析基于歷史數(shù)據(jù)建立合適的模型預(yù)測未來15年到2038年在不同政策情景下該城市的能源消費總量、結(jié)構(gòu)和碳排放量的變化趨勢。路徑優(yōu)化以碳排放總量最小或碳排放強度單位GDP碳排放最小為目標(biāo)在滿足未來GDP預(yù)期增長和能源需求的前提下優(yōu)化未來每年的能源結(jié)構(gòu)配置即各種能源的消費比例。政策評估對給定的幾組政策組合不同碳稅不同補貼進行模擬評估其減排效果、經(jīng)濟成本比如對GDP的潛在影響等并進行排序或給出推薦。敏感性分析分析關(guān)鍵參數(shù)如技術(shù)進步率、能源價格彈性的變動對優(yōu)化結(jié)果的影響說明模型的穩(wěn)健性。拿到題目第一步不是急著找算法而是界定問題。這看似是經(jīng)濟、環(huán)境領(lǐng)域的題但核心是一個帶約束的動態(tài)優(yōu)化問題。數(shù)據(jù)是時間序列目標(biāo)是多期15年的總量或強度最小決策變量是每年各種能源的消費量或比例約束條件包括能源總量滿足需求、GDP增長目標(biāo)、以及各種能源可能的技術(shù)上限比如非化石能源占比不可能一年內(nèi)從10%跳到50%。同時它還需要一個“預(yù)測模塊”來提供優(yōu)化模型的輸入?yún)?shù)如能源需求基線、技術(shù)進步參數(shù)。我們團隊當(dāng)時達成的共識是將問題分解為“預(yù)測”和“優(yōu)化”兩個相對獨立又前后銜接的模塊。預(yù)測模塊為優(yōu)化模塊提供基準(zhǔn)情景和參數(shù)優(yōu)化模塊則在預(yù)測的基礎(chǔ)上進行尋優(yōu)計算。這個分解大大降低了問題的復(fù)雜度。3. 模型構(gòu)建從理論到可計算框架明確了問題框架接下來就是為每個模塊選擇合適的模型。這里充滿了權(quán)衡和抉擇。3.1 預(yù)測模塊的選型與適配歷史數(shù)據(jù)是10年的年度數(shù)據(jù)要預(yù)測15年樣本量很小這對預(yù)測模型是個挑戰(zhàn)。我們評估了幾個常見選項經(jīng)典時間序列模型ARIMA等適用于線性、平穩(wěn)序列。但我們的數(shù)據(jù)如新能源占比明顯有趨勢性和政策干預(yù)影響直接使用效果可能不好且難以融入政策變量碳稅等。機器學(xué)習(xí)回歸模型如SVR、隨機森林需要更多特征而題目給出的直接影響因素有限。在小樣本下容易過擬合?;疑A(yù)測模型GM(1,1)特別適合小樣本、趨勢性數(shù)據(jù)預(yù)測是數(shù)模競賽中的“??汀?。但它對數(shù)據(jù)的光滑性有要求且難以處理政策突變情景。我們的最終方案是一個組合模型對于總量指標(biāo)如能源消費總量、GDP采用改進的灰色預(yù)測模型。我們使用了GM(1,1)模型但對原始數(shù)據(jù)進行了平滑處理例如對增長過快的年份數(shù)據(jù)進行了緩沖算子處理以弱化異常值的影響。預(yù)測出能源消費總量和GDP的總量基線。對于結(jié)構(gòu)比例指標(biāo)如煤炭消費占比我們意識到單純預(yù)測比例很難體現(xiàn)政策影響。因此我們將其轉(zhuǎn)化為驅(qū)動因素分析。我們假設(shè)每種能源的消費量增長率受到以下因素驅(qū)動上年基數(shù)、GDP增長率、該能源相對價格受碳稅和補貼影響、技術(shù)進步率。我們?yōu)槊糠N能源建立了一個簡單的多元線性回歸方程雖然樣本少但變量也少且主要看趨勢ln(Energy_i(t)) a b*ln(GDP(t)) c*PolicyFactor_i(t) d*TechRate_i其中PolicyFactor_i(t) 是政策因子對于高碳能源煤PolicyFactor與碳稅正相關(guān)對于清潔能源PolicyFactor與補貼正相關(guān)。系數(shù)b, c, d通過歷史數(shù)據(jù)擬合由于數(shù)據(jù)少我們采用了嶺回歸以緩解共線性。這樣政策變量就自然地嵌入了預(yù)測過程?;鶞?zhǔn)情景生成將題目給出的“無額外政策”情景參數(shù)碳稅0補貼基礎(chǔ)值代入上述模型預(yù)測出未來15年各種能源的消費量加總后應(yīng)與步驟1預(yù)測的能源總量基線進行比對校準(zhǔn)允許小幅調(diào)整形成優(yōu)化模型的“基準(zhǔn)情景”輸入。注意這里的一個關(guān)鍵技巧是我們并沒有追求預(yù)測模型的絕對精度在小樣本下也不可能而是確保其邏輯自洽并且能靈敏地反映政策變量的影響。這比預(yù)測出一個漂亮的曲線但無法融入政策分析要有用得多。3.2 優(yōu)化模塊構(gòu)建動態(tài)優(yōu)化模型這是整個題目的核心。我們將其建模為一個多期15期非線性規(guī)劃問題。決策變量x[i,t]表示第t年第i種能源的消費量i1:煤炭, 2:石油, 3:天然氣, 4:非化石能源。目標(biāo)函數(shù)兩個可選目標(biāo)。目標(biāo)A碳排放總量最小Min Σ_t Σ_i (x[i,t] * EF_i)其中EF_i是第i種能源的碳排放系數(shù)。目標(biāo)B碳排放強度最小Min Σ_t ( (Σ_i x[i,t] * EF_i) / GDP(t) )其中GDP(t)是第t年預(yù)測的GDP可視為外生給定或微調(diào)。我們最終選擇了目標(biāo)A因為題目更關(guān)注減排絕對量。但我們在論文中對比了兩種目標(biāo)下的結(jié)果差異。約束條件能源需求約束每年各種能源消費量之和必須大于等于預(yù)測的該年最低能源需求D(t)Σ_i x[i,t] D(t)。GDP影響約束簡化處理能源結(jié)構(gòu)變化可能影響經(jīng)濟。我們引入一個簡單的“能源成本影響因子”確保優(yōu)化后的綜合能源成本不超過基準(zhǔn)情景的某個比例如110%以避免出現(xiàn)經(jīng)濟上不可行的激進方案。結(jié)構(gòu)比例約束非化石能源占比上限x[4,t] / Σ_i x[i,t] Max_Share(t)。Max_Share(t)是一個隨時間遞增的上限參考了國家政策目標(biāo)。煤炭消費占比下降約束x[1,t] / Σ_i x[i,t] Base_Share[1,t] * (1 - annual_reduction_rate)^t即要求煤炭占比每年至少按一定速率下降。技術(shù)增長約束每種能源的消費量年增長率有上下限尤其是清潔能源不可能無限高速增長。Lower_Growth_i (x[i,t] - x[i,t-1]) / x[i,t-1] Upper_Growth_i。非負(fù)約束x[i,t] 0。這個模型本質(zhì)上是一個中等規(guī)模的非線性規(guī)劃目標(biāo)為線性但約束中有比例是非線性的。直接求全局最優(yōu)解比較困難。3.3 求解策略化動態(tài)為靜態(tài)序列直接求解15期*4種能源60個決策變量的非線性規(guī)劃對于競賽而言計算復(fù)雜且不易穩(wěn)定。我們采用了一種**滾動優(yōu)化Rolling Optimization**的策略將多期動態(tài)問題轉(zhuǎn)化為一系列單期或短期的靜態(tài)優(yōu)化問題。第一步確定首年決策。以第一年t1為起點在滿足第一年所有約束的前提下優(yōu)化第一年的能源結(jié)構(gòu)x[i,1]使得第一年的碳排放最小。這是一個小規(guī)模非線性規(guī)劃用MATLAB的fmincon或 Python 的scipy.optimize.minimize可以輕松求解。第二步滾動預(yù)測與優(yōu)化。在確定了x[i,1]后我們將其作為已知量。由于我們的預(yù)測模型中下一年的能源消費基數(shù)與上年有關(guān)因此我們需要用優(yōu)化后的x[i,1]去更新第二年的預(yù)測基線主要是更新基數(shù)政策因子等外生變量不變。然后在t2年以更新后的預(yù)測為約束再次優(yōu)化x[i,2]。重復(fù)如此逐年滾動直至優(yōu)化完第15年。這個方法的妙處在于它既考慮了動態(tài)性通過滾動更新預(yù)測基線又將復(fù)雜問題分解為可求解的子問題。雖然從全局看可能是次優(yōu)解但在模型參數(shù)本身存在不確定性的情況下這種“近視”的滾動優(yōu)化策略反而更穩(wěn)健也更容易理解和實現(xiàn)。我們在論文中明確說明了這一點并把它作為模型的一個特點而非缺點。4. 代碼實現(xiàn)工具選擇與關(guān)鍵細節(jié)我們團隊主要使用Python作為實現(xiàn)工具因為其生態(tài)豐富Pandas, NumPy, SciPy, Matplotlib便于快速進行數(shù)據(jù)處理、模型求解和可視化。4.1 數(shù)據(jù)處理與預(yù)測模塊代碼要點import pandas as pd import numpy as np from scipy.optimize import minimize import matplotlib.pyplot as plt # 1. 數(shù)據(jù)讀取與預(yù)處理 data pd.read_excel(problem_c_data.xlsx) # 假設(shè)數(shù)據(jù)列包括Year, Coal, Oil, Gas, Clean, GDP, Carbon # 計算比例 data[Coal_Share] data[Coal] / (data[Coal]data[Oil]data[Gas]data[Clean]) # 2. 灰色預(yù)測函數(shù) (以能源總量為例) def gm11(x, predict_num): 標(biāo)準(zhǔn)的GM(1,1)預(yù)測模型 x: 原始序列 predict_num: 預(yù)測步數(shù) x1 x.cumsum() # 1-AGO z1 (x1[:-1] x1[1:]) / 2.0 # 緊鄰均值生成序列 B np.vstack([-z1, np.ones(len(z1))]).T Y x[1:].reshape(-1, 1) # 使用最小二乘法求解參數(shù) a, b [[a], [b]] np.linalg.inv(B.T B) B.T Y # 預(yù)測 pred_x1 [(x[0] - b/a) * np.exp(-a * k) b/a for k in range(len(x) predict_num)] pred_x0 [pred_x1[0]] [pred_x1[i1] - pred_x1[i] for i in range(len(pred_x1)-1)] return pred_x0[-predict_num:] # 返回未來預(yù)測值 # 3. 帶政策因子的回歸預(yù)測以煤炭為例 def predict_with_policy(base_year_value, gdp_growth_series, carbon_tax_series, subsidy_series, tech_rate, coef_gdp, coef_policy): 模擬每年消費量變化 base_year_value: 基年值 gdp_growth_series: 未來GDP增長率序列 carbon_tax_series: 碳稅序列影響煤炭 subsidy_series: 補貼序列影響清潔能源 tech_rate: 技術(shù)進步率 coef_*: 回歸得到的系數(shù) pred_series [base_year_value] for t in range(1, len(gdp_growth_series)1): # 政策因子對煤炭政策因子 1 carbon_tax_effect * carbon_tax_series[t-1] # 這里簡化處理假設(shè)政策因子線性影響 policy_factor 1 coef_policy * carbon_tax_series[t-1] # 對于煤炭coef_policy應(yīng)為負(fù) growth coef_gdp * gdp_growth_series[t-1] np.log(policy_factor) tech_rate new_value pred_series[-1] * np.exp(growth) pred_series.append(new_value) return pred_series[1:] # 返回預(yù)測序列關(guān)鍵細節(jié)數(shù)據(jù)標(biāo)準(zhǔn)化在回歸前我們對GDP增長率、政策變量等進行了標(biāo)準(zhǔn)化處理使其量綱一致回歸系數(shù)更可比。參數(shù)估計的穩(wěn)健性由于歷史數(shù)據(jù)僅10條我們采用留一法交叉驗證來觀察回歸系數(shù)的穩(wěn)定性并最終取了一個相對保守的系數(shù)估計值避免外推時出現(xiàn)極端情況。預(yù)測結(jié)果的整合用回歸模型預(yù)測出各能源消費量后其加總可能與灰色預(yù)測的總量有出入。我們采用了一個比例縮放的方法將回歸預(yù)測的各能源量按灰色預(yù)測的總量進行等比例調(diào)整確保加總一致。這相當(dāng)于認(rèn)為回歸模型預(yù)測的結(jié)構(gòu)比例是可靠的但總量水平需要校準(zhǔn)。4.2 滾動優(yōu)化模塊代碼核心# 定義單期優(yōu)化目標(biāo)函數(shù)和約束 def single_period_optimization(initial_guess, demand_t, last_year_shares, carbon_coefs, max_clean_share, coal_reduction_target): 優(yōu)化某一年的能源結(jié)構(gòu) initial_guess: 初始猜測值四種能源的消費量 demand_t: 該年能源總需求 last_year_shares: 上一年的能源結(jié)構(gòu)比例用于增長率約束 carbon_coefs: 碳排放系數(shù)列表 [coal, oil, gas, clean] max_clean_share: 清潔能源占比上限 coal_reduction_target: 煤炭占比相對于上一年需減少的比例 n_energy 4 # 目標(biāo)函數(shù)碳排放最小 def objective(x): return np.sum(x * carbon_coefs) # 約束條件 constraints [ {type: eq, fun: lambda x: np.sum(x) - demand_t}, # 能源總需求滿足 {type: ineq, fun: lambda x: max_clean_share * np.sum(x) - x[3]}, # 清潔能源上限 {type: ineq, fun: lambda x: (1 - coal_reduction_target) * (last_year_shares[0] * demand_t) - x[0]}, # 煤炭占比下降 # 增長率約束示例清潔能源增長率不超過20% {type: ineq, fun: lambda x: (10.2) * last_year_shares[3] * demand_t - x[3]}, # 上限 {type: ineq, fun: lambda x: x[3] - (1-0.05) * last_year_shares[3] * demand_t}, # 下限假設(shè)不低于-5% ] bounds [(0, demand_t) for _ in range(n_energy)] # 非負(fù)約束且單種能源不超過總需求 result minimize(objective, initial_guess, methodSLSQP, boundsbounds, constraintsconstraints) if result.success: return result.x else: print(fOptimization failed at period: {result.message}) # 失敗時返回一個可行解例如按去年比例分配 return last_year_shares * demand_t # 滾動優(yōu)化主循環(huán) def rolling_optimization(total_demands, initial_shares, carbon_coefs, planning_horizon15): total_demands: 未來各年總需求列表長度planning_horizon initial_shares: 基年能源結(jié)構(gòu)比例列表 [coal, oil, gas, clean] carbon_coefs: 碳排放系數(shù) optimized_consumption [] current_shares initial_shares.copy() for t in range(planning_horizon): demand_t total_demands[t] # 設(shè)置煤炭占比下降目標(biāo)例如每年比上一年占比降低2個百分點 coal_reduction 0.02 # 清潔能源占比上限逐年提高 max_clean_share 0.10 t * 0.03 # 例如從10%開始每年增3個百分點 # 初始猜測值按上年比例分配 initial_guess current_shares * demand_t # 求解本年優(yōu)化 opt_result single_period_optimization(initial_guess, demand_t, current_shares, carbon_coefs, max_clean_share, coal_reduction) optimized_consumption.append(opt_result) # 更新下一年優(yōu)化所用的“上年比例” current_shares opt_result / np.sum(opt_result) return np.array(optimized_consumption)踩坑與心得初始值敏感性問題非線性規(guī)劃求解器如SLSQP對初始猜測值敏感。我們最初直接用上年比例作為初始值在約束收緊時容易陷入局部最優(yōu)或無法滿足約束。后來我們改用了多起點隨機初始化在可行域內(nèi)隨機生成若干組初始點分別求解取目標(biāo)函數(shù)最優(yōu)且滿足約束的解作為最終結(jié)果。這顯著提高了求解的穩(wěn)定性。約束不可行處理在滾動后期約束如清潔能源上限、煤炭下降目標(biāo)可能過于嚴(yán)格導(dǎo)致無解。我們的代碼中加入了異常處理當(dāng)求解失敗時返回一個“應(yīng)急方案”如放松某個約束或返回上年比例。更重要的是我們在模型中提前設(shè)置了合理的約束邊界并通過敏感性分析來探討這些邊界的合理性。單位一致性目標(biāo)函數(shù)是碳排放量單位是萬噸CO2決策變量是能源消費量單位可能是萬噸標(biāo)煤。務(wù)必確保碳排放系數(shù)EF_i的單位與之匹配。我們一開始用了錯誤的系數(shù)導(dǎo)致結(jié)果差了幾個數(shù)量級檢查了很久才發(fā)現(xiàn)是單位換算問題。5. 結(jié)果分析與論文圖表呈現(xiàn)求解完成后會得到一套優(yōu)化后的能源消費路徑。分析不僅僅是描述曲線更要解讀其含義。5.1 核心結(jié)果解讀我們得到了兩個核心情景的結(jié)果基準(zhǔn)情景BAU僅延續(xù)歷史趨勢和政策不進行主動優(yōu)化。優(yōu)化情景OPT應(yīng)用我們的滾動優(yōu)化模型得到的能源結(jié)構(gòu)路徑。對比發(fā)現(xiàn)碳排放軌跡優(yōu)化情景下碳排放峰值提前了約5年且2038年的累計碳排放量比基準(zhǔn)情景降低了約18%。能源結(jié)構(gòu)演變煤炭消費占比下降速度明顯加快在2030年左右降至20%以下基準(zhǔn)情景仍在30%左右清潔能源占比快速上升在規(guī)劃期末接近35%基準(zhǔn)情景約為25%。經(jīng)濟成本優(yōu)化情景下的綜合能源成本比基準(zhǔn)情景平均高出約5%這主要源于早期對清潔能源的投入。但我們通過“能源成本影響約束”將其控制在了可接受范圍內(nèi)。5.2 可視化與圖表技巧一張好圖勝過千言萬語。我們精心設(shè)計了以下幾類圖堆疊面積圖能源結(jié)構(gòu)演變這是展示結(jié)構(gòu)變化最直觀的圖。X軸為年份Y軸為能源消費量用不同顏色堆疊出煤炭、石油、天然氣、清潔能源的消費量。將BAU和OPT兩個情景并列放置差異一目了然。import matplotlib.pyplot as plt years list(range(2024, 2039)) # data_opt 是優(yōu)化后的消費量矩陣形狀為(15,4) fig, (ax1, ax2) plt.subplots(1, 2, figsize(14, 5), shareyTrue) ax1.stackplot(years, data_bau.T, labels[Coal, Oil, Gas, Clean], colors[grey, brown, blue, green]) ax1.set_title(BAU Scenario - Energy Mix) ax1.set_ylabel(Energy Consumption (Million tce)) ax1.legend(locupper left) ax2.stackplot(years, data_opt.T, labels[Coal, Oil, Gas, Clean], colors[grey, brown, blue, green]) ax2.set_title(Optimized Scenario - Energy Mix) plt.tight_layout() plt.show()雙Y軸折線圖碳排放與強度對比左側(cè)Y軸為碳排放總量萬噸右側(cè)Y軸為碳排放強度噸/萬元GDP。將兩個情景的這兩條線畫在一起能清晰展示優(yōu)化在總量和效率上的雙重效果。雷達圖/柱狀圖政策情景對比對于政策評估子問題我們模擬了6組不同的政策組合碳稅低/中/高 × 補貼低/高。計算每組情景下的關(guān)鍵輸出指標(biāo)累計減排量、GDP損失相對于BAU、清潔能源投資額。然后用雷達圖同時展示多個指標(biāo)或用分組柱狀圖進行排序直觀顯示“高碳稅高補貼”組合的綜合效果最好但經(jīng)濟成本也最高。敏感性分析熱力圖分析技術(shù)進步率和能源價格彈性兩個參數(shù)對優(yōu)化結(jié)果如累計減排量的影響。將參數(shù)在一定范圍內(nèi)離散化運行多次模型將結(jié)果繪制成熱力圖。顏色越深表示減排效果越好。這張圖能有力地說明模型結(jié)果對哪些參數(shù)敏感為政策制定提供了不確定性范圍的參考。論文圖表黃金法則每張圖都必須有自解釋性。即標(biāo)題、坐標(biāo)軸標(biāo)簽、圖例必須清晰完整讓讀者不看正文也能理解圖在表達什么。避免使用過于花哨的顏色和樣式學(xué)術(shù)圖表以清晰、準(zhǔn)確為首要目標(biāo)。6. 論文寫作如何將代碼和思路轉(zhuǎn)化為優(yōu)秀論文數(shù)學(xué)建模競賽論文是最終的交付物。代碼再漂亮模型再精巧如果論文沒寫好一切白搭。我們的寫作遵循了“問題驅(qū)動-模型清晰-結(jié)果可信-討論深入”的結(jié)構(gòu)。6.1 摘要濃縮的精華摘要必須獨立成篇概括全部工作。我們采用了經(jīng)典的四段式第一段問題重述用一兩句話說明研究了什么問題背景和意義是什么。第二段模型與方法簡述我們解決問題的整體思路預(yù)測優(yōu)化以及使用的核心模型改進灰色預(yù)測、政策驅(qū)動回歸、多期滾動優(yōu)化。第三段主要結(jié)果給出最關(guān)鍵的數(shù)字結(jié)論。例如“...結(jié)果表明通過優(yōu)化碳排放峰值可提前至2028年2038年累計碳排放較基準(zhǔn)情景下降18.2%。在‘高碳稅高補貼’政策組合下減排效果最佳但會使能源成本上升約8%?!钡谒亩文P吞攸c簡要總結(jié)模型的優(yōu)點如考慮了政策動態(tài)影響、滾動優(yōu)化策略穩(wěn)健以及敏感性分析等擴展工作。6.2 模型建立部分邏輯大于公式這部分不是羅列公式而是講述一個邏輯故事。問題分析用流程圖展示我們對問題的分解預(yù)測模塊 - 優(yōu)化模塊。分析每個子問題的特點小樣本預(yù)測、帶約束動態(tài)優(yōu)化。模型準(zhǔn)備說明數(shù)據(jù)預(yù)處理、指標(biāo)計算、參數(shù)設(shè)定如碳排放系數(shù)來源、政策因子量化方法。參數(shù)設(shè)定的依據(jù)必須交代如果是假設(shè)要說明其合理性。預(yù)測模型先講為什么用組合模型灰色預(yù)測處理總量趨勢回歸模型融入政策影響再給出數(shù)學(xué)模型。對于回歸模型重點說明變量選取和系數(shù)符號的經(jīng)濟學(xué)含義。優(yōu)化模型這是核心。先給出完整的數(shù)學(xué)模型目標(biāo)函數(shù)、約束條件對每個約束進行解釋為什么需要這個約束其物理或經(jīng)濟含義是什么。然后重點闡述滾動優(yōu)化策略為什么用這個策略它是如何將動態(tài)問題轉(zhuǎn)化為靜態(tài)序列的它的優(yōu)缺點是什么我們誠實地指出這是一種近似但計算高效且穩(wěn)健。求解方法說明使用的求解器SciPy的minimize函數(shù)SLSQP算法以及為提高求解穩(wěn)定性采取的措施多起點初始化。6.3 結(jié)果分析部分?jǐn)?shù)據(jù)與洞察并重逐題回答嚴(yán)格按照題目子問題的順序來呈現(xiàn)結(jié)果。每個子問題先用文字總結(jié)核心發(fā)現(xiàn)然后配以圖表支持。深度解讀不要只說“從圖X可以看出煤炭占比下降”。要解讀背后的原因“煤炭占比的快速下降主要得益于優(yōu)化模型中施加的強制性年下降率約束以及在碳稅政策下其經(jīng)濟性相對下降。圖中在2030年后的平臺期是因為遇到了清潔能源增長的技術(shù)上限約束?!苯徊嬉迷谖淖种忻鞔_指出支持結(jié)論的圖表編號如“如圖3所示”讓評委能輕松對應(yīng)。敏感性分析這部分是加分項。不僅要展示結(jié)果如何隨參數(shù)變化更要分析變化的原因。例如“當(dāng)技術(shù)進步率提高10%累計減排量可增加約5%。這是因為技術(shù)進步降低了清潔能源的成本使得優(yōu)化模型可以在經(jīng)濟成本約束下分配更多份額給清潔能源。”6.4 模型評價與推廣優(yōu)點實事求是不要過度吹噓。我們寫了模型結(jié)構(gòu)清晰預(yù)測與優(yōu)化模塊耦合靈活滾動優(yōu)化策略降低了求解難度且易于理解模型充分考慮了政策變量具有較好的政策模擬能力。缺點主動提及一兩個不傷大雅的缺點顯得思考全面。我們寫了預(yù)測模塊基于歷史數(shù)據(jù)對技術(shù)突破等顛覆性變化難以捕捉優(yōu)化模型中的部分約束如增長率上下限的設(shè)定具有一定主觀性雖然通過了敏感性分析檢驗。推廣基于模型框架談?wù)勥€可以用在哪些類似場景如其他城市的低碳規(guī)劃、工業(yè)部門的減排路徑優(yōu)化等說明模型的通用性。7. 團隊協(xié)作與時間管理心得最后分享點實戰(zhàn)中的“軟技能”。三天或更長的競賽是腦力也是體力的較量。分工明確動態(tài)調(diào)整我們?nèi)艘蝗酥鞴ソEc算法負(fù)責(zé)核心模型推導(dǎo)和代碼框架一人主攻編程與數(shù)據(jù)處理負(fù)責(zé)代碼實現(xiàn)、調(diào)試和可視化一人主攻論文寫作負(fù)責(zé)將思路轉(zhuǎn)化為文字并繪制圖表。但分工不是僵化的。編程的同學(xué)遇到模型理解問題建模的同學(xué)要立刻支持寫論文的同學(xué)需要某個具體結(jié)果編程的同學(xué)要快速跑出數(shù)據(jù)。每天早晚開短會同步進度調(diào)整方向。版本控制至關(guān)重要我們使用Git來管理代碼和論文LaTeX。所有代碼、數(shù)據(jù)、論文源文件都放在倉庫里。這樣任何人都可以隨時回溯到任何一個時間點的版本避免了“文件覆蓋”慘劇。對于論文我們堅持寫一小節(jié)就提交一次注釋清楚更新內(nèi)容?!跋惹笥性偾蠛谩辈灰婚_始就追求完美的模型或漂亮的圖表。第一天結(jié)束前必須有一個能跑通的、哪怕很粗糙的完整流程從數(shù)據(jù)輸入到簡單模型處理到輸出一個初步結(jié)果。這能建立信心也便于早期發(fā)現(xiàn)致命問題比如數(shù)據(jù)讀錯了軟件環(huán)境有問題。后續(xù)兩天再在這個基礎(chǔ)上迭代優(yōu)化、增加復(fù)雜度、美化圖表和文字。論文寫作要盡早開始不要等到最后一天才寫論文。從第一天起負(fù)責(zé)論文的同學(xué)就應(yīng)該開始搭建框架寫問題重述、模型假設(shè)等部分。每當(dāng)模型確定一部分就立刻將相關(guān)的數(shù)學(xué)模型和解釋寫進論文。這樣最后一天的壓力會小很多只需要進行結(jié)果填充、潤色和整合。保持健康與溝通準(zhǔn)備些提神的飲料和零食但保證基本睡眠。隊友間有不同意見時就基于模型結(jié)果或簡單試算來快速決策避免長時間爭論。記住提交一份完整的、自洽的論文比追求一個理論上完美但來不及實現(xiàn)的方案重要得多。回過頭看那次比賽最大的收獲不是獎項而是這套從問題拆解到模型實現(xiàn)再到結(jié)果表達的全流程實戰(zhàn)經(jīng)驗。代碼和論文只是載體背后的思考過程才是真正有價值的東西。希望這篇超詳細的復(fù)盤能幫你穿透“完整代碼和論文”這個表象看到一次成功的數(shù)學(xué)建模究竟是如何一步步構(gòu)建起來的。如果你正在備賽不妨找一道往屆賽題試著用這個思路走一遍相信你會有不一樣的體會。