随机游动算法解决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} Cnj2n.

算法步骤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} 1p=kk1.至此我们得到了一个广义的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(d1)+(1p)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 (1p)r2r+p=0构造通解。方程的两个根为 p 1 − p \frac{p}{1-p} 1pp 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(1pp)n+B(1)n=A(1pp)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(1pp)d+1A(1pp)d
代入p得到 P ( d ) ≥ ( k − 1 ) − d P(d)\geq(k-1)^{-d} P(d)(k1)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(二项式定理) PdnCnd2n(k1)d=2n(1+k11)n(二项式定理)
因此重复次数t的期望为 1 P ∗ \frac{1}{P^*} P1,算法的复杂性为
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)×P1=poly(n)×(2(1k1))n
以上,我们通过随机游动算法给出了kSAT的改进的指数时间的随机算法.

参考材料:

屈婉玲, 刘田, 张立昂, 王捍贫. 算法设计与分析习题解答与学习指导[M]. 第2版. 北京: 清华大学出版社, 2016.3. ISBN 9787302364924.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.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;注册…