算法分析·回溯法

回溯法

  • 方法概述
  • 算法框架
  • 問題實例
    • TSP 問題
    • n皇后問題
  • 回溯法效率分析

方法概述

回溯法是一個既帶有系統性又帶有跳躍性的搜索算法;

  • **系統性:**它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。
    跳躍性:算法搜索至解空間樹的任一結點時,判斷該結點為根的子樹是否包含問題的解,如果肯定不包含,則跳過以該結點為根的子樹的搜索,逐層向其祖先結點回溯。否則,進入該子樹,繼續深度優先的策略進行搜索。

這種以深度優先的方式系統地搜索問題的解得算法稱為回溯法,它適用于解一些組合數較大的問題。

  • 問題的解向量:回溯法希望一個問題的解能表示成一個𝑛元組 ( 𝑥 1 , 𝑥 2 , … , 𝑥 𝑛 ) (𝑥_1, 𝑥_2, … , 𝑥_𝑛) (x1?,x2?,,xn?)的形式;
  • 顯約束:對分量 𝑥 𝑖 𝑥_𝑖 xi?的取值限定;
  • 隱約束:為滿足問題的解而對不同分量之間施加的約束;
  • 解空間:對于問題的一個實例,解向量滿足顯式約束條件的所有多元組, 構成了該實
    例的一個解空間。

請添加圖片描述

搜索從開始結點(根結點)出發,以深度優先搜索整個解空間。

這個開始結點成為活結點,同時也成為當前的擴展結點。在當前的擴展結點處,搜索向縱深方向移至一個新結點。這個新結點就成為新的活結點,并成為當前擴展結點。

如果在當前的擴展結點處不能再向縱深方向擴展,則當前擴展結點就成為死結點

此時,應往回移動(回溯)至最近的一個活結點處,并使這個活結點成為當前的擴展結點;直到找到一個解或全部解。

請添加圖片描述

基本步驟:

① 針對所給問題,定義問題的解空間;
② 確定易于搜索的解空間結構;
③ 以深度優先方式搜索解空間,并在搜索過程中用剪枝函數避免無效搜索。

常用剪枝函數:

① 用約束函數在擴展結點處剪去不滿足約束的子樹;
② 用限界函數剪去得不到最優解的子樹。

二類常見的解空間樹

① 子集樹:當所給的問題是從𝑛個元素的集合𝑆中找出滿足某種性質的子集時,相應的解空間樹稱為子集樹。子集樹通常有 2 𝑛 2^𝑛 2n個葉子結點,其總結點個數為 2 𝑛 + 1 ? 1 2^{𝑛+1} ? 1 2n+1?1,遍歷子集樹時間為 Ω ( 2 𝑛 ) Ω(2^𝑛) Ω(2n) 。如0-1背包問題,葉結點數為 2 𝑛 2^𝑛 2n,總結點數 2 𝑛 + 1 2^{𝑛+1} 2n+1
② 排列樹:當所給問題是確定𝑛個元素滿足某種性質的排列時,相應的解空間樹稱為排列樹。排列樹通常有𝑛!個葉子結點,因此,遍歷排列樹需要 Ω ( 𝑛 ! ) Ω(𝑛!) Ω(n!)的計算時間。如TSP問題,葉結點數為𝑛!,遍歷時間為 Ω ( 𝑛 ! ) Ω(𝑛!) Ω(n!)

算法框架

回溯法對解空間作深度優先搜索,因此在一般情況下可用遞歸函數來實現回溯法:

子集樹回溯算法的偽代碼為:

Backtrack( int 𝑡 ) //搜索到樹的第𝑡層
{ //由第𝑡層向第𝑡 + 1層擴展,確定𝑥[𝑡]的值if 𝑡 > 𝑛 then output( 𝑥 ); //葉子結點是可行解else while( all Xt) do //𝑋𝑡為當前擴展結點的所有可能取值集合{𝑿[𝑡] = 𝑋𝑡中的第𝑖個值;if( Constraint(𝑡) and Bound( 𝑡 ) )	Backtrack(𝑡 + 1);}
}

排列樹回溯算法的偽代碼為:

