数字思路

新一代WEB技术, 下一带网络技术,新一带数字视频技术,每天都是新一代,今天已是下一代!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NP问题

什么叫做NP问题,什么叫做NPC问题?
首先说明一下问题的复杂性和算法的复杂性的区别,下面只考虑时间复杂性。算法的复杂性是指解决问题的一个具体的算法的执行时间,这是算法的性质;问题的复杂性是指这个问题本身的复杂程度,是问题的性质。比如对于排序问题,如果我们只能通过元素间的相互比较来确定元素间的相互位置,而没有其他的附加可用信息,则排序问题的复杂性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情况下是O(nlgn)等等,排序问题的复杂性是指在所有的解决该问题的算法中最好算法的复杂性。问题的复杂性不可能通过枚举各种可能算法来得到,一般都是预先估计一个值,然后从理论上证明。
为了研究问题的复杂性,我们必须将问题抽象,为了简化问题,我们只考虑一类简单的问题,判定性问题,即提出一个问题,只需要回答yes或者no的问题。任何一般的最优化问题都可以转化为一系列判定性问题,比如求图中从A到B的最短路径,可以转化成:从A到B是否有长度为1的路径?从A到B是否有长度为2的路径?。。。从A到B是否有长度为k的路径?如果问到了k的时候回答了yes,则停止发问,我们可以说从A到B的最短路径就是k。如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则我们说这种可以在多项式时间内解决的判定性问题属于P类问题。P类问题就是所有复杂度为多项式时间的问题的集合。然而有些问题很难找到多项式时间的算法(或许根本不存在),比如找出无向图中的哈米尔顿回路问题,但是我们发现如果给了我们该问题的一个答案,我们可以在多项式时间内判断这个答案是否正确。比如说对于哈米尔顿回路问题,给一个任意的回路,我们很容易判断他是否是哈米尔顿回路(只要看是不是所有的顶点都在回路中就可以了)。这种可以在多项式时间内验证一个解是否正确的问题称为NP问题。显然,所有的P类问题都是属于NP问题的,但是现在的问题是,P是否等于NP?这个问题至今还未解决。注意,NP问题不一定都是难解的问题,比如简单的数组排序问题是P类问题,但是P属于NP,所以也是NP问题,你能说他很难解么?刚才说了,现在还不知道是否有P=NP或者P<>NP,但是后来人们发现还有一系列的特殊NP问题,这类问题的特殊性质使得很多人相信P<>NP,只不过现在还无法证明。这类特殊的NP问题就是NP完全问题(NPC问题,C代表complete)。NPC问题存在着一个令人惊讶的性质,即如果一个NPC问题存在多项式时间的算法,则所有的NP问题都可以在多项式时间内求解,即P=NP成立!!这是因为,每一个NPC问题可以在多项式时间内转化成任何一个NP问题。比如前面说的哈米尔顿回路问题就是一个NPC问题。NPC问题的历史并不久,cook在1971年找到了第一个NPC问题,此后人们又陆续发现很多NPC问题,现在可能已经有3000多个了。所以,我们一般认为NPC问题是难解的问题,因为他不太可能存在一个多项式时间的算法(如果存在则所有的NP问题都存在多项式时间算法,这太不可思议了,但是也不是不可能)。类似哈米尔顿回路/路径问题,货郎担问题,集团问题,最小边覆盖问题(注意和路径覆盖的区别),等等很多问题都是NPC问题,所以都是难解的问题。





 

《三国志8》的君主问题和NPC问题

作者:乔公羊  发布:中华三国联盟


《三国志8 》的君主问题

  光荣首先在《太阁立志传》中采用了“角色扮演战略游戏”的设计,玩家可以不扮演君主,而是作为普通武将在电脑君主的指挥下战斗,这样大大提高了游戏的耐玩性,现在许多玩家N 次通关《三国志8 》
