Python動態規劃:從基礎到高階優化的全面指南(3)

七、動態規劃性能優化實戰

7.1 矩陣快速冪優化
def matrix_mult(A, B):"""矩陣乘法"""n = len(A)m = len(B[0])p = len(B)C = [[0]*m for _ in range(n)]for i in range(n):for k in range(p):if A[i][k]:for j in range(m):C[i][j] += A[i][k] * B[k][j]return Cdef matrix_power(matrix, power):"""矩陣快速冪"""n = len(matrix)# 初始化單位矩陣result = [[1 if i==j else 0 for j in range(n)] for i in range(n)]base = matrixwhile power:if power & 1:result = matrix_mult(result, base)base = matrix_mult(base, base)power //= 2return resultdef fib_matrix(n):"""O(log n)斐波那契數列"""if n < 2: return n# 轉移矩陣T = [[1, 1],[1, 0]]# 初始狀態 [F(1), F(0)]init = [[1], [0]]# 計算 T^(n-1)T_exp = matrix_power(T, n-1)result = matrix_mult(T_exp, init)return result[0][0]# 測試
print(fib_matrix(100))  # 輸出:354224848179261915075
7.2 四邊形不等式優化
def optimal_bst(keys, freq):"""最優二叉搜索樹 - 四邊形不等式優化"""n = len(keys)# dp[i][j] = keys[i..j]的最小搜索代價dp = [[0]*(n+1) for _ in range(n+1)]# 根節點記錄root = [[0]*(n) for _ in range(n)]# 前綴和prefix = [0]*(n+1)for i in range(n):prefix[i+1] = prefix[i] + freq[i]# 初始化單個節點for i in range(n):dp[i][i] = freq[i]root[i][i] = i# L為子樹長度for L in range(2, n+1):for i in range(n-L+1):j = i+L-1dp[i][j] = float('inf')# 利用四邊形不等式縮小范圍low = root[i][j-1] if j-1 >= i else ihigh = root[i+1][j] if i+1 <= j else jfor r in range(low, high+1):cost = dp[i][r-1] if r > i else 0cost += dp[r+1][j] if r < j else 0cost += prefix[j+1] - prefix[i]if cost < dp[i][j]:dp[i][j] = costroot[i][j] = rreturn dp[0][n-1]# 測試
keys = [10, 12, 20]
freq = [34, 8, 50]
print(optimal_bst(keys, freq))  # 輸出:142

八、動態規劃工程實踐指南

8.1 測試框架設計
import unittestclass TestDP(unittest.TestCase):def test_knapsack(self):weights = [1, 2, 3]values = [6, 10, 12]capacity = 5self.assertEqual(knapsack_01(weights, values, capacity), 22)def test_edit_distance(self):self.assertEqual(min_edit_distance("kitten", "sitting"), 3)def test_stock_profit(self):prices = [7, 1, 5, 3, 6, 4]self.assertEqual(max_profit_k_transactions(prices, 2), 7)# 性能測試def test_performance(self):import timestart = time.time()result = fib_matrix(10000)duration = time.time() - startself.assertTrue(duration < 0.1, f"耗時過長: {duration:.4f}s")if __name__ == "__main__":unittest.main()
8.2 可視化調試工具
def visualize_dp_table(dp, title="DP Table"):"""可視化DP表格"""import matplotlib.pyplot as pltimport seaborn as snsplt.figure(figsize=(10, 8))sns.heatmap(dp, annot=True, fmt=".0f", cmap="YlGnBu")plt.title(title)plt.xlabel("Column")plt.ylabel("Row")plt.show()# 示例:網格最小路徑和
grid = [[1,3,1],[1,5,1],[4,2,1]]
dp = min_path_sum(grid)  # 修改函數返回dp表
visualize_dp_table(dp)
8.3 動態規劃代碼生成器
def dp_code_generator(problem_type, params):"""動態規劃代碼模板生成器"""templates = {"knapsack": """
def knapsack(weights, values, capacity):n = len(weights)dp = [0] * (capacity+1)for i in range(n):for w in range(capacity, weights[i]-1, -1):dp[w] = max(dp[w], dp[w-weights[i]] + values[i])return dp[capacity]""","lcs": """
def longest_common_subsequence(text1, text2):m, n = len(text1), len(text2)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if text1[i-1] == text2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[m][n]"""}return templates.get(problem_type, "# 未支持的動態規劃類型")# 使用示例
print(dp_code_generator("knapsack", {}))

