隨機游動算法解決kSAT問題

input:n個變量的k-CNF公式

ouput:該公式的一組滿足賦值或宣布沒有滿足賦值

算法步驟:

  1. 隨機均勻地初始化賦值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a{0,1}n.
  2. 重復t次(后面會估計這個t):
    a. 如果在當前賦值下公式滿足,則停止并輸出滿足賦值;
    b. 找到某個C是不可滿足的子句;
    c. 顯然C中不超過k個文字,隨機選擇其中一個,改變其賦值.

以上就是完整算法,很簡潔且暴力。下面主要分析它的時間復雜度。

首先問題變量的狀態空間是 2 n 2^n 2n的(每個變量取0或1),所以其窮舉算法的時間為 O ( 2 n ) O(2^n) O(2n)。而上述的隨機游動算法可以將這個底數2優化為 c ∈ ( 1 , 2 ) c\in(1,2) c(1,2)即時間復雜度為 O ( c n ) O(c^n) O(cn),因此我們稱其為改進的指數時間算法。這對于kSAT這些npc問題是很好的優化了。下面我們找出這個c的表達式。

Part 1:

假設公式可滿足,某個滿足賦值為 x ? x^* x?,定義隨機變量X為當前賦值 x x x x ? x^* x?不同變量的個數,顯然X服從二項分布B(n,0.5).當X=d時,將 x x x變成 x ? x^* x??需要改變賦值的變元個數為d.

賦值改變這個過程可以看成馬爾科夫鏈,狀態0,1,…,n表示 x x x x ? x^* x?之間的漢明距離(i.e. 不同變量的個數),算法步驟1的隨機初始化就是從開始狀態到狀態d,轉移概率為 C n j 2 ? n C^j_n2^{-n} Cnj?2?n.

算法步驟2.3中因為C是不可滿足的子句,在C中的至多k個變量中,至少有一個的賦值和 x ? x^* x?不同,該操作從狀態d到d-1的概率至少為 p = 1 k p=\frac{1}{k} p=k1?,到d+1的概率至多為 1 ? p = k ? 1 k 1-p=\frac{k-1}{k} 1?p=kk?1?.至此我們得到了一個廣義的Gambler’s ruin問題.

在這里插入圖片描述
Part 2:

定義從狀態d隨機移動到狀態0的概率為 P ( d ) P(d) P(d)?,從Part 1的討論中我們可以得到問題的轉移方程:
P ( d ) = p P ( d ? 1 ) + ( 1 ? p ) P ( d + 1 ) P(d)=pP(d-1)+(1-p)P(d+1) P(d)=pP(d?1)+(1?p)P(d+1)
其中 P ( 0 ) = 1 P(0)=1 P(0)=1.(區別于賭徒破產問題,我們只有狀態0這一個吸收態)雖然狀態沒有拓撲序,無法從初始狀態直接遞推,但注意到這是一個線性齊次遞推式,我們可以通過解對應的特征方程 ( 1 ? p ) r 2 ? r + p = 0 (1-p)r^2-r+p=0 (1?p)r2?r+p=0構造通解。方程的兩個根為 p 1 ? p \frac{p}{1-p} 1?pp? 1 1 1. 我們有:
P ( n ) = A ( p 1 ? p ) n + B ( 1 ) n = A ( p 1 ? p ) n + B P(n)=A\left(\frac{p}{1-p}\right)^n+B(1)^n=A\left(\frac{p}{1-p}\right)^n+B P(n)=A(1?pp?)n+B(1)n=A(1?pp?)n+B
代入 P ( 0 ) = 1 P(0)=1 P(0)=1 A + B = 1 A+B=1 A+B=1,同時由于概率的非負性, A < 1 A<1 A<1否則我們一定可以找到一個n使得 P ( n ) < 0 P(n)<0 P(n)<0,這樣我們可以得到一個下界:
P ( d ) = A ( p 1 ? p ) d + 1 ? A ≥ ( p 1 ? p ) d P(d)=A\left(\frac{p}{1-p}\right)^d+1-A\geq\left(\frac{p}{1-p}\right)^d P(d)=A(1?pp?)d+1?A(1?pp?)d
代入p得到 P ( d ) ≥ ( k ? 1 ) ? d P(d)\geq(k-1)^{-d} P(d)(k?1)?d

Part 3:

