转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46469557


1.SAT问题描写叙述

命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前。先引进一些逻辑符号。



一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使得A 为真. 显然, 假设A 为真, 则 CNF 的每一个子句中必有一个命题变元为 1 (真) 。


2.Las Vegas算法

Las Vegas 算法是利用随机值做出随机选择的一种概率算法,而且不会产生不对的答案。在计算过程中所做出的随机选择,可能使算法比其它算法更快地得到所要求的解。

拉斯维加斯算法不会得到不对的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法找不到解。与蒙特卡罗算法相似,拉斯维加斯算法找到正确解的概率随着它所用的计算时间的添加而提高。

对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失败的概率随意小。

Las Vegas 算法用来搜索包括目标结点的解空间。它用一些随机选择来移动,而不须要在每一个结点都计算一个新的结点。假设成功结点的比例在解空间中相当高,则找到目标结点的概率可能非常高。

当下一个结点的计算比較困难或者系统化地搜索没有什么必要时。採用Las Vegas 算法,会提高计算的效率。当然,下一个结点的随机选择有可能导致找不到成功的结点,可是我们能够反复多次运行,来提高目标结点的效率。

拉斯维加斯算法的一个显著特征是它所作的随机性决策有可能导致算法找不到所需的解,可是通过反复多次运行来克服,在求解NP难问题时,用它往往会收到奇效。


3.C++实现代码

// lasvegas3SAT.cpp : 定义控制台应用程序的入口点。
//
/*********************************
-----------------------------------
Lasvegas算法解决3SAT问题(C++实现代码)
-----------------------------------
Author:牧之丶 Date:2014年
Email:bzhou84@163.com
**********************************/
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iostream> const int n=250;
int M[n][3];
int sign[3*n+1];
int x[101],y[101];
int ok[2];
bool Place( int k)
{
//memset(y,1,101);
int t;
/*for( int j = 1; j <= k - 1; j++)
{
y[j]=~x[j];
}*/
for(int i = 0; i < n; i++)
{
t=0;
for(int j = 0; j < 3; j++)
{
if(M[i][j]>k)
t = t+1;
else
t = t+!(sign[i*3+j]^x[M[i][j]] );
}
if(t<1)
return false;
}
return true;
}
bool SAT_True(int x[])
{
int k = 1;
int count = 0;
int i;
while( k <= 100 )
{
count = 0;
for( i = 0; i <= 1 ; i++ )
{
x[k] = i;
if( Place(k))
{
ok[count] = i;
count ++;
}
}
if( count == 0 ) return false;
i = ok[rand() % count];
x[k] = i;
k++;
}
return true;
} int _tmain(int argc, _TCHAR* argv[])
{ //反复运行20次
//int ncase = 20;
double run_time = 0.0; //运行时间
double run_num = 0.0; //运行次数
time_t start,end;
srand(time(0));
//while(ncase--)
//{
start = clock();
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
M[i][j] = rand()%100+1;
for(int i=1;i<=3*n;i++)
sign[i] = rand()%2; memset(x,0,101*sizeof(int));
int k=1;
while(!SAT_True(x) )
{
k++;
if(k > 100000)
{
printf("failed!\n");
break;
}
}
end = clock();
run_num = k;
run_time += (end - start)/CLOCKS_PER_SEC;
if(k <= 100000)
std::cout << "运行了" << run_num << "次" << std::endl;
//} printf("the running time is : %f\n", run_time);
system("pause");
return 0;
}

4.实验结果及分析

为了測试Las Vegas 的计算效果, 我们用随机产生的3-SAT 模型(每一个子句的长度 l= 3, 且子句里的变元两两不同) 做实例。每种取值运行20次。考虑有可能找不到解的情况,当搜索次数超过十万次,觉得此例子不可满足。

得到的结果为:


參考文献

[1] 张德富.算法设计与分析(高级教程)[M].国防工业出版社,2007.

【先进的算法】Lasvegas算法3SAT问题(C++实现代码)的更多相关文章

  1. GMM算法k-means算法的比较

    1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...

  2. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  3. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  4. 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法

    原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 [源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈 ...

  5. Hash散列算法 Time33算法

    hash在开发由频繁使用.今天time33也许最流行的哈希算法. 算法: 对字符串的每一个字符,迭代的乘以33 原型: hash(i) = hash(i-1)*33 + str[i] ; 在使用时.存 ...

  6. 变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...

  7. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  8. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  9. 【啊哈!算法】算法6:只有五行的Floyd最短路算法

            暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

随机推荐

  1. 使用node.js+babel,支持import/export语法

    如果要在node里面支持import/export default语法步骤: 1.使用npm安装 babel的客户端工具 npm init 会生成package.json文件 2.接着安装bebel客 ...

  2. jquery 获取上一个兄弟元素和下一个兄弟元素

    jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点 jQuery.prevAll(),返回所有之前的兄弟节点 jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点 jQu ...

  3. Flask项目之手机端租房网站的实战开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶项目介绍 产品:关于手机移动端的租房网站 角色:在这个产品中用户包括房东与房客 功能:房东可以在这个平台发布自己的房屋,房客可 ...

  4. GO语言学习(十一)Go 语言循环语句

    Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执行语句块 循环嵌套 在 for 循环中嵌套一个或多个 for 循环 语法 Go语言的For循环有3中形式,只有其中的一种 ...

  5. 安装后,挂载c盘失败

    现象: 安装后,window C盘mount失败 错误内容如下: Error mounting: mount exited with exit code 13: ntfs_attr_pread_i: ...

  6. AES 加密解密

    package XX.XX.XX.test; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  7. 高效的敏感词过滤方法(PHP)

    方法一: ? 1 2 3 4 5 6 7 $badword = array(      '张三','张三丰','张三丰田'  );  $badword1 = array_combine($badwor ...

  8. 再谈ITFriend网站的定位

    在网站开发阶段.内部测试阶段.公开测试阶段,让诸多好友和网友,参与了我们的网站ITFriend的体验和测试.其中,大家非常关心,我们的网站是干什么的.在我们不做任何解释的情况下,有的网站认为ITFri ...

  9. 解决java中ZipFile解压缩时候的中文路径和乱码问题

    JAVA中对jar文件或zip文件解压的时候,能够使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,常常报下面错误: Exception in thr ...

  10. Ubuntu下成功安装QQ2013

    阳光小强最近用Win8系统感觉特别不爽,中午果断换了一个win7系统,又想着能不能搞个双系统(最近在看一些linux东西),于是就开始整起来.结果并不好,linux虽然整好了,但是硬盘全部格式化了,当 ...