NPC

这里的想说的NPC不是Non-Player-Controled,非玩家控制角色,而是Non-determinisitc Polynomial complete problem,它属于一类很特殊的问题,迄今为止,没有人能够找出求解NPC问题的多项式时间的算法,同时也没有人能够证明对于这类问题不存在多项式时间算法;

最短(Bellman -Ford)与最长简单路径,欧拉游程(Fleury)和哈密顿回路,2-CNF可满足性和3-CNF可满足性,这些问题看起来差别很小,但是成对的问题中前者存在多项式时间的算法,而后者属于NPC问题,不存在多项式时间的算法;其实算法中关于这个问题的研究感觉也仅仅存在理论意义,应该平时很少会接触到这些东西,异或是真的在实际应用中一个算法的模拟对应的是一个NPC的问题,你证明了这个算法不存在多项式时间解决的算法,此时你只能够改变解决方案或者利用近似的算法进行解决,唯一能够想象的应用场景就是这样,不过这种场景也是少之又少吧,所以还是作为一个学术的问题或者算法中一个经典的问题作为了解,不过话说如果真的有人能够找到其中一个NPC问题的多项式时间算法或者证明了这种算法的不存在性,其对计算机科学的贡献就非常的巨大了,这一类问题均是想通的,解决其中一个所有的都可以解决了,这正是这一类问题的奇妙所在,后面证明NPC问题的方法也体现了这一点,如过仅仅想了解一些概念接下来的稍微介绍一下概念,后面是一些NPC问题的证明可以忽略~

P类问题:多项式时间内可解的问题;

NP类问题:多项式时间内“可验证”的问题;这里的可验证针对某一个问题给出其中一个解决方案,能够在问题输入规模的多项式时间内验证此个解决方案是正确的;

从上面的概念可以看出,P中的任何问题也都属于NP;但是关于P和NP的范围,仍是一个不可解的问题,P属于NP的子集,但是是否为真子集?

NPC类问题,首先这个问题必须属于NP类,但是这个问题的解决难度大于或者等于所有NP中问题的“难度”;难度的定义可以简单理解为一个转换的过程,如果一个问题的所有解决方案可以通过多项式时间转换至另一个问题的解决方案,并且可以通过目的问题的解决问题判定是否属于原问题的解决方案,则成目的问题的难度大于原问题的难度,因为这个过程是单方向的,原问题的所有解决方案可以映射至目标问题集中,但是目标问题集中的部分问题无对应的映射,图示则如下:

理解了这个难度问题就可以理解NPC问题了,NPC问题的“难度”是相当的,并且难度大于所有的NP类问题,所以如果解决了一个NPC问题,也就是说设计了一个NPC问题的多项式时间算法,则所有的NP类问题可以转换为NPC问题,则说明所有NP类和NPC类问题都存在一个多项式时间的算法,是不是很诱人,这还是一个非常大的问题的;

一些常见的NPC问题举例,并且证明结构:

从上至下的问题分别是:

布尔组合电路的可满足性:此问题是一切NPC类问题的鼻祖,证明方法在算法导论中也只是领略了一点,还是一知半解,因为涉及到硬件知识了,就是靠这个问题才知道NPC这个集合非空,然后接下来各种NPC问题被证明;

布尔公式可满足性:布尔变量+布尔连接词+括号组成的公式;

3-CNF可满足性:3-CNF也是布尔公式,形式比较特殊,由子句组成,子句之间用“与”连接,子句由三个变量(or变量的非)的“或”组成;

团问题:无向图中的团是一个顶点子集,其中每一对顶点之间由E中的一条边相连;

顶点覆盖问题:覆盖无向图中所有边E的顶点组成的集合;

哈密顿回路:有向图的简单回路,包含V中每个顶点;

旅行商问题:

子集和问题:

如果只是想要了解看到这里就可以了,下面简单的描述NPC类各种问题的证明方法:

1、证明L属于NP类问题;

2、选取一个已知的NP完全语言L‘

3、描述一种算法来计算一个函数f,它把L’中的每个解决方案x映射到L中的一个解决方案f(x)

4、对于所有的x,函数f满足x属于L‘当且仅当f(x)属于L

5、证明计算函数算法具有多项式运行时间

上面的证明简单的说就是找到一个NP问题,然后该问题的难度如果大于或等于一个已经的NPC问题,则该问题是NPC问题!

刚开始的证明基础是布尔组合电路的可满足性,这个问题设计电路知识,简单的来说,所有的问题编程运行的时候都要在电脑上运行,电脑可以看作一个布尔电路,所以所有NP可以转换为该问题,然后该问题的一个解决方案,就是输入的赋值能够在多项式时间内检验其正确性,所以第一个NPC问题就诞生了,以后问题的证明就可以利用这个已知的NPC问题和上面的证明方法了~

接下来证明方法重要的就是多项式时间的转换的方法!首先,证明属于NP类问题只要找到一个解决方案能够在多项式时间内验证,则属于NP;然后利用多项式时间转换的方法和一个已知的NPC即可证明。