所以當滿足賦值為 x ? x^* x?存在時,我們通過隨機游動找到它的概率為:
P ? ≥ ∑ d n C n d 2 ? n ( k ? 1 ) ? d = 2 ? n ( 1 + 1 k ? 1 ) n ( 二項式定理 ) P^*\geq \sum_{d}^{n} C^d_n2^{-n}(k-1)^{-d}=2^{-n}\left(1+\frac{1}{k-1}\right)^n(二項式定理) P?dn?Cnd?2?n(k?1)?d=2?n(1+k?11?)n(二項式定理)
因此重復次數t的期望為 1 P ? \frac{1}{P^*} P?1?,算法的復雜性為
p o l y ( n ) × 1 P ? = p o l y ( n ) × ( 2 ( 1 ? 1 k ) ) n poly(n)\times\frac{1}{P^*}=poly(n)\times\left(2\left(1-\frac{1}{k}\right)\right)^n poly(n)×P?1?=poly(n)×(2(1?k1?))n
以上,我們通過隨機游動算法給出了kSAT的改進的指數時間的隨機算法.

參考材料:

屈婉玲, 劉田, 張立昂, 王捍貧. 算法設計與分析習題解答與學習指導[M]. 第2版. 北京: 清華大學出版社, 2016.3. ISBN 9787302364924.

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

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

相關文章

企業上線ESOP電子作業指導書系統實現車間無紙化的投入收益數據綜合分析

企業上線ESOP電子作業指導書系統實現車間無紙化的投入收益數據綜合分析 一、成本節約&#xff1a;無紙化直接降低運營成本 紙張與耗材費用銳減 o 杭州科創致遠案例&#xff1a;某汽配企業引入無紙化系統后&#xff0c;年節省紙張耗材費用超50萬元。通過電子化替代傳統紙質文檔…

高并發抽獎系統優化方案

引子 最近接觸了一個抽獎的項目&#xff0c;由于用戶量比較大&#xff0c;而且第三方提供的認證接口并發量有限&#xff0c;為了保證服務的高可用性&#xff0c;所以對高并限制發有一定的要求。經過一系列研究和討論&#xff0c;做出了以下一些優化方案。 需求分析 根據用戶量…

STM32八股【10】-----stm32啟動流程

啟動流程 1.上電復位 2.系統初始化 3.跳轉到 main 函數 啟動入口&#xff1a; cpu被清空&#xff0c;程序從0x00000000開始運行0x00000000存放的是reset_handler的入口地址0x00000000的實際位置會變&#xff0c;根據不同的啟動模式決定啟動模式分為&#xff1a; flash啟動&a…

LLMTIME: 不用微調!如何用大模型玩轉時間序列預測?

今天是端午節&#xff0c;端午安康&#xff01;值此傳統佳節之際&#xff0c;我想和大家分享一篇關于基于大語言模型的時序預測算法——LLMTIME。隨著人工智能技術的飛速發展&#xff0c;利用大型預訓練語言模型&#xff08;LLM&#xff09;進行時間序列預測成為一個新興且極具…

在VirtualBox中打造高效開發環境:CentOS虛擬機安裝與優化指南

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、為何選擇VirtualBox CentOS組合&#xff1f; 對于程序員而言&#xff0c;構建隔離的開發測試環境是剛需。VirtualBox憑借其跨平臺支持&#xff08;W…

LeeCode 98. 驗證二叉搜索樹

給你一個二叉樹的根節點 root &#xff0c;判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下&#xff1a; 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 提示&#xff1a; 樹中節…

Python簡易音樂播放器開發教程

&#x1f4da; 前言 編程基礎第一期《12-30》–音樂播放器是日常生活中常用的應用程序&#xff0c;使用Python和pygame庫可以輕松實現一個簡易的音樂播放器。本教程將詳細講解如何開發一個具有基本功能的音樂播放器&#xff0c;并解析其中涉及的Python編程知識點。 &#x1f6e…

ssh連接斷開,保持任務后臺執行——tmux

目錄 **核心用途****基礎使用方法**1. **安裝 tmux**2. **啟動新會話**3. **常用快捷鍵&#xff08;需先按 Ctrlb 前綴&#xff09;**4. **會話管理命令**5. **窗格操作進階** **典型工作流****注意事項****配置文件&#xff08;~/.tmux.conf&#xff09;** tmux&#xff08; …

3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云

目錄 3D Gaussian splatting 01: 環境搭建3D Gaussian splatting 02: 快速評估3D Gaussian splatting 03: 用戶數據訓練和結果查看3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云3D Gaussian splatting 05: 代碼閱讀-訓練整體流程3D Gaussian splatting 06: 代碼…

