30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼

import random
import mathdef rastrigin(x, y):"""二維Rastrigin函數(目標函數,需最小化)參數:x: 自變量xy: 自變量y返回:函數值f(x,y)"""return 20 + x**2 + y**2 - 10 * math.cos(2 * math.pi * x) - 10 * math.cos(2 * math.pi * y)def simulated_annealing(T0=100, alpha=0.9, L=100, T_end=1e-5):"""模擬退火算法實現(解決二維Rastrigin函數最小化問題)參數:T0: 初始溫度(默認100,越大探索越充分)alpha: 溫度衰減系數(默認0.9,0.8-0.95之間,越小降溫越快)L: 每個溫度下的迭代次數(默認100,越大搜索越充分)T_end: 停止溫度(默認1e-5,越小收斂越徹底)返回:best_solution: 全局最優解(x,y)best_value: 全局最優目標函數值"""# 1. 初始化當前解(隨機生成x,y ∈ [-5.12, 5.12])x = random.uniform(-5.12, 5.12)y = random.uniform(-5.12, 5.12)current_sol = (x, y)  # 當前解(tuple)current_val = rastrigin(x, y)  # 當前解的目標函數值# 2. 初始化最好解(初始時最好解為當前解)best_sol = current_solbest_val = current_val# 3. 溫度循環(從高溫到低溫)T = T0  # 當前溫度while T > T_end:# 4. 每個溫度下的迭代(搜索當前溫度下的解空間)for _ in range(L):# a. 生成新解(在當前解附近隨機擾動,用正態分布,標準差與溫度相關)# 溫度越高,擾動越大(探索范圍廣);溫度越低,擾動越小(聚焦局部)new_x = current_sol[0] + random.gauss(0, T**0.5)  # 正態分布擾動xnew_y = current_sol[1] + random.gauss(0, T**0.5)  # 正態分布擾動y# b. 截斷新解(確保x,y在定義域[-5.12, 5.12]內)new_x = max(min(new_x, 5.12), -5.12)new_y = max(min(new_y, 5.12), -5.12)new_sol = (new_x, new_y)  # 新解new_val = rastrigin(new_x, new_y)  # 新解的目標函數值# c. 計算目標函數差(新解 - 當前解)delta_f = new_val - current_val# d. Metropolis準則:判斷是否接受新解if delta_f <= 0:# 情況1:新解更好(目標函數值更小),直接接受current_sol = new_solcurrent_val = new_val# 更新最好解(如果新解比當前最好解更好)if new_val < best_val:best_sol = new_solbest_val = new_valelse:# 情況2:新解更差,以概率exp(-delta_f/T)接受prob = math.exp(-delta_f / T)  # 接受概率(溫度越高,概率越大)if random.random() < prob:  # 生成0-1隨機數,小于prob則接受current_sol = new_solcurrent_val = new_val# 5. 溫度衰減(指數衰減:T = alpha * T)T *= alpha# 6. 返回最好解和最好目標函數值return best_sol, best_valif __name__ == "__main__":# ---------------------- 參數設置(小白可調整) ----------------------T0 = 100      # 初始溫度(推薦值:50-200)alpha = 0.9   # 衰減系數(推薦值:0.8-0.95)L = 100       # 每個溫度下的迭代次數(推薦值:50-200)T_end = 1e-5  # 停止溫度(推薦值:1e-4-1e-6)# -------------------------------------------------------------------# 運行模擬退火算法best_sol, best_val = simulated_annealing(T0, alpha, L, T_end)# 輸出結果print("="*50)print("模擬退火算法求解二維Rastrigin函數最小值結果:")print(f"全局最優解(x, y):({best_sol[0]:.4f}, {best_sol[1]:.4f})")print(f"全局最優目標函數值:{best_val:.4f}")print(f"理論全局最小值:0(對應解(0,0))")print("="*50)

三、代碼使用說明

1.環境準備