不知道所提的量子计算机是不是和布尔电路的可满足性问题的NPC相关,我只是假设可能量子计算机的概念就是他本身突破了这个布尔电路满足性的NPC问题,所以他能够增加很多速度,这里只是作为一个无知的人随便猜想一下~了解这方向的人可以告诉我一下;

公式可满足性:利用布尔组合电路的可满足性,转换方法:

这个转换比较显而易见,如上图所示;针对每个门电路,利用一个等价的公式,然后所有利用与连接起来,最后连接布尔电路的输出,这样的转换就正确率。如果布尔电路满足,则通过这个多项式的转换至右边的公式时同样能够满足,所以这种转换是正确的;

3-CNF可满足性:

首先将一个布尔公式转换成一个二叉树,如上面所示,这是转换的第一个步骤;

然后针对二叉树利用和第一个一样的原理进行改写,改写成如上图所示的公式;

针对改写后的每项内容,其最多包含3个基本元素,这样利用真值表可以将上面的三个基本元素转换成下面的形式;DNF的形式(析取范式);取反之后可以得到合取范式的形式;

有的项目包含1个元素或者2个元素的则利用上面两条规则转换至3个元素,最后转换为3-CNF的形式,整个转换过程花费多项式时间;所以证明成立~

团问题:

利用3-CNF证明,首先是NP类问题,接着3-CNF进行转换,每个子句的三个元素作为节点,然后连接,两种情况不存在连接:

1、一个元素和它的非形式不进行连接;

2、子句内的元素不进行连接;

这样就转换为团问题的图了,团问题就也为NPC问题了。

顶点覆盖问题:

这里利用团问题进行证明,首先属于NP问题,然后图的团问题转换原图的顶点覆盖问题~

假设G包含一个团V‘是V的子集,且V‘=k,我们断言,V-V‘是G补图中的一个顶点覆盖,设u,v是E补图中的任意边,则u,v不属于E,这说明u或v至少有一个不属于V‘,因为V’中的每一对顶点都有一条E中的边相连接。等价的,u或者v至少有一个属于V-V‘,这意味着边u,v被V-V‘所覆盖。由于u,v是从E的补图中任意选取的边,所以E的补图中的所有边都被V-V‘中的一个顶点所覆盖。

反之,假设G的补图具有一个顶点覆盖V‘属于V,其中V‘=V-k,那么,对于所有u,v属于V,如果u,v属于E的补图,那么u属于V’或者v属于V’或者都属于V’ ,与此相对,对所有u,v属于V,如果u不属于V‘且v不属于V‘,则有u,v属于E,换句话说,V-V‘是一个团,其规模为V-V‘=k,证明结束。

哈密顿回路问题,

旅行商问题,这个问题的证明比较简单,首先该问题本属于一个最优化问题,但是最优化问题都可以通过转换至判定问题。

比如TSP={<G,c,k>:G=(V,E)是一个完全图,c是V*V→Z上的一个函数,k属于Z且G包含一个费用至多为k的旅行商的旅行回路}

这个问题在给出一个实例之后必定能够在多项式的时间对其验证,那么它就属于NP问题。然后通过哈密顿回路证明其为NPC问题。

设G图为一个哈密顿环,构造TSP问题如下,建立完全图G‘,其中定义费用函数

c(i,j)=0  如果i,j属于哈密顿回路中的边

1  如果i,j不属于哈密顿回路中的边

现在说明图G中具有一个哈密顿回路,当且仅当图G‘中有一个费用至多为0的回路。假定图G中有一个哈密顿回路h,h中的每条边都属于E,因此在G‘中的费用为0,因此,h在G’中是费用为0的回路。反之,假定图G‘中有一个费用为h’至多为0的回路。由于E‘中边的费用只能是0和1,所以回路h’的费用就是,且回路上每条边的费用必为0。因此,h‘仅包含E中的边。这样,我们就得出结论,h’是图G中的一个哈密顿回路。

子集和问题;

利用3-CNF进行归约证明

根据一个给定的3-CNF构造如下的一个数字期望和和子集合如下:

其中t的位数是n+k位,其中n是子元素的个数及x下标的个数,k是子句的个数,这里n=3,k=2,所以构造上表。

s1,s1‘,s2,s2‘属于松弛标量,就是在相应的Ci处分别设置1,2,后面证明起松弛的作用,保证后k位满足4;

vi,vi‘是唯一的~,相应位置xi处均标1,主要差别是Ci处标记,如果子句包含xi,则vi处标记1,包含非xi,则vi’处标记1~,这里比较乱,看下表比较清晰了。

接下来就是根据表进行证明3-CNF的满足性等价于这个集合去子集合满足目标t。

如果xi为1,则取vi集合,否则取vi‘集合,这样就满足了t的前n位,同时3-CNF满足,表示子句至少有一个为真,则取的满足前n位的集合子句中至少有一个为1,则其中一个子句必定至少为1,至多为3,然后加上后面的松弛变量si,si’就可以构造出满足t的子集合;

