您所在的位置:首页 - 科技 - 正文科技

c旅行商问题(退火算法的应用领域及示例)

admin admin 01-16 【科技】 671人已围观

摘要[db:Intro]

作为模拟退火算法应用,讨论旅行商问题(Travelling Salesman Problem,简记为TSP):设有n个城市,用数码1,…,n代表。城市i和城市j之间的距离为d(i,j) i,j=1,…,n.TSP问题是要找遍访每个域市恰好一次的一条回路,且其路径总长度为最短.。

求解TSP的模拟退火算法模型可描述如下:

解空间 解空间S是遍访每个城市恰好一次的所有回路,是{1,……,n}的所有循环排列的集合,S中的成员记为(w1,w2,……,wn),并记wn+1= w1。初始解可选为(1,……,n)

目标函数 此时的目标函数即为访问所有城市的路径总长度或称为代价函数:

我们要求此代价函数的最小值。

新解的产生 随机产生1和n之间的两相异数k和m,

若k<m,则将

(w1,w2,…,wk,wk+1,…,wm,…,wn)

变为:

(w1,w2,…,wm,wm-1,…,wk+1,wk,…,wn).

如果是k>m,则将

(w1,w2,…,wm,wm+1,…,wk,…,wn)

变为:

(wm,wm-1,…,w1,wm+1,…,wk-1,wn,wn-1,…,wk).

上述变换方法可简单说成是“逆转中间或者逆转两端”。

也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法。

代价函数差 设将(w1,w2,……,wn)变换为(u1,u2,……,un),则代价函数差为:

根据上述分析,可写出用模拟退火算法求解TSP问题的伪程序:

Procedure TSPSA:

begin

init-of-T; { T为初始温度}

S={1,……,n}; {S为初始值}

termination=false;

while termination=false

begin

for i=1 to L do

begin

generate(S′form S); { 从当前回路S产生新回路S′}

Δt:=f(S′))-f(S);{f(S)为路径总长}

IF(Δt<0) OR (EXP(-Δt/T)>Random-of-[0,1])

S=S′;

IF the-halt-condition-is-TRUE THEN

termination=true;

End;

T_lower;

End;

End

模拟退火算法的应用很广泛,可以较高的效率求解最大截问题(Max Cut Problem)、0-1背包问题(Zero One Knapsack Problem)、图着色问题(Graph Colouring Problem)、调度问题(Scheduling Problem)等等。 模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下三点:

⑴ 温度T的初始值设置问题。

温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。

⑵ 退火速度问题。

模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索(退火)是相当必要的,但这需要计算时间。实际应用中,要针对具体问题的性质和特征设置合理的退火平衡条件。

⑶ 温度管理问题。

温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:

T(t+1)=k×T(t)

式中k为正的略小于1.00的常数,t为降温的次数 优点:计算过程简单,通用,鲁棒性强,适用于并行处理,可用于求解复杂的非线性优化问题。

缺点:收敛速度慢,执行时间长,算法性能与初始值有关及参数敏感等缺点。

经典模拟退火算法的缺点:

⑴如果降温过程足够缓慢,多得到的解的性能会比较好,但与此相对的是收敛速度太慢;

⑵如果降温过程过快,很可能得不到全局最优解。

模拟退火算法的改进

⑴ 设计合适的状态产生函数,使其根据搜索进程的需要

表现出状态的全空间分散性或局部区域性。

⑵ 设计高效的退火策略。

⑶ 避免状态的迂回搜索。

⑷ 采用并行搜索结构。

⑸ 为避免陷入局部极小,改进对温度的控制方式

⑹ 选择合适的初始状态。

⑺ 设计合适的算法终止准则。

也可通过增加某些环节而实现对模拟退火算法的改进。

主要的改进方式包括:

⑴ 增加升温或重升温过程。在算法进程的适当时机,将温度适当提高,从而可激活各状态的接受概率,以调整搜索进程中的当前状态,避免算法在局部极小解处停滞不前。

⑵ 增加记忆功能。为避免搜索过程中由于执行概率接受环节而遗失当前遇到的最优解,可通过增加存储环节,将一些在这之前好的态记忆下来。