九、動態規劃在AI領域的應用

9.1 強化學習中的值迭代
def value_iteration(grid, discount=0.9, theta=1e-3):"""網格世界值迭代算法"""actions = [(0,1), (1,0), (0,-1), (-1,0)]  # 上右下左states = [(i,j) for i in range(len(grid)) for j in range(len(grid[0]))]V = {s: 0 for s in states}while True:delta = 0for s in states:if grid[s[0]][s[1]] == 'G':  # 目標狀態continuev = V[s]max_value = float('-inf')for a in actions:next_i, next_j = s[0]+a[0], s[1]+a[1]# 邊界檢查if not (0 <= next_i < len(grid) and 0 <= next_j < len(grid[0])):next_s = selse:next_s = (next_i, next_j)# 狀態轉移:確定環境reward = -1if grid[next_s[0]][next_s[1]] == 'G':reward = 100elif grid[next_s[0]][next_s[1]] == 'X':  # 障礙reward = -10next_s = svalue = reward + discount * V[next_s]if value > max_value:max_value = valueV[s] = max_valuedelta = max(delta, abs(v - V[s]))if delta < theta:breakreturn V# 測試網格
grid = [['S', ' ', ' ', 'X'],[' ', 'X', ' ', ' '],[' ', ' ', ' ', 'G']
]
values = value_iteration(grid)
for s, v in values.items():print(f"狀態 {s}: 值 {v:.1f}")
9.2 序列預測中的維特比算法
def viterbi(obs, states, start_p, trans_p, emit_p):"""維特比算法 - 隱馬爾可夫模型解碼"""V = [{}]  # 路徑概率表path = {}  # 路徑記錄表# 初始化初始狀態for st in states:V[0][st] = start_p[st] * emit_p[st][obs[0]]path[st] = [st]# 遞推計算for t in range(1, len(obs)):V.append({})new_path = {}for curr in states:# 計算最大概率路徑(prob, state) = max((V[t-1][prev] * trans_p[prev][curr] * emit_p[curr][obs[t]], prev)for prev in states)V[t][curr] = probnew_path[curr] = path[state] + [curr]path = new_path# 回溯最優路徑(prob, state) = max((V[len(obs)-1][st], st) for st in states)return prob, path[state]# 示例:天氣預測
states = ('Sunny', 'Rainy')
obs = ('walk', 'shop', 'clean')  # 觀測序列
start_p = {'Sunny': 0.6, 'Rainy': 0.4}
trans_p = {'Sunny': {'Sunny': 0.7, 'Rainy': 0.3},'Rainy': {'Sunny': 0.4, 'Rainy': 0.6}
}
emit_p = {'Sunny': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},'Rainy': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1}
}prob, path = viterbi(obs, states, start_p, trans_p, emit_p)
print(f"最可能狀態序列: {path}, 概率: {prob:.6f}")

十、動態規劃的局限與挑戰

  1. 維度災難

    • 狀態空間隨維度指數增長

    • 解決方案:近似動態規劃、蒙特卡洛方法

  2. 連續狀態空間

    • 離散化處理導致精度損失

    • 解決方案:函數逼近、神經網絡

  3. 模型不確定性

    • 狀態轉移概率未知

    • 解決方案:Q學習、模型預測控制

  4. 實時性要求

    • 復雜問題計算時間長

    • 解決方案:啟發式剪枝、并行計算

# 應對維度災難的近似方法示例
def approximate_dp(problem, state_repr, epsilon=0.1):"""近似動態規劃框架"""value_fn = {}  # 值函數近似while True:max_diff = 0for s in problem.states:old_value = value_fn.get(state_repr(s), 0)# 計算新值new_value = max(problem.reward(s, a) + problem.discount * value_fn.get(state_repr(problem.transition(s, a)), 0)for a in problem.actions(s))# 更新值函數value_fn[state_repr(s)] = (1-epsilon)*old_value + epsilon*new_valuemax_diff = max(max_diff, abs(new_value - old_value))if max_diff < problem.theta:breakreturn value_fn

結語:動態規劃的哲學思考

動態規劃不僅是一種算法技術,更是一種解決問題的思維方式

  1. 分解與征服:將大問題拆解為可管理的子問題

  2. 歷史意識:通過記憶避免重復工作

  3. 全局視野:當前決策考慮未來影響

  4. 平衡藝術:在時間與空間、精度與效率間權衡

