運籌學之模擬退火

目錄

  • 一、歷史
  • 二、精髓思想
  • 三、案例與代碼實現

一、歷史

  • 問:誰在什么時候提出模擬退火?
  • 答:模擬退火算法(Simulated Annealing,SA)是由斯圖爾特·柯爾斯基(Scott Kirkpatrick) 等人在 1983年 提出的。
  • 論文:“Optimization by Simulated Annealing”, published in Science, Vol. 220
  • 動機:解決組合優化問題
    在這里插入圖片描述

二、精髓思想

  • 精髓就兩字:退火!
  • 解釋:字面意思就是模擬打鐵的退火過程,剛開始打鐵吧溫度比較高,鐵燒的紅紅的容易打出各種形狀,隨著時間變長,溫度逐漸冷卻下來,鐵更硬了,形狀大方向基本確定。

不禁感嘆,以前的物理學家、數學家靈感來源都是自然現象!
在這里插入圖片描述
總結下來其實就3個step:

  1. 拿一塊鐵過來淬火
  2. 打一次看看如何
  3. 給我打到定型

三、案例與代碼實現

  • 題干:
    6艘船靠3個港口,已知達到時間arrival和卸貨時長handling,求最優停靠方案,即等待時長最短。

  • 數據:

ships = {'S1': {'arrival': 0.1, 'handling': 4},'S2': {'arrival': 2.1, 'handling': 3},'S3': {'arrival': 4.2, 'handling': 2},'S4': {'arrival': 6.3, 'handling': 3},'S5': {'arrival': 5.5, 'handling': 2},'S6': {'arrival': 3.9, 'handling': 4},'S7': {'arrival': 3.7, 'handling': 4},'S8': {'arrival': 3.4, 'handling': 4},
}
  • 實現:
    step1:拿一塊鐵過來淬火
# 隨機初始化一塊鐵(船舶調度順序)
initial_order = list(ships.keys()) # 船舶原始順序['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8']
random.shuffle(initial_order)	#	打亂順序 ,可能是['S2', 'S7', 'S6', 'S5', 'S1', 'S3', 'S4', 'S8']
  • step2:打一次看看如何

首先,先評價一下原始模樣如何?用等待時間作為衡量,如下:

current_cost = evaluate(current)
NUM_BERTHS = 3  # 泊位數量
# 評價函數:計算某個調度順序的總等待時間
def evaluate(order):berth_times = [0] * NUM_BERTHStotal_wait = 0for ship_id in order:arrival = ships[ship_id]['arrival']handling = ships[ship_id]['handling']# 找到最早可用泊位berth_index = min(range(NUM_BERTHS), key=lambda i: max(arrival, berth_times[i]))# start_time = 開始卸貨時間 = max(到達時間, 泊位可用時間)。# 解釋:要卸貨的話,船先到達了沒有泊位可用也得等,反之,有空泊位了船還沒到也得等。start_time = max(arrival, berth_times[berth_index])wait_time = start_time - arrivaltotal_wait += wait_timeberth_times[berth_index] = start_time + handlingreturn total_wait

然后,開始下錘子了(稱之為擾動)

# 生成鄰域解(隨機交換兩艘船順序)
def neighbor(order):new_order = order.copy()i, j = random.sample(range(len(order)), 2)new_order[i], new_order[j] = new_order[j], new_order[i]return new_order

緊接著,評估下現在模樣和上一次區別,如下:

new = neighbor(current)
new_cost = evaluate(new)
delta = new_cost - current_cost	# 擾動之后的區別

最后,做決定是接著現在模樣往下繼續打,還是恢復回原來模樣

# 情況1:delta < 0 說明等待時間變短了呀,打鐵打得更好了,欣然接受。
# 情況2:delta >= 0 說明等待時間變長了,糟糕打偏了,不過沒關系,這是藝術啊!不完美也是一種美!看心情決定~
# 于是有了 random.random() < math.exp(-delta / T)這一項
# 解釋:random.random()就是一個隨機值(類比于當時心情),值域范圍[0.0, 1.0)
# math.exp(-delta / T)和delta、T有關系,這么來看吧,假設現在超級無敵高溫,那么-delta / T趨于0,那么math.exp(-delta / T)趨于1,說明有很大概率接受比較差的解。假設現在溫度快降到0了,那么-delta / T趨于負無窮,那么math.exp(-delta / T)趨于0,說明有極小概率接受比較差的解。
if delta < 0 or random.random() < math.exp(-delta / T):current = newcurrent_cost = new_cost
  • step3:給我打到定型