⑶ 增加补充搜索过程。即在退火过程结束后,以搜索到的最优解为初始状态,再次执行模拟退火过程或局部性搜索。

⑷ 对每一当前状态,采用多次搜索策略,以概率接受区域内的最优状态,而非标准SA的单次比较方式。

⑸ 结合其他搜索机制的算法,如遗传算法、混沌搜索等。

⑹上述各方法的综合应用。

何谓“NP完全问题”?

遗传算法GA

遗传算法:

旅行商问题(traveling saleman problem,简称tsp):

已知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回出发城市。如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短?

用图论的术语来说,假设有一个图 g=(v,e),其中v是顶点集,e是边集,设d=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路。

这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商问题(dij≠dji,,任意i,j=1,2,3,…,n)。

若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:

min l=σd(t(i),t(i+1)) (i=1,…,n)

旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法求其近似解。

遗传算法:

初始化过程:用v1,v2,v3,…,vn代表所选n个城市。定义整数pop-size作为染色体的个数,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。

适应度f的计算:对种群中的每个染色体vi,计算其适应度,f=σd(t(i),t(i+1)).

评价函数eval(vi):用来对种群中的每个染色体vi设定一个概率,以使该染色体被选中的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被选择产生后台的机会要大,设alpha∈(0,1),本文定义基于序的评价函数为eval(vi)=alpha*(1-alpha).^(i-1) 。[随机规划与模糊规划]

选择过程:选择过程是以旋转赌轮pop-size次为基础,每次旋转都为新的种群选择一个染色体。赌轮是按每个染色体的适应度进行选择染色体的。

step1 、对每个染色体vi,计算累计概率qi,q0=0;qi=σeval(vj) j=1,…,i;i=1,…pop-size.

step2、从区间(0,pop-size)中产生一个随机数r;

step3、若qi-1<r<qi,则选择第i个染色体 ;

step4、重复step2和step3共pop-size次,这样可以得到pop-size个复制的染色体。

grefenstette编码:由于常规的交叉运算和变异运算会使种群中产生一些无实际意义的染色体,本文采用grefenstette编码《遗传算法原理及应用》可以避免这种情况的出现。所谓的grefenstette编码就是用所选队员在未选(不含淘汰)队员中的位置,如:

8 15 2 16 10 7 4 3 11 14 6 12 9 5 18 13 17 1

对应:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1。

交叉过程:本文采用常规单点交叉。为确定交叉操作的父代,从 到pop-size重复以下过程:从[0,1]中产生一个随机数r,如果r<pc ,则选择vi作为一个父代。

将所选的父代两两组队,随机产生一个位置进行交叉,如:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1

6 12 3 5 6 8 5 6 3 1 8 5 6 3 3 2 1 1

交叉后为:

8 14 2 13 8 6 3 2 5 1 8 5 6 3 3 2 1 1

6 12 3 5 6 8 5 6 3 7 3 4 3 2 4 2 2 1

变异过程:本文采用均匀多点变异。类似交叉操作中选择父代的过程,在r<pm 的标准下选择多个染色体vi作为父代。对每一个选择的父代,随机选择多个位置,使其在每位置按均匀变异(该变异点xk的取值范围为[ukmin,ukmax],产生一个[0,1]中随机数r,该点变异为x'k=ukmin+r(ukmax-ukmin))操作。如:

8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1

变异后:

8 14 2 13 10 6 3 2 2 7 3 4 5 2 4 1 2 1

反grefenstette编码:交叉和变异都是在grefenstette编码之后进行的,为了循环操作和返回最终结果,必须逆grefenstette编码过程,将编码恢复到自然编码。

循环操作:判断是否满足设定的带数xzome,否,则跳入适应度f的计算;是,结束遗传操作,跳出。

//c++的程序

#include<iostream.h>

#include<stdlib.h>

template<class T>

class Graph

{

public:

Graph(int vertices=10)

{

n=vertices;

e=0;

}

~Graph(){}

virtual bool Add(int u,int v,const T& w)=0;

virtual bool Delete(int u,int v)=0;

virtual bool Exist(int u,int v)const=0;

int Vertices()const{return n;}

int Edges()const{return e;}

protected:

int n;

int e;

};

template<class T>

class MGraph:public Graph<T>

{

public:

MGraph(int Vertices=10,T noEdge=0);

~MGraph();

bool Add(int u,int v,const T& w);

bool Delete(int u,int v);

bool Exist(int u,int v)const;

void Floyd(T**& d,int**& path);

void print(int Vertices);

private:

T NoEdge;

T** a;

};

template<class T>

MGraph<T>::MGraph(int Vertices,T noEdge)

{

n=Vertices;

NoEdge=noEdge;

a=new T* [n];

for(int i=0;i<n;i++){

a[i]=new T[n];

a[i][i]=0;

for(int j=0;j<n;j++)if(i!=j)a[i][j]=NoEdge;

}

}

template<class T>

MGraph<T>::~MGraph()

{

for(int i=0;i<n;i++)delete[]a[i];

delete[]a;

}

template<class T>

bool MGraph<T>::Exist(int u,int v)const

{

if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==NoEdge)return false;

return true;

}