"動態規劃教會我們的最重要一課是:最優解往往不是一蹴而就的決策,而是一系列精心設計的步驟,每個步驟都建立在前一步的基礎上,共同通向最終目標。"

動態規劃的現代發展趨勢

  1. 深度學習與動態規劃融合(如DRL)

  2. 自動微分動態規劃(ADDP)

  3. 量子動態規劃算法

  4. 分布式動態規劃框架

通過掌握動態規劃,您將獲得解決復雜問題的強大工具,無論是算法競賽中的難題,還是工業級系統中的優化挑戰,動態規劃都將成為您技術武庫中的核心武器。

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

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

相關文章

海外紅人營銷的下一站:APP出海如何布局虛擬網紅與UGC生態?

在全球移動互聯網競爭日益激烈的今天&#xff0c;APP出海推廣的重心正從傳統流量采買和真人KOL合作&#xff0c;逐步向更具未來感的方向演進。虛擬網紅、AI生成內容以及用戶生成內容的融合&#xff0c;正為海外紅人營銷注入全新活力。這不僅是技術革新&#xff0c;更是用戶行為…

CentOS網卡未被托管解決記錄

VMWare掛起關機&#xff0c;又重啟后&#xff0c;出現一些很奇怪的問題。 我的幾臺CentOS的網卡都不見了&#xff0c;顯示網卡未被托管 [rootlocalhost ~]# nmcli device status DEVICE TYPE STATE CONNECTION virbr0 bridge 未托管 -- ens33 …

Node.js 中的內置模板path

1. path的作用&#xff1a;path 是 Node.js 中的一個內置模塊&#xff0c;用于處理文件和目錄路徑。它提供了一些工具來處理路徑字符串&#xff0c;確保路徑操作跨平臺兼容&#xff08;Windows 和 Unix 風格的路徑分隔符&#xff09;2.path的常用方法path.join()和數組的join方…

重生之我在暑假學習微服務第三天《Docker-上篇》

個人主頁&#xff1a;VON文章所屬專欄&#xff1a;微服務系列文章鏈接&#xff1a;重生之我在暑假學習微服務第一天《MybatisPlus-上篇》-CSDN博客重生之我在暑假學習微服務第二天《MybatisPlus-下篇》-CSDN博客時間&#xff1a;每天12點前準時更新 特別聲明&#xff1a;本篇文…

【硬件】LT3763中文手冊

目錄 1.簡介 1.1 特點 1.2 簡述 1.3 典型原理圖 1.4 絕對最大額定值 2.電氣特性 3.引腳功能 4.框圖 4.1 設計電感電流 4.2 電感選擇 4.3 開關MOSFET選擇 4.4 輸入電容選擇 4.5 輸出電容選擇 4.6 CBOOST電容選擇 4.7 INTVCC電容器選擇 4.8 Soft-Start 4.9 輸出電流…

【計算機科學與應用】基于多域變換的視頻水印嵌入算法研究

導讀&#xff1a; 為提升視頻水印在版權保護中的實際應用效果&#xff0c;本文提出一種基于多域變換的視頻水印嵌入算法。該算法結合離散小波變換(Discrete Wavelet Transform, DWT)與離散余弦變換(Discrete Cosine Transformation, DCT)&#xff0c;利用其在時頻域分析與能量…

Axios基本使用

介紹 Axios 是一個基于promise網絡請求庫&#xff0c;作用于node.js和瀏覽器中 特性 從瀏覽器創建 XMLHttpRequests從 node.js 創建 http 請求支持 Promise API攔截請求和響應轉換請求和響應數據取消請求自動轉換JSON數據客戶端支持防御XSRF 安裝 項目中 npm install axi…

【大模型LLM】梯度累積(Gradient Accumulation)原理詳解

梯度累積&#xff08;Gradient Accumulation&#xff09;原理詳解 梯度累積是一種在深度學習訓練中常用的技術&#xff0c;特別適用于顯存有限但希望使用較大批量大小&#xff08;batch size&#xff09;的情況。通過梯度累積&#xff0c;可以在不增加單個批次大小的情況下模擬…

阿里云Ubuntu 22.04 ssh隔一段時間自動斷開的解決方法