每日c/c++題 備戰藍橋杯(P1204 [USACO1.2] 擠牛奶 Milking Cows)

P1204 [USACO1.2] 擠牛奶 Milking Cows - 詳解與代碼實現 一、題目背景 三個農民每天清晨[……]&#xff08;簡要介紹題目背景&#xff0c;與官網描述類似&#xff09; 二、問題分析 輸入要求 &#xff1a;讀取 N 個農民的擠奶時間區間&#xff0c;計算兩個值&#xff1a;最…

保持本地 Git 項目副本與遠程倉庫完全同步

核心目標&#xff1a; 保持本地 Git 項目副本與 GitHub 遠程倉庫完全同步。 關鍵方法&#xff1a; 定期執行 git pull 命令。 操作步驟&#xff1a; 進入項目目錄&#xff1a; 在終端/命令行中&#xff0c;使用 cd 命令切換到你的項目文件夾。執行拉取命令&#xff1a; 運行…

Flutter 4.x 版本 webview_flutter 嵌套H5

踩坑早期版本 使用 WebView 代碼如下 import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class HomePage extends StatelessWidget {const HomePage({super.key});overrideWidget build(BuildContext context) {return Scaffold(ap…

rtpinsertsound:語音注入攻擊!全參數詳細教程!Kali Linux教程!

簡介 2006年8月至9月期間&#xff0c;我們創建了一個用于將音頻插入指定音頻&#xff08;即RTP&#xff09;流的工具。該工具名為rtpinsertsound。 該工具已在Linux Red Hat Fedora Core 4平臺&#xff08;奔騰IV&#xff0c;2.5 GHz&#xff09;上進行了測試&#xff0c;但預…

跑步前熱身動作

跑前熱身的核心目標是升高體溫、激活肌肉、預防損傷 &#xff0c;同時通過動態動作提升運動表現。熱身&#xff08;步驟關節→肌肉→心肺&#xff09;和針對性動作&#xff08;如抱膝抬腿&#xff09;能有效降低受傷風險&#xff0c;建議每次跑步前嚴格執行。 推薦跑前熱身動作…

GIT命令行的一些常規操作

放棄修改 git checkout . 修改commit信息 git commit --amend 撤銷上次本地commit 1、通過git log查看上次提交的哈希值 2、git reset --soft 哈希值 分支 1.創建本地分支 git branch 分支名 2.切換本地分支 git checkout mybranch&#xff1b; 3.創建一個新分支并…

RAGFlow從理論到實戰的檢索增強生成指南

目錄 前言 一、RAGFlow是什么&#xff1f;為何需要它&#xff1f; 二、RAGFlow技術架構拆解 三、實戰指南&#xff1a;從0到1搭建RAGFlow系統 步驟1&#xff1a;環境準備 步驟2&#xff1a;數據接入 步驟3&#xff1a;檢索與生成 四、優化技巧&#xff1a;讓RAGFlow更精…

軟件工程方法論:在確定性與不確定性的永恒之舞中尋找平衡

當我們談論“軟件工程”時&#xff0c;“工程”二字總暗示著某種如橋梁建造般的精確與可控。然而&#xff0c;軟件的本質卻根植于人類思維的復雜性與需求的流變之中。軟件工程方法論的發展史&#xff0c;并非線性進步的凱歌&#xff0c;而是一部在確定性的渴望與不確定性的現實…

Python打卡訓練營Day41

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 →…

開源版 PyMOL 如何繪制 Galidesivir 分子結構 ?

參閱&#xff1a;開源版PyMol安裝保姆級教程 百度網盤下載 提取碼&#xff1a;csub pip show pymol 簡介: PyMOL是一個Python增強的分子圖形工具。它擅長蛋白質、小分子、密度、表面和軌跡的3D可視化。它還包括分子編輯、射線追蹤和動畫。 先從 www.python.org 下載 python-…

【FPGA】Vivado 保姆級安裝教程 | 從官網下載安裝包開始到安裝完畢 | 每步都有詳細截圖說明 | 支持無腦跟裝

安裝包下載&#xff1a;Xilinx_Vivado Download Link&#xff08;下好后可直接安裝&#xff09; 目錄 &#xff08;有安裝包后&#xff0c;可直接跳轉至 Step5&#xff0c;免得去官網下了&#xff0c;比較麻煩&#xff09; Step1&#xff1a;進入官網 Step2&#xff1a;注冊…