template<class T>

bool MGraph<T>::Add(int u,int v,const T& w)

{

if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]!=NoEdge){

cerr<<"BadInput!"<<endl;

return false;

}

a[u][v]=w;

e++;

return true;

}

template<class T>

bool MGraph<T>:delete(int u,int v)

{

if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]==NoEdge){

cerr<<"BadInput!"<<endl;

return false;

}

a[u][v]=NoEdge;

e--;

return true;

}

template<class T>

void MGraph<T>::Floyd(T**& d,int**& path)

{

d=new T* [n];

path=new int* [n];

for(int i=0;i<n;i++){

d[i]=new T[n];

path[i]=new int[n];

for(int j=0;j<n;j++){

d[i][j]=a[i][j];

if(i!=j&&a[i][j]<NoEdge)path[i][j]=i;

else path[i][j]=-1;

}

}

for(int k=0;k<n;k++){

for(i=0;i<n;i++)

for(int j=0;j<n;j++)

if(d[i][k]+d[k][j]<d[i][j]){

d[i][j]=d[i][k]+d[k][j];

path[i][j]=path[k][j];

}

}

}

template<class T>

void MGraph<T>::print(int Vertices)

{

for(int i=0;i<Vertices;i++)

for(int j=0;j<Vertices;j++)

{

cout<<a[i][j]<<' ';if(j==Vertices-1)cout<<endl;

}

}

#define noEdge 10000

#include<iostream.h>

void main()

{

cout<<"请输入该图的节点数:"<<endl;

int vertices;

cin>>vertices;

MGraph<float> b(vertices,noEdge);

cout<<"请输入u,v,w:"<<endl;

int u,v;

float w;

cin>>u>>v>>w;

while(w!=noEdge){

//u=u-1;

b.Add(u-1,v-1,w);

b.Add(v-1,u-1,w);

cout<<"请输入u,v,w:"<<endl;

cin>>u>>v>>w;

}

b.print(vertices);

int** Path;

int**& path=Path;

float** D;

float**& d=D;

b.Floyd(d,path);

for(int i=0;i<vertices;i++){

for(int j=0;j<vertices;j++){

cout<<Path[i][j]<<' ';

if(j==vertices-1)cout<<endl;

}

}

int *V;

V=new int[vertices+1];

cout<<"请输入任意一个初始H-圈:"<<endl;

for(int n=0;n<=vertices;n++){

cin>>V[n];

}

for(n=0;n<55;n++){

for(i=0;i<n-1;i++){

for(int j=0;j<n-1;j++)

{

if(i+1>0&&j>i+1&&j<n-1){

if(D[V[i]][V[j]]+D[V[i+1]][V[j+1]]<D[V[i]][V[i+1]]+D[V[j]][V[j+1]]){

int l;

l=V[i+1];V[i+1]=V[j];V[j]=l;

}

}

}

}

}

float total=0;

cout<<"最小回路:"<<endl;

for(i=0;i<=vertices;i++){

cout<<V[i]+1<<' ';

}

cout<<endl;

for(i=0;i<vertices;i++)

total+=D[V[i]][V[i+1]];

cout<<"最短路径长度:"<<endl;

cout<<total;

}

这个你 看得懂么?