循環的過程,就是往復step2的過程,持續下去直到定型,如下:

# 模擬退火主過程
# 初始順序:initial_order, 溫度:T=100.0, 冷卻率:cooling_rate=0.95, 最低溫度:T_min=1e-3
def simulated_annealing(initial_order, T=100.0, cooling_rate=0.95, T_min=1e-3):current = initial_ordercurrent_cost = evaluate(current)best = currentbest_cost = current_costwhile T > T_min:for _ in range(100):  # 每個溫度嘗試多次擾動new = neighbor(current)new_cost = evaluate(new)delta = new_cost - current_costif delta < 0 or random.random() < math.exp(-delta / T):current = newcurrent_cost = new_costif current_cost < best_cost:best = currentbest_cost = current_costT *= cooling_rate  # 降溫return best, best_cost

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

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

相關文章

android測試依賴

Android 項目中常用的測試相關庫 1. androidx.arch.core:core-testing:2.2.0 作用&#xff1a; 提供與 Android Architecture Components&#xff08;如 LiveData、ViewModel&#xff09;相關的測試工具。主要用于測試基于 LiveData 的異步操作。 常見功能&#xff1a; 即時…

stack,queue和priority_queue

1. stack 1.1 stack 的介紹 棧是一種容器適配器&#xff0c;專門設計用于LIFO環境&#xff08;后進先出&#xff09;&#xff0c;其中元素僅從容器的一端插入和提取。 容器適配器&#xff0c;也就是使用特定容器類的封裝對象作為其底層容器&#xff0c;提供一組特定的成員函…

MinnowBoard MAX單板UEFI BIOS代碼編譯教程

此教程用于UEFI EDK2代碼的研究&#xff0c;雖然EDK2框架代碼開源&#xff0c;但是都是在模擬器上跑仿真&#xff0c;差點意思&#xff0c;搞過嵌入式的應該有一個共識&#xff0c;是騾子是馬&#xff0c;你得把板子點亮啊。MinnowBoard MAX單板是intel10多年前發布的軟硬件全部…

AI Transformers 架構體系 權重文件類型 safeterson和gguf格式轉換【2-1】

模型權重文件&#xff1a;存儲訓練好的模型參數,也就是w和b&#xff0c;是模型推理和微調的基礎 .pt、.ckpt、.safetensors、gguf 配置文件&#xff1a;確保模型架構的一致性&#xff0c;使得權重文件能夠正確加載 config.json、generation_config.json 詞匯表文件&#xff1a;…

K8S微服務部署及模擬故障觀測

概述 本文介紹了如何在 Kubernetes (K8S) 集群中部署微服務&#xff0c;并模擬常見的故障場景&#xff08;如 Pod 故障、節點故障、網絡故障&#xff09;以測試系統的容錯能力。通過本實驗&#xff0c;了解 Kubernetes 的自動恢復機制以及如何通過監控和日志分析快速定位和解決…

OpenStack Yoga版安裝筆記(23)Swift安裝

一、官方文檔 Object Storage Install Guide — Swift 2.29.3.dev5 documentation 二、環境準備 之前的實驗&#xff0c;已經有controller, compute1, block1節點&#xff0c;并已經完成Keystone、Glance、Nova、Neutron、Cinder等主要OpenStack Service的安裝。 此處新增…

06-libVLC的視頻播放器:推流RTMP

創建媒體對象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 創建失敗返回錯誤 libvlc_media_new_path:根據文件路徑創建媒體對象。注意:toStdString().c_str() 在Qt中可能存在臨時字符串析構問題,建議…

少兒編程路線規劃

少兒編程路線規劃—一文寫明白 現在有很多的編程機構&#xff0c;五花八門的。我有幸也見識到了大家的營銷策略。這些策略有黑有白吧&#xff0c;從業幾年&#xff0c;沉淀下來一些客戶角度的干貨&#xff0c;分享給大家。 如果是想以很遠很遠的就業為目的&#xff0c;畢業就…

ios app的ipa文件提交最簡單的方法

ipa文件是ios的app打包后生成的二級制文件&#xff0c;在上架app store connect或做testflight測試的時候&#xff0c;它提示我們需要使用xcode、transporter或xcode命令行等方式來上傳。 而xcode、transporter或xcode命令行的安裝都需要使用mac電腦&#xff0c;假如沒有mac電…

怎么查看LLM Transformer 架構進行并行計算和設備映射