Backtrack( int 𝑡 ) //搜索到樹的第𝑡層
{ //由第𝑡層向第𝑡 + 1層擴展,確定𝑥[𝑡]的值if 𝑡 > 𝑛 then output( 𝑥 ); //葉子結點是可行解else for i=t to n do{swap(X[t],X[i]);if( Constraint(𝑡) and Bound( 𝑡 ) )	Backtrack(𝑡 + 1);swap(X[t],X[i]);}
}

問題實例

TSP 問題

旅行商問題。

旅行商從起點出發,遍歷圖中全部節點后回到原點,求最小代價。

一般的深度優先搜索如下所示:
請添加圖片描述

  1. 定義解空間:𝑋 = {12341, 12431, 13241, 13421, 14231, 14321}
  2. 構造解空間樹;
  3. 從A出發按DFS搜索整棵樹。

請添加圖片描述

最優解:13241,14231
成本:25

回溯法基本思想:利用排列生成問題的回溯算法Backtrack(2),對𝑥[] = {1, 2, … , 𝑛}的𝑥[2. . 𝑛]進行全排列,則 (𝑥[1] , 𝑥[2]),(𝑥[2], 𝑥[3]) , … , (𝑥[𝑛], 𝑥[1])構成一個回路。在全排列算法的基礎上,進行路徑計算保存以及進行限界剪枝。

偽代碼如下:

main( int n )
{
𝑎[𝑛][𝑛]; 𝑥[𝑛] = {1,2, … , 𝑛}; 
𝑏𝑒𝑠𝑡𝑥[]; cc=0;
𝑏𝑒𝑠𝑡𝑣 = ∞;//bestx保存當前最佳路徑,bestv保存當前最優值
input(𝑎); //輸入鄰接矩陣
TSPBacktrack(2);
output( 𝑏𝑒𝑠𝑡𝑣, 𝑏𝑒𝑠𝑡𝑥[]);
}TSPBacktrack(int i)
{// 𝑐𝑐記錄(𝑥[1], 𝑥[2]), … , (𝑥[𝑖 ? 1], 𝑥[𝑖])的距離和if(i>n){// 搜索到葉結點,輸出可行解與當前解比較if(cc +a[x[n]][1] < bestv or bestv = ∞){bestv = cc+a[x[n]][1];for(j=1;j<= n; j++) bestx[j]= x[j];}
}
else{for(j=i;j<=n;j++)if(cc+a[x[i-1]][x[j]]<bestv or bestv = ∞)// 限界裁剪子樹}swap(x[i],x[j]);cc += a[x[i-1]][x[i]];TSPBackstrack(i+1);cc -= a[x[i-1]][x[i]];swap(x[i],x[j]);
}

n皇后問題

為了便于分析,我們取n=4.

問題描述:在4 × 4棋盤上放上4個皇后,使皇后彼此不受攻擊。不受攻擊的條件是彼此不在同行(列)、斜線上。求出全部的放法。

解表示:

解編碼:(𝑥1, 𝑥2, 𝑥3, 𝑥4)四元組,𝑥𝑖表示皇后放在第𝑖行上的列號,如(3,1,2,4);
解空間:{ 𝑥1, 𝑥2, 𝑥3, 𝑥4 |𝑥𝑖 ∈ 𝑆, 𝑖 = 1~4)} 𝑆 = {1,2,3,4}

可行解滿足:

  • 顯約束:𝑥𝑖 ∈ 𝑆, 𝑖 = 1~4
  • 隱約束: 請添加圖片描述

請添加圖片描述

遞歸算法:

請添加圖片描述

回溯法效率分析

效率影響因素:
通過前面具體實例的討論容易看出,回溯算法的效率在很大程度上依賴于以下因素:

  • 產生𝑥[𝑡]的時間;
  • 滿足顯約束的𝑥[𝑡]值的個數;
  • 計算約束函數constraint的時間;
  • 計算上界函數bound的時間;
  • 滿足約束函數和上界函數約束的所有𝑥[𝑘]的個數。

好的約束函數能顯著地減少所生成的結點數。但這樣的約束函數往往計算量較大。因此,在選擇約束函數時通常存在生成結點數與約束函數計算量之間的折衷。

效率提高技巧:

對于許多問題而言,在搜索試探時選取𝑥[𝑖]的值順序是任意的。在其它條件相當的前提下,讓可取值最少的𝑥[𝑖]優先。從圖中關于同一問題的2棵不同解空間樹,可以體會到這種策略的潛力。

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

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

相關文章

Golang分布式系統開發實踐指南

Golang分布式系統開發實踐指南 一、為什么選擇Golang&#xff1f; ?原生并發模型? Goroutine和Channel機制天然適合分布式系統的并發需求?高性能編譯? 靜態編譯生成二進制文件&#xff0c;部署簡單&#xff0c;內存占用低?豐富生態? Go Module管理、標準庫支持HTTP/2、…

基于stm32風速風向溫濕度和瓦斯檢測(仿真+代碼)

資料下載地址&#xff1a;基于stm32風速風向溫濕度和瓦斯檢測 一、項目功能 1.風速&#xff0c;風向&#xff0c;溫濕度&#xff0c;瓦斯&#xff0c;報警。 2.可以設置溫濕度&#xff0c;瓦斯&#xff0c;風速報警閾值。 3.數據上傳到云平臺。 二、仿真圖 三、程序 #inc…

桃黑黑反斗戰

1.編寫求解Hanoi漢諾塔的遞歸算法代碼&#xff0c;輸出移動過程&#xff0c;并統計總移動次數。 對不同規模的漢諾塔&#xff0c;給出測試的結果 #include <stdio.h> #include <time.h> int moveCount 0; void hanoi(int n,char source,char auxiliary,char targ…

react-native的token認證流程

在 React Native 中實現 Token 認證是移動應用開發中的常見需求&#xff0c;它用于驗證用戶的身份并授權其訪問受保護的 API 資源。 Token 認證的核心流程&#xff1a; 用戶登錄 (Login): 用戶在前端輸入用戶名和密碼。前端將這些憑據發送到后端 API。后端驗證憑據。如果驗證成…

Dify:詳解 docker-compose.yaml配置文件

詳解 docker-compose.yaml 配置文件 docker-compose.yaml 是用于定義和運行多容器 Docker 應用的配置文件。下面&#xff0c;我們將詳細解釋您提供的 docker-compose.yaml 文件&#xff0c;包括各個服務的作用、配置&#xff0c;以及它們與 .env 文件之間的關系。 文件概覽 自…

Python基于Django的主觀題自動閱卷系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

今日行情明日機會——20250528

上證指數縮量收小陰線&#xff0c;個股跌多漲少&#xff0c;總體情緒偏差&#xff0c;注意風險為主。 深證指數&#xff0c;縮量收小陰線&#xff0c;連續5天陰線&#xff0c;明后天反彈的概率增大&#xff0c;但仍要注意風險。 2025年5月28日漲停股主要行業方向分析 1. 無人…

基于stm32LORA無線抄表系統仿真

資料下載地址&#xff1a;基于stm32LORA無線抄表系統仿真 1、項目介紹 基于LoRa的無線通信的電力抄表系統&#xff0c;采集節點數據&#xff0c;通過LoRa無線通信進行數據傳輸&#xff0c;最后再網關節點上顯示。 2、仿真圖 3、仿真代碼 #include "oled.h" #incl…

不同電腦同一個網絡ip地址一樣嗎

不同電腦在連接同一個WiFi時&#xff0c;它們的IP地址會相同嗎&#xff1f;相信不少朋友都對這個問題感到好奇&#xff0c;今天我們就來詳細探討一下。 一、基礎概念&#xff1a;IP地址的本質與分類 IP地址是分配給網絡設備的唯一標識符&#xff0c;用于在互聯網或局域網中定位…

CentOS 7 下 Redis 從 5.0 升級至 7.4.3 全流程實踐

目錄 前言1 查看 Redis 運行情況與配置1.1 查看 Redis 是否正在運行1.2 連接 Redis 服務并獲取配置信息1.3 查找 redis.conf 配置文件位置 2 關閉舊版本 Redis 實例2.1 使用客戶端命令關閉 Redis2.2 驗證 Redis 是否完全關閉 3 升級 GCC 編譯環境3.1 檢查當前 GCC 版本3.2 安裝…

SQLord: 基于反向數據生成和任務拆解的 Text-to-SQL 企業落地方案