P/NP问题 P/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它被“克雷数学研究所”(Clay Mathematics Institute, 简称CMI)在千禧年大奖难题中收录。P/NP问题中包含了复杂度类P与NP的关系。1971年史提芬·古克(Stephen A. Cook) 和 Leonid Levin 相对独立的提出了下面的问题,即是否两个复杂度类P和NP是恒等的(P=NP?)。 P和NP 复杂度类P包含所有那些可以由一个确定型图灵机在多项式表达的时间内解决的问题;类NP由所有其肯定解可以在给定正确信息的多项式时间内验证的决定问题组成,或者等效的说,那些解可以在非确定图灵机上在多项式时间内找出的问题的集合。很可能,计算理论最大的未解决问题就是关于这两类的关系的: P和NP相等吗? 在2002年对于100研究者的调查,61人相信答案是否定的,9个相信答案是肯定的,22个不确定,而8个相信该问题可能和现在所接受的公理独立,所以不可能证明或证否。[1] 对于正确的解答,有一个1,000,000美元的奖励。 NP-完全问题(或者叫NPC)的集合在这个讨论中有重大作用,它们可以大致的被描述为那些在NP中最不像在P中的。(确切定义细节请参看NP-完全)理论计算机科学家现在相信P, NP,和NPC类之间的关系如图中所示,其中P和NPC类不交。 假设P ≠ NP的复杂度类的图解.如P = NP则三个类相同.本质上,P = NP问题问道:如果是/不是问题的正面答案可以很快验证,其答案是否也可以很快计算?这里有一个给你找点这个问题的感觉的例子。给定一个大数Y,我们可以问Y是否是复合数。例如,我们可能问53308290611是否有非平凡的因子。回答是肯定的,虽然手工找出一个因子很麻烦。从另一个方面讲,如果有人声称答案是"对,因为224737可以整除53308290611",则我们可以很快用一个除法来验证。验证一个数是除数比首先找出除数来简单得多。用于验证一个正面答案所需的信息也称为证书。所以我们的结论是,给定 正确的证书,问题的正面答案可以很快的(也就是,在多项式时间内)验证,而这就是这个问题属于NP的原因。虽然这个特定的问题,最近被证明为也在P类中(参看下面的关于"质数在P中"的参考),这一点也不明显,而且有很多类似的问题相信不属于类P。 限制到是/不是问题并没有改变问题;即使我们允许更复杂的答案,最后的问题(是否FP = FNP)是等价的。 形式化定义 更正式一些,一个决定问题是一个取一些字符串为输入并要求输出为是或否的问题。若有一个算法(譬如图灵机,或一个LISP或Pascal的程序并有无限的内存)能够在最多nk步内对一个串长度为n的输入给出正确答案,其中k是某个不依赖于输入串的常数,则我们称该问题可以在多项式时间内解决,并且将它置入类P。直观的讲,我们将P中的问题视为可以较快解决的问题。 现在假设有一个算法A(w,C)取两个参数,一个串w,也就是我们的决定问题的输入串,而另一个串C是“建议证明”,并且使得A在最多nk步之内产生“是/否”答案(其中n是w的长度而k不依赖于w)。进一步假设 w是一个答案为“是”的例子,当且仅当,存在C使得A(w,C)返回“是”。 则我们称这个问题可以在非决定性多项式时间内解决,且将它放入NP类。我们把算法A作为一个所建议的证明的检验器,它运行足够快。(注意缩写NP代表“Non-deterministic(非确定性)Polynomial(多项式)”而不是代表“Non-Polynomial(非多项式)。) NP完全 要解决P = NP问题,NP完全的概念非常有用。不严格的讲,NP完全问题是NP类中“最难”的问题,也就是说它们是最可能不属于P类的。这是因为任何NP中的问题可以在多项式时间内变换成为任何特定NP完全问题的一个特例。例如,旅行商问题的判定问题版本是NP完全的。所以NP中的任何问题的任何特例可以在多项式时间内机械地转换成旅行商问题的一个特例。所以若旅行商问题被证明为在P内,则P = NP!旅行商问题是很多这样的NP完全的问题之一。若任何一个NP完全的问题在P内,则可以推出P = NP。不幸的是,很多重要的问题被证明为NP完全,但没有一个有已知快速的算法。 更难的问题 虽然是否P=NP还是未知的,在P之外的问题是已经知道存在的。寻找国际象棋或围棋最佳走法(在n乘n棋盘上)是指数时间完全的。因为可以证明P ≠ EXPTIME(指数时间),这些问题位于P之外,所以需要比多项式时间更多的时间。判定Presburger算术中的命题是否为真的问题更加困难。Fischer和Rabin于1974年证明每个决定Presburger命题的真伪性的算法有最少2^(2^(cn))的运行时间,c为某个常数。这里,n是Presburger命题的长度。因此,该命题已知需要比指数时间更多的运行时间。不可判定问题是更加困难的,例如停机问题。它们无法在任何给定时间内解决。 P真的容易处理吗? 上面所有的讨论假设了P表示“容易”而“不在P中”表示“困难”。这是一个在复杂度理论中常见而且有一定准确性的假设,它在实践中却不总是真的,原因包括如下几点: 它忽略了常数因子。一个需要101000n时间的问题是属于P的(它是线性时间的),但是事实上完全无法处理。一个需要10-100002n时间的问题不是在P中的(它是指数时间的),但是对于n 取值直到几千时还是很容易处理的。 它忽略了指数的大小。一个时间复杂度n1000属于P,但是很难对付。已经证明在P中存在需要任意大的指数的问题(参看时间等级定理)。一个时间复杂度2n/1000的问题不属于P,但对与n直到几千还是容易应对的。 它只考虑了最坏情况的复杂度。可能现实世界中的有些问题在多数时候可以在时间n中解决,但是很偶尔你会看到需要时间2n的特例。这个问题可能有一个多项式的平均时间,但最坏情况是指数式的,所以该问题不属于P。 它只考虑确定性解。可能有一个问题你可以很快解决如果你可以接受出现一点误差的可能,但是确保正确的答案会难得多。这个问题不会属于P,虽然事实上它可以很快求解。这实际上是解决属于NP而还不知道是否属于P的问题的一个办法(参看RP, BPP)。 新的诸如量子电脑这样的计算模型,可能可以快速的解决一些尚未知道是否属于P的问题;但是,没有一个它们已知能够解决的问题是NP完全的。不过,必须注意到P和NP问题的定义是采用象图灵机这样的经典计算模型的属于表述的。所以,即使一个量子计算机算法被发现能够有效的解决一个NP完全问题,我们只是有了一个快速解决困难问题的实际方法,而不是数学类P和NP相等的证明。 计算机科学家为什么认为P ≠ NP? 多数计算机科学家相信P≠NP。该信念的一个关键原因是经过数十年对这些问题的研究,没有人能够发现一个NP完全问题的多项式时间算法。而且,人们早在NP完全的概念出现前就开始寻求这些算法了(Karp的21个NP完全问题,在最早发现的一批中,有所有著名的已经存在的问题]])。进一步地,P = NP这样的结果会导出很多惊人的结果,那些结果现在被相信是不成立的,例如NP = 余NP和P = PH。 也有这样论证的:问题较难求解(NP)但容易验证(P),这和我们日常经验是相符的。 从另一方面讲,某些研究者认为我们过于相信P ≠ NP,而应该也去寻找P = NP的证明。例如,2002年中有这样的声明: 倾向P≠NP的主要论据是在穷尽搜索的领域完全没有本质进展。也就是说,以我的观点,一个很弱的论据。算法的空间是很大的,而我们只是在开始探索的起点。[ . . . ] 费马最後定理的解决也显示非常简单的[sic]问题可能只有用非常深刻的理论才能解决。 — Moshe Vardi,莱斯大学 过分依赖某种投机不是规划研究的一个好的导引。我们必须总是尝试每个问题的两个方向。偏见可能导致著名的数学家无法解决答案和他们的预计相反的著名问题,虽然他们发展了所有所需的方法。 — Anil Nerode, 康奈尔大学 关于证明的难度的结果 虽然百万美元的奖金和大量投入巨大却没有实质性结果的研究足以显示该问题是困难的,还有一些形式化的结果证明为什么该问题可能很难解决。 最常被引用的结果之一设计神喻。假想你有一个魔法机器可以解决单个问题,例如决定一个给定的数字是否为质数,但可以瞬间解决这个问题。我们的新问题是,若我们被允许任意利用这个机器,是否存在我们可以在多项式时间内验证但无法在多项式时间内解决的问题?结果是,依赖于机器能解决的问题,P = NP和P ≠ NP二者都可以证明。这个结论的后果是,任何可以修改来证明该机器的存在性的结果不能解决问题。不幸的是,几乎所有经典的方法和大部分已知的方法可以这样修改(我们称它们在相对化)。 如果这还不算太糟的话,1993年Razborov和Rudich证明的一个结果表明,给定一个特定的可信的假设,在某种意义下“自然”的证明不能解决P = NP问题。[3] 这表明一些现在似乎最有希望的方法不太可能成功。随着更多这类的定理得到证明,该定理的可能证明有越来越多的陷阱要规避。 这实际上也是为什么NP完全问题有用的原因:若有一个多项式时间算法,或者没有一个这样的算法,对于NP完全问题存在,这将用一种相信不被上述结果排除在外的方法来解决P = NP问题。 多项式时间算法 没人知道多项式时间算法对于NP完全问题是否存在。但是如果这样的算法存在,我们已经知道其中的一些了!例如,下面的算法正确的接受了一个NP完全语言,但是没人知道通常它需要多久运行。它是一个多项式时间算法当且仅当P = NP。 // 接受NP完全语言的一个算法子集和。 // // 这是一个多项式时间算法当且仅当P=NP。 // // “多项式时间”表示它在多项式时间内返回“是”,若 // 结果是“是”,否则永远运行。 // // 输入:S = 一个自然数的有限集 // 输出:"是" 如果某个S的子集加起来等于0。 // 否则,它永远运行没有输出。 // 注意: "程序数P" 是你将一个整数P写为二进制,然后 // 将位串考虑为一个程序。 // 每个可能的程序都可以这样产生, // 虽然多数什么也不做因为有语法错误。 // FOR N = 1...infinity FOR P = 1...N 以S为输入运行程序数P N步 IF 程序输出一个不同的整数的列表 AND 所有整数都在S中 AND 整数的和为0 THEN OUTPUT "是" 并 停机 若P = NP,则这是一个接受一个NP完全语言的多项式时间算法。“接受”表示它在多项式时间内给出“是”的答案,但允许在答案是“否”的时候永远运行。 可能我们想要“解决”子集和问题,而不是仅仅“接受”子集和语言。这表示我们想要它总是停机并返回一个“是”或“否”的答案。是否存在任何可能在多项式时间内解决这个问题的算法?没有人知道。但是如果这样的算法存在,那么我们已经知道其中的一些了!只要将上面的算法中的IF语句替换成下面的语句: IF 程序输出一个完整的数学证明 AND 证明的每一步合法 AND 结论是S确实有(或者没有)一个和为0的子集 THEN OUTPUT "是" (或者"不是"如果那被证明了)并停机 逻辑表述 P=NP问题可以用逻辑命题的特定类的可表达性的术语来重新表述。所有P中的语言可以用一阶逻辑加上最小不动点操作(实际上,这允许了递归函数的定义)来表达。类似地,NP是可以用存在性二阶逻辑来表达—也就是,在关系、函数、和子集上排除了全域量词的二阶逻辑。多项式等级,PH中的语言对应与所有的二阶逻辑。这样,“P是NP的真子集吗”这样的问题可以表述为“是否存在性二阶逻辑能够表达带最小不动点操作的一阶逻辑的所不能表达的语言?” 花絮 普林斯顿大学计算机系楼将二进制代码表述的“P=NP?”问题刻进顶楼西面的砖头上。如果证明了P=NP,砖头可以很方便的换成表示“P=NP!”。[4] 康奈尔大学的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:“反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP,该证明y可以在多项式时间内由这样的科学家发现。但是这样的发现还没有发生(虽然这样的科学家试图发现这样的一个证明),我们得到矛盾。

Tags: [db:tag]

icp沪ICP备2023034384号-20 icp粤公网安备 44030902003287号
取消
微信二维码
支付宝二维码

目录[+]