在使用ssh連接阿里云ubuntu22.04隔一段時間之后就自動斷開&#xff0c;很影響體驗&#xff0c;按照如下配置就可以解決vim /etc/ssh/sshd_config

R中匹配函數

在 R 中&#xff0c;字符串匹配是一個常見的任務&#xff0c;可以使用正則表達式或非正則表達式的方法來完成。以下是對這些方法的總結&#xff0c;包括在向量和數據框中的應用。 正則表達式匹配 常用函數grepl&#xff1a; 功能&#xff1a;檢查向量中的每個元素是否匹配某個正…

Ubuntu服務器上JSP運行緩慢怎么辦?全面排查與優化方案

隨著企業系統越來越多地部署在Linux平臺上&#xff0c;Ubuntu成為JSP Web系統常見的部署環境。但不少開發者會遇到一個共同的問題&#xff1a;在Ubuntu服務器上運行的JSP項目訪問緩慢、頁面加載時間長&#xff0c;甚至出現卡頓現象。這類問題如果不及時解決&#xff0c;容易導致…

web刷題

[極客大挑戰 2019]RCE ME 打開環境&#xff0c;代碼邏輯還是很簡單的 思路是傳參code參數&#xff0c;一般傳參shell然后用蟻劍連接看flag&#xff0c;但是這題做了之后就會發現思路是沒錯但是這題多了一些驗證&#xff0c;這題就是無字符rce&#xff0c;可以考慮用取反&…

FFmpeg+javacpp中FFmpegFrameGrabber

FFmpegjavacpp中FFmpegFrameGrabber1、FFmpegFrameGrabber1.1 Demo使用1.2 音頻相關1.3 視頻相關2、Frame屬性2.1 視頻幀屬性2.2 音頻幀屬性2.3 音頻視頻區分JavaCV 1.5.12 API JavaCPP Presets for FFmpeg 7.1.1-1.5.12 API1、FFmpegFrameGrabber org\bytedeco\javacv\FFmpeg…

1-FPGA的LUT理解

FPGA的LUT理解 FPGA的4輸入LUT中&#xff0c;SRAM存儲的16位二進制數&#xff08;如 0110100110010110&#xff09;直接對應真值表的輸出值。下面通過具體例子詳細解釋其含義&#xff1a; 1. 4輸入LUT 4輸入LUT的本質是一個161的SRAM&#xff0c;它通過存儲真值表的方式實現任意…

Vue2文件上傳相關

導入彈窗<template><el-dialog:title"title":visible.sync"fileUploadVisible"append-to-bodyclose-on-click-modalclose-on-press-escapewidth"420px"><div v-if"showDatePicker">選擇時間&#xff1a;<el-date…

vue使用xlsx庫導出excel

引入xlsx庫 import XLSX from "xlsx";將后端接口返回的數據和列名&#xff0c;拼接到XLSX.utils.aoa_to_sheet中exportExcel() {debugger;if (!this.feedingTableData || this.feedingTableData.length "0") {this.$message.error("投料信息為空&…

卷積神經網絡(CNN)處理流程(簡化版)

前言 是看了這個大佬的視頻后想進行一下自己的整理&#xff08;流程只到了扁平化&#xff09;&#xff0c;如果有問題希望各位大佬能夠給予指正。卷積神經網絡&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分鐘帶你快速了解&#xff01;_嗶哩嗶哩_bilibilihttps://www.…

DBSyncer:開源免費的全能數據同步工具,多數據源無縫支持!

DBSyncer&#xff08;英[dbs??k??]&#xff0c;美[dbs??k?? 簡稱dbs&#xff09;是一款開源的數據同步中間件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步場景。支持上傳插件自定義同步轉換業務&#xff0c;提供…

kafka開啟Kerberos使用方式

kafka SASL_PLAINTEXT serviceName 配置&#xff1a; /etc/security/keytabs/kafka.service.keytab 對應的用戶名 $ cat /home/sunxy/kafka/jaas25.conf KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue renewTickettrue serviceName“ocd…

Unity教程(二十四)技能系統 投劍技能(中)技能變種實現

Unity開發2D類銀河惡魔城游戲學習筆記 Unity開發2D類銀河惡魔城游戲學習筆記目錄 技能系統 Unity教程&#xff08;二十一&#xff09;技能系統 基礎部分 Unity教程&#xff08;二十二&#xff09;技能系統 分身技能 Unity教程&#xff08;二十三&#xff09;技能系統 擲劍技能…