怎么查看LLM Transformer 架構進行并行計算和設備映射 num_hidden_layers = model.config.num_hidden_layers print(num_hidden_layers) print(model) LLM(大語言模型)通常是基于 Transformer 架構 構建的,它由多個模塊化的層(Layer)堆疊組成,每個層都有其獨特的作用。…

微信小程序獲得當前城市,獲得當前天氣

// // 獲取用戶當前所在城市 // wx.getLocation({// type: wgs84, // 默認為 wgs84 返回 gps 坐標,gcj02 返回可用于 wx.openLocation 的坐標 // success: function(res) {// console.log(獲取位置成功, res); // // 使用騰訊地圖API進行逆地址解析 // wx…

美國國土安全部終止資助,CVE漏洞數據庫項目面臨停擺危機

&#xff08;圖片來源&#xff1a;Jerome460 / Shutterstock&#xff09; 25年漏洞追蹤體系即將終結 美國非營利研發組織MITRE宣布&#xff0c;其與美國國土安全部&#xff08;DHS&#xff09;簽訂的"通用漏洞披露&#xff08;CVE&#xff09;"數據庫維護合同將于2…

Kafka下載和使用(Windows版)

Apache Kafka 是一個高吞吐量的分布式消息系統&#xff0c;廣泛應用于日志收集、實時流處理等場景。本文將以 Windows 系統為例&#xff0c;詳細介紹 Kafka 的安裝和使用方法。 一、安裝方式 在 Windows 系統上運行 Apache Kafka&#xff0c;通常有兩種方式&#xff1a; 1.W…

RBAC的使用

1、簡述RBAC的作用及工作流程 Rbac基于角色訪問控制&#xff0c;用于管理用戶對集群資源的訪問權限&#xff0c;通過定義角色和綁定規則&#xff0c;將用戶與權限進行關聯&#xff0c;作用&#xff1a;權限精細化管理&#xff0c;操作便捷與統一管理&#xff0c;動態調整權限。…

【2025年泰迪杯數據挖掘挑戰賽】A題 數據分析+問題建模與求解+Python代碼直接分享

目錄 2025年泰迪杯數據挖掘挑戰賽A題完整論文&#xff1a;建模與求解Python代碼1問題一的思路與求解1.1 問題一的思路1.1.1對統計數據進行必要說明&#xff1a;1.1.2統計流程&#xff1a;1.1.3特殊情況的考慮&#xff1a; 1.2 問題一的求解1.2.1代碼實現1.2.2 問題一結果代碼分…

Ethan獨立開發產品日報 | 2025-04-18

1. Wiza Monitor 跟蹤工作變動&#xff0c;并獲取 Slack 和電子郵件通知。 Wiza Monitor是一款工作變動跟蹤工具&#xff0c;可以實時追蹤客戶和潛在客戶的職位變動&#xff0c;您還能通過電子郵件和Slack接收提醒&#xff0c;并自動更新您的客戶關系管理系統&#xff08;CRM…

【工具變量】A股上市公司信息披露質量KV指數測算數據集(含do代碼 1991-2024年)

KV指數&#xff08;Key Value Index&#xff09;作為評估信息披露質量的關鍵指標&#xff0c;在證券市場&#xff0c;尤其是A股市場上市公司信息披露監管與評估中占據重要地位。該指數通過系統化、定量化的方法&#xff0c;對企業發布的信息進行全面剖析與打分&#xff0c;精準…

【java實現+4種變體完整例子】排序算法中【基數排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

基數排序詳解及代碼示例 基數排序原理 基數排序通過處理每一位數字進行排序&#xff0c;分為 LSD&#xff08;最低位優先&#xff09; 和 MSD&#xff08;最高位優先&#xff09; 兩種方式。核心步驟&#xff1a; 確定最大值&#xff1a;計算數組中最大數的位數。逐位排序&am…

服務治理-服務發現和負載均衡

第一步&#xff1a;引入依賴 第二步&#xff1a;配置地址 改寫購物車服務的代碼 負載均衡成功實現。 假如有一個服務掛了&#xff0c;比如說8081&#xff0c;cart-service能不能正常訪問&#xff0c;感知到。 再重新啟動8081端口。 不管服務宕機也好&#xff0c;還是服務剛啟動…

專題十六:虛擬路由冗余協議——VRRP

一、VRRP簡介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;虛擬路由冗余協議通過把幾臺設備聯合組成一臺虛擬的設備&#xff0c;使用一定的機制保證當主機的下一跳設備出現故障時&#xff0c;及時將業務切換到備份設備&#xff0c;從而保持通訊的連續性和…