數學建模常用算法-模擬退火算法

一、模擬退火算法

模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后,緩慢冷卻,金屬原子會在熱能作用下自由運動,逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型:

  • “溫度 T”:對應物理中的溫度,控制算法探索新解的 “自由度”—— 溫度越高,越容易接受較差的解,幫助跳出局部最優;溫度越低,越傾向于接受更優解,逐漸收斂到穩定解。
  • “能量 E”:對應優化問題中的目標函數值(如函數值、路徑長度等),算法的目標是找到 “能量最低” 的狀態(即目標函數的最優解)。
  • “冷卻策略”:溫度隨迭代逐步降低的規則,決定了算法的探索效率和收斂速度。

二、核心原理:Metropolis 接受準則

模擬退火算法的核心是Metropolis 接受準則—— 它決定了算法是否接受一個新生成的解,即使這個解比當前解更差。具體規則如下:

  1. 設當前解為\(x\),對應的目標函數值為\(f(x)\);新生成的解為\(x_1\),對應的函數值為\(f(x_1)\)。
  1. 若新解更優(如求最小值時\(f(x_1) < f(x)\)),則直接接受新解,更新當前解為\(x_1\)。
  1. 若新解較差(如求最小值時\(f(x_1) > f(x)\)),則以概率\(P\)接受新解:

\(P = \exp\left( \frac{f(x) - f(x_1)}{T} \right)\)

    • 溫度\(T\)越高,\(P\)越大,越容易接受較差解;
    • 溫度\(T\)越低,\(P\)越小,越難接受較差解;
    • 當\(T \to 0\)時,\(P \to 0\),算法僅接受更優解,收斂到穩定狀態。

三、代碼逐行解析:從框架到細節

結合你提供的模擬退火算法框架,我們逐部分拆解代碼邏輯,理解每一步的作用和設計思路。

1. 算法參數初始化

double T = 2000; // 初始溫度:控制初始探索范圍double dT = 0.99; // 溫度衰減系數:控制冷卻速度double eps = 1e-14; // 溫度下限:算法終止條件
  • 初始溫度\(T\):通常設為較大值(如 2000、1000),保證初始階段有足夠的 “自由度” 探索解空間,避免過早陷入局部最優。
  • 衰減系數\(dT\):一般取 0.95~0.99 之間的小數,系數越接近 1,溫度下降越慢,探索越充分,但迭代次數越多;系數越小,冷卻越快,可能導致探索不充分。
  • 溫度下限\(eps\):當溫度低于該值時,算法基本不再接受較差解,此時可終止迭代,輸出當前最優解。

2. 目標函數定義

// 用自變量計算函數值,支持單變量或多變量(如f(x,y,z))double func(int x, ... ) {// 此處根據具體問題實現目標函數計算double ans = ....... // 例:若求f(x)=x2的最小值,ans = x*x;return ans;}
  • 這是算法的 “核心輸入”,需根據具體建模問題定義。例如:
    • 若求解函數\(f(x) = x^2 - 4x + 5\)的最小值,func需返回\(x^2 - 4x + 5\);
    • 若解決 TSP 問題,func需計算當前路徑的總長度(輸入為城市序列,輸出為路徑和)。
  • 支持多變量優化(如\(f(x,y)\)),只需在參數列表中添加變量(如func(int x, int y, ...)),后續新解生成和更新時同步處理即可。

3. 初始解生成

// 生成初始解(隨機值)double x = rand(); // 初始自變量x0(單變量情況)double f = func(x,...); // 初始解對應的目標函數值f(x0)
  • 初始解通常隨機生成(利用rand()函數),保證解的隨機性,避免初始位置對結果的影響。
  • 若問題有明確的解空間限制(如\(x \in [0, 100]\)),需在初始生成時添加約束(如x = rand() % 101),或后續通過定義域檢查修正。

4. 核心迭代:退火過程