也就是为了扮演不同的武将,从而尝试不同的人生。
  而且电脑扮演君主还有一个好处,即能够充分体现不同国家不同政权在统治上各自的特点,但是至今为止却还没有一个游戏能够作出这样的设计。现我论述如下:

  玩家不扮演君主而扮演一般武将的根本理由,是想使游戏增加更多不可知、不可预测的因素,来提高游戏的趣味性,以及通过NPC 人物与玩家的互动来提高游戏的真实性。现在的角色扮演战略游戏的最大问题,偏偏就在于NPC 人物的无所作为,常使玩家感到孤单乏味(毕竟只有自己是真人啊)。
  也许由于电脑AI的限制,电脑君主大部分都无甚作为,即使有所行动,也不外是征兵、进攻、升官等简单而千篇一律的行动。玩家扮演新武将,无论效力孙坚、严白虎(三国),效力上杉谦信、一条兼定(太阁),君主的作为完全没有任何的不同,这样实际上重蹈了扮演君主时千篇一律的问题。要知道,在封建社会里,君主的贤愚,是决定一国盛衰的关键所在。贤明君主治国,任用贤才,国力因此强盛;昏君当道,则不理朝政,奸邪得势,国力因此大衰。如果能通过电脑君主的不同行为产生不同的统治方法,游戏的真实性和耐玩性将大幅提高,电脑AI的限制一直是局限游戏NPC 人物最大问题根源。其实,不通过AI,而只需进行一些系数设置,也能够提升NPC 的互动性。

  首先,“君主的贤愚问题”。很简单的设计,以君主的“能力值”为分界线:君主总是信用那些与自己能力相近的部下。例如一个君主其武、智、政、魅的指数为20、40、80、70,那么他就会重用那些与此数值相近的人物,如果某人物的数值为90、70、20、30,那么他不但得不到君主的重用,反而会遭到疏远,所有提案也会遭否决(象许子将讥笑太史慈),因此才有“良禽择木而栖”的必然性,因为君主无能而叛变或谋反也成为必要。
  玩家效力于能力相近的君主,具体的好处有:1 提案通过的机会较高。2 能获得较多的立功机会,如出阵机会等。3 玩家所能提案的项目受不同限制,能力与君主最相近可以对所有项目进行提案,差距越大所能提案的项目数就越少。如黄皓可以向刘禅提案外交,而姜维就不能。4 与君主的关系增进较快。5 君主根据自己的好恶任命官职,与君主关系好就可以担任高级职务如四征将军,与君主关系差将很难得到提升。
  这样一方面可以增加历史的真实感,也能增加玩家游戏的难度,也能导致游戏更多变化。


  《三国志8 》的NPC 问题

  我玩《三国志8 》和《太阁4 》感到最不爽的是:总是只有我找人家聊天,几乎都没有什么人来找我。即使我当了国主、军团长,人气也没有丝毫增加。NPC 人物只会机械地从事工作,毫无自我个性,使角色扮演毫无趣味。

  第一。我赞成某派的观点:废除历史事件,将之普及成为所有人都能发生的随机事件。没道理只有周瑜能推荐二张,我陈武就不能推荐李异吗;就只有秀吉才能“金崎撤退”吗,难道我新武将就做不来?把原本定得死死的历史事件“解放”出来,大量增加随机事件的数量,尤其是NPC 武将的事件,一些诸如“打死老虎武力上升”之类无伤大雅的小事就多多益善吧。
  联系上面能力值的设定,可以通过一些计算公式,规定一些事件的发生条件,符合条件马上发生事件。例如能力值不符+与君主关系疏远+忠诚度低,就会发生下野或叛变等事件。

  第二。把所有信息都做成事件。原本游戏中用一笔带过的信息,如某人变节、某人去世、某人生病,甚至自然灾害,盗贼横行等等,都作出相应的事件,用CG或动画表现一番。可以大大地增加游戏的信息量,从而增强玩家的切身感受。

  第三。减少人物的数量,同时增强人物的内涵。不知道大家有没发现,《三国志》系列里有很多原本应该在朝廷当“太尉”、“大司马”高官的人却在一些后方小城做小小的城吏,连太守都不是。这是因为光荣没有在《三国志》系列中设计“官职系统”。
  凡是玩过《皇帝》的玩家应该都对那款游戏留下了深刻的印象。该款游戏的最大长处在于成功地模拟出中国古代的中央官制。即使是光荣的《太阁》系列,反而更切合中国的情况而非日本。主要的官员和将领聚居京城,每一城(郡)由中央委派一个太守进行日常内政管理,平时从中央派主管官员直接指导地方建设(类似《太阁4 》)。地方有地方军归太守负责,中央有中央军,归大司马统辖。国家有事,需要进攻或迎敌,则以中央军出战,地方军支援……此间种种设定,我以后再另辟章详述。
  总之,在采用“中央官制”后,由于官员集中京城,每城只需一名太守,因此游戏对武将数量的要求将大为降低,因此把所节约下来的空间用于增强人物的内涵成为可能。

  增强人物内涵之关键,在于联系随机事件的出现,增强NPC 人物与玩家的互动性。让NPC 人物和玩家一样拥有自己的回合——这是关键所在,还要将现有的一些只有玩家能做的事情让NPC 也能执行,如修炼、结婚、打架、与敌国人物交往(《太阁》系列),总之让NPC 在权利上与玩家对等起来,适当减少人物的数量,也是为了使众多人物的行动不至于杂乱无章影响游戏速度,而人物的行为也可以通过编程时进行选项排序来加以约束。
  为了游戏的速度考虑,NPC 的行动可以仅显示与玩家有关系的部分,如同僚、亲友等,与玩家素不相识者或可以省略不做,但为公平起见,虽不显示,能力该升的还是要照升。NPC 与玩家的互动,在刚开始玩家地位低下时应该较少接触,而当玩家位高权重的时候,NPC 会主动接近和笼络,当玩家不胜其烦的时候,《三国志8 》里那句“太过拒人千里之外,会引起反感”才变得有意义。

  这次的灵感用光了,下次在接着谈谈《三国群英3 》的话题。


posted on 2005-10-10 21:20  Bob Pan  阅读(434)  评论(0)    收藏  举报