反之,同样的原理,子集必定包含vi或者vi‘其中一个,满足vi,则xi=1,否则xi=0,这样赋值必定能够满足3-CNF,

所以证明结束,子集和问题是一个NPC问题;

时间: 2024-10-31 15:35:25

NPC的相关文章

T端PVP头衔获得NPC脚本

次代码是一个T端的脚本.通过击杀的角色数量等级来获得不同的头衔. 下面的Ranks就是击杀的数量.根据你的击杀数量,你可以到NPC那里去领取对应的头衔等级 #include "ScriptPCH.h" enum Ranks { RANK_1 = 50, RANK_2 = 100, RANK_3 = 500, RANK_4 = 1000, RANK_5 = 2000, RANK_6 = 4000, RANK_7 = 5000, RANK_8 = 6000, RANK_9 = 8000,

算法导论之P、NP、NPC问题

P.NP.NPC 概念 > P问题:能够在多项式时间内解决的决策问题. -举例: 图搜索问题.最短路径问题.最小生成树问题······ > NP问题:不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时间验证的问题. -验证:给定一个问题的实例.证书(类似于证据),需要验证这个证书是这个问题的正确答案. - 举例:汉密尔顿路径,实例为G=(V,E),证书为顶点序列 {v0,v1,v2,v3,-.,vk},我们的目的是要验证这个证书就是这个问题的答案,验证方法为:先遍历一遍这个

什么是P问题、NP问题和NPC问题

本文转自:http://www.matrix67.com/blog/archives/105 这或许是众多OIer最大的误区之一. 你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问题了”之类的话.你要知道,大多数人此时所说的NP问题其实都是指的NPC问题.他们没有搞清楚NP问题和NPC问题的概念.NP问题并不是那种“只有搜才行”的问题,NPC问题才是.好,行了,基本上这个误解已经被澄清了.下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你

NPC问题

研一是密码学专业开的一门课<计算复杂性理论>,当时对立面的NP,NPC这些概念都挺模糊,后来也是不了了之.现在看一些密码学论文的时候经常遇到这一概念,只能硬着头皮搞清楚.下面把自己的理解写下来,一来加深记忆和理解,而来为以后做个储备. 问题分为两种,一种是可以通过明确的公式直接得到答案,比如:1+1=? 另一种无法直接通过公式求解,比如:给一个数,求出它的因子. 对于第二种问题我们求解的途径只能通过猜测验证,例如,我们一个数N的因子的时候,一般方法是猜测因子为a,取a=2,然后验证N是否能被a

关于P、NP、NPC和NP-Hard问题

1.P问题 P中包含的是能在多项式时间内解决的问题,此类问题的时间复杂度不超过O(),期中n为问题输入规模,k为常数. 2.NP问题 NP中包含的是能在多项式时间内验证某个解是否正确的问题. 比如:(1)所有的P问题都是NP问题,因为我们总能在多项式时间内验证给定的某个解是否正确. (2)对于某些不属于P问题的问题,如3-CNF可满足性问题,给出一组变量的赋值序列,我们很容易在多项式时间内验证其布尔表达式的值是否为真. 3.NPC问题 一个问题是 NPC问题必须满足: (1)这个问题是NP问题:

C语言写的NPC管理系统

; }NPC; // //  main.c //  GitDeom // //  Created by 黄桥平 on 14/11/8. //  Copyright (c) 2014年 黄桥平. All rights reserved. // #include <stdio.h> #include<stdlib.h> typedef struct _NPC { int hp; int id; int act; int px,py; char name[20]; }NPC; typed

T端大灾变版本传送大师(NPC 脚本)

#include "ScriptPCH.h"  class npc_teleport : public CreatureScript{    public:        npc_teleport() : CreatureScript("npc_teleport") { }                 bool OnGossipHello(Player *player, Creature *_creature)                {         

T端音乐盒子-NPC脚本

为什么叫音乐盒子呢??这个说简单点,其实就是制作一个NPC,然后让玩家可以在游戏中有选则性的播放游戏音乐!有趣吧? 其实主要用到了PlayDirectSound函数和SendPlaySound函数. 这两个函数都是用来播放声音的..声音当然是在每个玩家的客户端存储着呢! 这个就是Trinity-Core 端3.3.5怀旧魔兽世界私服中能用到的播放音乐的NPC脚本,大家可以试试 // By Asbert75 (Help from Jameyboor) // // Jukebox // #inclu

T端无限制附魔NPC脚本

1.首先,这个是脚本代码.你需要知道Trinity-Core如何增加脚本 2.这个是一套NPC的脚本. 3.脚本功能就是通过NPC来给自己身上的物品附魔(附魔都知道吧?) 5.你需要在creature_template里面加上对应的NPC,然后使用npc_enchantment脚本名称,.然后进入游戏用.npc add 来增加该功能NPC 下面是代码 #include "ScriptPCH.h" class npc_enchantment : public CreatureScript

计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)

实验课安排 地点: 科技楼423 时间:  计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家. 实验内容 (1)八皇后及N皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一行.同一列或同一斜线上.问有多少种摆法. 高斯觉得有76种方案.1