while(T > eps) { // 溫度未降到下限,持續迭代// 步驟1:生成新解x1(幅度與溫度正相關)double dx = (2*rand() - RAND_MAX) * T;// 解釋:(2*rand() - RAND_MAX)生成[-RAND_MAX, RAND_MAX]的隨機數,// 除以RAND_MAX后范圍變為[-1, 1],再乘以T,使新解的探索幅度隨溫度降低而減小。// 步驟2:定義域檢查(可選,根據問題需求添加)while(x + dx > 上限 || x + dx < 下限) { // 若新解超出可行域dx = (2*rand() - RAND_MAX) * T; // 重新生成新解,直到符合要求}double x1 = x + dx; // 最終合法的新解// 步驟3:計算新解的目標函數值double f1 = func(x1, ...); // f1 = f(x1)// 步驟4:Metropolis接受準則——判斷是否接受新解// 情況1:新解更優(此處假設求最小值,即f1 < f)if(f1 < f) {x = x1; // 更新自變量為新解f = f1; // 更新目標函數值為新值// 若為多變量(如x,y),需同步更新:y = y1;}// 情況2:新解較差,按概率接受else {// 計算接受概率P = exp((f - f1)/T)(求最小值時,f - f1為負數,P∈(0,1))double prob = exp((f - f1) / T);// 生成[0,1)的隨機數,若小于P則接受新解if(prob * RAND_MAX > rand()) {x = x1;f = f1;}}// 步驟5:冷卻溫度——按衰減系數降低溫度T = T * dT;}
  • 新解生成邏輯:新解的探索幅度與溫度\(T\)正相關,這是模擬退火的關鍵設計 —— 高溫時大步探索,低溫時精細調整,既保證全局搜索能力,又兼顧局部收斂效率。
  • 定義域檢查:若問題對解有明確范圍限制(如資源分配問題中 “人數不能為負”),必須添加此步驟,否則可能生成無效解,導致算法出錯。
  • 接受準則細節:需根據 “求最大值” 或 “求最小值” 調整公式:
    • 求最小值:較差解的接受概率為\(P = \exp((f - f1)/T)\)(\(f1 > f\),分子為負,\(P < 1\));
    • 求最大值:較差解的接受概率為\(P = \exp((f1 - f)/T)\)(\(f1 < f\),分子為負,\(P < 1\))。

5. 輸出最優解

cout << "最優自變量x:" << x << endl;

cout << "最優目標函數值f(x):" << f << endl;

  • 迭代結束后,輸出當前找到的最優解(自變量\(x\))和對應的目標函數值\(f(x)\)。
  • 由于算法存在隨機性(初始解、新解生成均為隨機),建議多次運行算法,取多次結果中的最優值,提高結果的可靠性。

四、參數調優:讓算法更高效

模擬退火算法的性能很大程度上依賴參數設置,以下是常見的調優技巧:

  1. 初始溫度\(T\):
    • 若\(T\)過小:初始探索不充分,易陷入局部最優;
    • 若\(T\)過大:迭代次數過多,算法效率低;
    • 調優建議:可先設較大值(如 1000、2000),觀察迭代次數,再根據時間限制調整。
  1. 衰減系數\(dT\):
    • 若\(dT\)過小(如 0.8):溫度下降快,探索不充分;
    • 若\(dT\)過大(如 0.995):迭代次數多,耗時久;
    • 調優建議:多數問題取 0.98~0.99,平衡探索效率和收斂速度。
  1. 溫度下限\(eps\):
  • 一般設為\(1e-10 \sim 1e-15\),無需頻繁調整 —— 當溫度低于此值時,算法已基本收斂,繼續迭代意義不大。
  1. 迭代次數
  • 若問題復雜(如多變量、解空間大),可增加 “固定迭代次數” 作為額外終止條件(如while(T > eps && iter < 1e6)),避免算法超時。

五、應用場景:模擬退火能解決哪些問題?

模擬退火算法的適用范圍極廣,尤其適合數學建模中 “復雜、多局部最優” 的優化問題,常見場景包括:

  1. 函數極值求解:單變量或多變量函數的全局最大值 / 最小值(如\(f(x,y) = x^2 + y^2 - 2x\)的最小值)。
  2. 組合優化問題
  • 旅行商問題(TSP):尋找訪問所有城市且路徑最短的路線;
  • 背包問題:在重量限制下,選擇物品使總價值最大;
  • 圖著色問題:用最少顏色給圖的頂點著色,相鄰頂點顏色不同。
  1. 工程優化問題:資源分配、生產調度、參數優化(如機器學習模型的超參數調優)。

六、實戰案例:用模擬退火求解函數極值

以 “求解\(f(x) = x^2 - 4x + 5\)的最小值” 為例,我們完善代碼并運行:

#include <iostream>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;// 目標函數:f(x) = x2 -4x +5double func(double x) {return x*x - 4*x + 5;}int main() {srand((unsigned int)time(NULL)); // 初始化隨機種子,保證每次運行結果不同// 1. 參數初始化double T = 2000.0; // 初始溫度double dT = 0.99; // 衰減系數double eps = 1e-14; // 溫度下限double x = rand() % 100; // 初始解x0(隨機取0~99的整數)double f = func(x); // 初始函數值// 2. 退火迭代while(T > eps) {// 生成新解x1double dx = (2.0 * rand() - RAND_MAX) / RAND_MAX * T; // 范圍[-T, T]double x1 = x + dx;// 計算新解的函數值double f1 = func(x1);// Metropolis準則if(f1 < f) { // 新解更優,接受x = x1;f = f1;} else { // 按概率接受較差解double prob = exp((f - f1)/T);if(prob * RAND_MAX > rand()) {x = x1;f = f1;}}// 冷卻溫度T *= dT;}// 3. 輸出結果cout << "函數f(x) = x2 -4x +5的最優解:" << endl;cout << "最優x值:" << x << endl;cout << "最小函數值:" << f << endl;// 理論最優解:x=2,f(x)=1,實際運行結果會接近此值return 0;}
  • 運行結果:由于隨機性,每次輸出的\(x\)可能略有不同(如 1.999999 或 2.000001),但函數值會接近理論最小值 1,驗證了算法的有效性。

七、總結

模擬退火算法是數學建模中 “化繁為簡” 的利器 —— 它不依賴問題的具體結構,只需定義目標函數和解的生成規則,就能有效跳出局部最優,尋找全局最優解。掌握它的核心原理(Metropolis 準則)、代碼框架和參數調優技巧,能讓你在面對復雜優化問題時更有底氣。

當然,模擬退火也有局限性(如隨機性導致結果不穩定、大規模問題效率低),實際建模中可結合 “遺傳算法”“粒子群優化” 等算法,或通過多次運行取最優值來彌補。希望這篇文章能幫你真正學會模擬退火,在建模競賽中披荊斬棘!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98673.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

react的filber架構

好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

如何在Ubuntu暢玩鳴潮等游戲

本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安裝Steam&#xff0c;啟動&#xff0c;登陸&#xff0c;下載游戲。到這里的操作都比較簡單&#xff0c;對于沒有反作弊的游戲&#xff0c;往往…

機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

上一章&#xff1a;機器學習08——集成學習 下一章&#xff1a;機器學習10——降維與度量學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、聚類任務&#xff08;無監督學習…

解決 Docker 構建中 Python 依賴沖突的完整指南

問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子計算芯片實戰:Lightmatter Passage互連架構性能評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長&#xff0c;傳統電子計算…

基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

概述 2018年&#xff0c;TensorFlow Lite團隊的Pete Warden曾提出&#xff1a;“機器學習的未來在于微型化”。如今&#xff0c;隨著人工智能向高性能視覺強大的視覺語言模型&#xff08;Vision-language models, VLMs&#xff09;發展&#xff0c;對高性能計算資源的需求急劇…

華為Ai崗機考20250903完整真題

華為Ai崗機考20250903 華為自26屆秋招&#xff08;2025年起&#xff09;對AI崗位機考進行了改革&#xff0c;考試題型調整為20道選擇題&#xff08;15道單選(6分)5道不定項選擇(12分)&#xff09;2道編程題(150300)。 題目核心圍繞人工智能技術&#xff08;如Transformer架構…

k8s+jenkins+harbor構建Devops平臺

一、環境準備1、準備一主一從k8s機器&#xff0c;&#xff08;設備好可以一主多從也行&#xff09;2、一臺harbor倉庫機器&#xff08;dockerhub訪問不了&#xff09;二、安裝nfs服務1、在k8s機器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、創建共…

為什么 socket.io 客戶端在瀏覽器能連上,但在 Node.js 中報錯 transport close?

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

人才教育導向下:老年生活照護實訓室助力提升學生老年照護服務能力

一、老年生活照護實訓室建設背景與意義 &#xff08;一&#xff09;適應老齡化社會需求 我國老齡化程度持續加深&#xff0c;老年照護服務人才缺口不斷擴大。培養專業照護人才成為當務之急&#xff0c;職業教育需承擔重要責任。點擊獲取實訓室建設方案 &#xff08;二&…

我在嘉順達藍海的安全堅守

作為嘉順達藍海的資深安全員&#xff0c;每天清晨 6 點&#xff0c;我都會站在物流基地的入口處&#xff0c;看著一隊隊橙色的嘉順達藍海危險品運輸車整齊列隊。那抹醒目的橙色&#xff0c;不僅是嘉順達藍海的標志&#xff0c;更是我和 200 多名同事堅守 12 年的安全承諾。今天…

云原生監控系統 Prometheus大總結 20250909

本章內容如下&#xff1a; Prometheus 介紹 Prometheus 部署和配置 Node Exporter 采集數據 Pushgateway 采集數據 PromQL 查詢語言 Grafana 圖形化展示 Prometheus 標簽管理 Prometheus 告警機制 Prometheus 服務發現 各種Exporter 高級功能 Prometheus 實現容器監控 Promethe…

EPNN:基于嵌入式偏振神經網絡的水下成像增強方法(未做完)

Enhancing Underwater Imaging for Robot through Embedded Polarization Neural Network EPNN:基于嵌入式偏振神經網絡的水下成像增強方法 1 論文核心概念 本文提出了一種名為嵌入式偏振神經網絡(Embedded Polarization Neural Network, EPNN) 的方法,用于顯著提升水下…