曾在Text-to-SQL方向做過深入的研究&#xff0c;以此為基礎研發的DataAgent在B2B平臺成功落地&#xff0c;因此作為第一作者&#xff0c;在 The Web Conference (WWW’2025, CCF-A) 會議上發表了相關論文&#xff1a; SQLord: A Robust Enterprise Text-to-SQL Solution via R…

內網搭建NTS服務器

內網搭建NTS服務器 關鍵字 : ntp nts ipv6 NTS 是 Network Time Security&#xff08;網絡時間安全&#xff09;的縮寫,是 NTP 的一種安全擴展機制。它利用傳輸層安全&#xff08;TLS&#xff09;和相關數據的認證加密&#xff08;AEAD&#xff09;&#xff0c;為 NTP 的客戶…

AD9268、AD9643調試過程中遇到的問題

Ad9268芯片 AD9268是一款雙通道、16位、80 MSPS/105 MSPS/125 MSPS模數轉換器(ADC)。AD9268旨在支持要求高性能、低成本、小尺寸和多功能的通信應用。雙通道ADC內核采用多級差分流水線架構&#xff0c;集成輸出糾錯邏輯。每個ADC都具有寬帶寬、差分采樣保持模擬輸入放大器&…

用豆包寫單元測試

用豆包寫單元測試&#xff0c; 輸入 vue 模板內容&#xff0c;輸入 參考vue模板內容寫一個單元測試要求用jest.mock實現構造完成&#xff0c;修復bug。npm run test:unit – tests/unit/views/xxx/xxx.spec.js看下 % Stmts 語句覆蓋率&#xff1a;執行到的代碼語句占總語句的比…

css樣式塊重復調用

通譯靈碼解釋。還給了一些示例&#xff0c;包含傳參等內容 scss和sass的區別。scss與sass是兩種樣式編寫風格&#xff0c;scss是大括號加;號形式。而sass是縮進的格式使用scss為什么要要安裝sass呢。sass是一門css預處理器語言。所以要安裝。

【深度學習新浪潮】以圖搜地點是如何實現的?(含大模型方案)

1. 以圖搜地點的實現方式有哪些? 掃描手機照片中的截圖并識別出位置信息,主要有以下幾種實現方式: 通過照片元數據獲取: 原理:現代智能手機拍攝的照片通常會包含Exif(Exchangeable Image File)元數據。Exif中除了有像素信息之外,還包含了光圈、快門、白平衡、ISO、焦距…

DeepSeek R1 與 V3 的全面對比,兩個版本有什么差別?

DeepSeek R1與DeepSeek V3是深度求索&#xff08;DeepSeek&#xff09;公司推出的兩款定位不同的大語言模型&#xff0c;界面上用戶可選擇基礎模型(V3)、深度思考(R1)、聯網搜索。 基礎模型(V3)是DeepSeek的標配,沒有勾選默認就是基礎模型。為了讓用戶更清晰地了解兩款模型的差…

Spring Boot 深度集成 Ollama 指南:從聊天模型配置到生產級應用開發

Spring Boot 深度集成 Ollama 指南&#xff1a;從聊天模型配置到生產級應用開發 前言 在人工智能應用開發中&#xff0c;大語言模型&#xff08;LLM&#xff09;的本地化部署需求日益增長。Ollama 作為開源的本地LLM運行平臺&#xff0c;支持Mistral、LLaMA等主流模型&#x…

查詢oracle進程數和會話數進行優化

查看當前參數配置 首先需要查詢當前的 processes 和 sessions 參數值&#xff0c;以確定是否需要調整。 SQL SHOW PARAMETER processes; SHOW PARAMETER sessions; 這些命令可以顯示當前實例中允許的最大進程數和會話數 查詢當前連接數&#xff0c;查詢并發會話 SELECT COUNT…

頂會新方向:卡爾曼濾波+目標檢測

卡爾曼慮波&#xff0b;目標檢測創新結合&#xff0c;新作準確率突破100%! 一個有前景且好發論文的方向:卡爾曼濾波&#xff0b;目標檢測! 這種創新結合&#xff0c;得到學術界的廣泛認可&#xff0c;多篇成果陸續登上頂會頂刊。例如無人機競速系統 Swift&#xff0c;登上nat…