安裝Python(推薦3.7及以上版本,下載地址:https://www.python.org/downloads/)。

無需額外安裝第三方庫(代碼使用Python標準庫random和math)。

2.運行代碼

將代碼保存為sa_rastrigin.py(或任意文件名)。

打開命令行(Windows:Win+R輸入cmd;Mac:Launchpad搜索終端),進入代碼所在目錄,運行:

Python?sa_rastrigin.py

3.參數調整說明(小白重點)

代碼中的T0(初始溫度)、alpha(衰減系數)、L(每個溫度下的迭代次數)是核心可調參數,影響算法性能:

初始溫度T0

越大:算法初期探索范圍越廣(敢接受差解),越不容易陷入局部最優,但計算時間越長。

推薦值:50-200(比如T0=100)。

衰減系數alpha

越小:溫度下降越快(比如alpha=0.8,10次迭代后溫度從100降到100*0.8^10≈10.7),計算時間短,但可能提前收斂到局部最優。

越大:溫度下降越慢(比如alpha=0.95,10次迭代后溫度≈59.8),探索更充分,但計算時間長。

推薦值:0.8-0.95(比如alpha=0.9)。

每個溫度下的迭代次數L

越大:每個溫度下搜索越充分(比如L=200,每個溫度下嘗試200次新解),越可能找到更好的解,但計算時間越長。

推薦值:50-200(比如L=100)。

4.結果解釋

運行代碼后,會輸出類似以下結果(因隨機種子不同,結果略有差異):

==================================================
模擬退火算法求解二維Rastrigin函數最小值結果:
全局最優解(x, y):(0.0012, -0.0008)
全局最優目標函數值:0.0002
理論全局最小值:0(對應解(0,0))
==================================================

全局最優解:接近(0,0)(理論全局最優解)。

全局最優目標函數值:接近0(理論全局最小值)。

四、拓展建議(小白進階)

可視化結果:可以用matplotlib庫繪制Rastrigin函數圖像和算法搜索路徑,更直觀看到算法如何從“亂撞”到“收斂”。

解決其他問題:將rastrigin函數替換為其他優化問題的目標函數(比如TSP的總距離、背包問題的總價值),即可用該代碼解決其他優化問題(需調整新解生成方式,比如TSP用交換城市位置)。

通過本案例,小白可以掌握模擬退火算法的核心邏輯(Metropolis準則、溫度衰減)和代碼實現,并能調整參數解決實際優化問題。

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

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

相關文章

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法&#xff0c;它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform&#xff08;摁下鼠標左鍵的瞬間&#xff09;二、移動點擊的物體&#xff08;摁著鼠標左鍵不放&#xff09;三、松開左鍵清理被移動對象屬性總結注&#xff1a;本文章只是學習總結的筆記&#xff0c;視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播&#xff08;Unicast&#xff09;示例2. UDP 廣播&#xff08;Broadcast&#xff09;示例3. UDP 多播&#xff08;Multicast&#xff09;示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播&#xff08;Unicast&#xff09;示例 發送方向指定單個目…

神經網絡:卷積層

神經網絡 卷積操作 例子&#xff1a; 輸入&#xff1a;二維圖像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷積核&#xff1a; [1,2,1] [0,1,0] [2,1,0] 然后需要將輸入圖像和卷積核轉化為4維張量 為什么轉為4維張量&#xff1f;因為卷積操作需要輸入圖像…

2.4 組件間通信Props(父傳子)

父組件 在父組件模板上的子組件上加上屬性值&#xff0c;屬性值就是想要傳遞給子組件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子組件 子組…

從零開始學習 Redux:React Native 項目中的狀態管理

Redux 是一個用于 JavaScript 應用程序的狀態管理庫&#xff0c;通常與 React 或 React Native 配合使用&#xff0c;幫助管理應用的狀態和數據流。其核心原理是通過集中式的“單一數據源”來管理應用狀態&#xff0c;避免組件之間的“層層傳遞”狀態和副作用。 Redux 的原理單…

[特殊字符] CentOS 7 離線安裝 MySQL 5.7 實驗

&#x1f427; CentOS 7 離線安裝 MySQL 5.7 實驗 針對企業無互聯網環境的系統&#xff0c;設計了如何在 CentOS 7 系統中&#xff0c;使用一臺可以聯網的主機&#xff08;NodeA&#xff09;為另一臺無法聯網的主機&#xff08;NodeB&#xff09;安裝 MySQL 5.7 數據庫及其依賴…

Redis 概率型數據結構實戰指南

1. 為什么要用「近似」&#xff1f; 隨著業務量爆發式增長&#xff0c;精確統計 的內存或 CPU 成本可能難以接受。例如&#xff1a; 統計一天內 唯一 IP 數 —— 用 SET 精確去重&#xff0c;百萬 IP→占用數百 MB。統計海量商品銷量、實時計算 P99 延遲、獲取 TOP-N 熱門頁面……

Android開發工程師:Linux一條find grep命令通關搜索內容與文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多關鍵詞搜索&#xff1a;使用正則表達式 pattern1|pattern2 同時搜索多個關鍵詞&#xff08;如 activity|class&#xff09;單…

深入理解瀏覽器解析機制和XSS向量編碼

URL 編碼 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------瀏覽器解析不了。 頁面識別在url解碼之前&#xff0c;在…

ThinkPHP8極簡上手指南:開啟高效開發之旅

目錄一、環境搭建1.1 安裝 PHP1.2 安裝 Composer二、安裝 ThinkPHP8三、目錄結構解析四、第一個簡單示例&#xff1a;Hello, ThinkPHP84.1 創建控制器4.2 編寫控制器方法4.3 配置路由4.4 訪問測試五、進階示例&#xff1a;數據庫查詢5.1 配置數據庫連接5.2 創建模型5.3 編寫查詢…

智能制造之物料詳解

在制造業業務系統中&#xff0c;物料流轉貫穿“需求→采購→入庫→生產→成品→交付”全流程&#xff0c;各系統通過數據協同實現物料狀態、位置、數量的精準追蹤。以下按流轉階段拆解&#xff1a;一、需求發起與計劃階段&#xff08;CRM/ERP/PLM主導&#xff09;1. 需求源頭…

Qt的安裝和環境配置

QT開發環境的搭建&#xff0c;需要安裝3個部分&#xff0c;C編譯器、Qt SDK(SDK是軟件開發工具包)、QT的集成開發環境(IDE)Qt的3種集成開發環境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要額外的配置&#xff0c;但是有一些bug…

解析MCUboot的實現原理和Image結構

目錄 概述 1 MCUboot的功能 1.1 代碼包結構 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交換 2.5 Image 尾部數據結構 3 交換區 3.1 單交換區 3.2 Multiple Image boot 3.3 Image交換 4 交換狀態&#xff08;swap statu…

YOLOv8目標檢測項目代碼詳解與習題

YOLOv8目標檢測項目代碼詳解與習題一、項目代碼詳解該代碼是基于 YOLOv8 和 OpenCV 實現的圖像目標檢測項目&#xff0c;核心功能是加載預訓練的 YOLOv8 模型&#xff0c;對指定圖像進行目標檢測&#xff0c;然后可視化檢測結果并保存或顯示。以下是逐行解析&#xff1a;# -*- …

gradle關于dependency-management的使用

1、相關文檔Spring官方文檔&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction倉庫版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 對接FreeSwitch

1.增加Maven依賴<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法與實現

費曼學習法學習限流算法為什么要限流mysql插入600次/秒超過這個閾值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕機有哪些算法固定窗口就是個計數器&#xff0c;一秒內超過閾值&#xff0c;不允許訪問缺點&#xff1a;不均勻&#xff0c;跨越臨界點的一秒內&…

Android本地瀏覽PDF(Android PDF.js 簡要學習手冊)

環境 Min SDK: 21 依賴&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"權限&#xff1a; <uses-permission android:name"android.permission.INTERNE…