组合博弈取石子游戏综述_第1页
组合博弈取石子游戏综述_第2页
组合博弈取石子游戏综述_第3页
组合博弈取石子游戏综述_第4页
组合博弈取石子游戏综述_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、博弈问题分析一一取石子游戏实例解答<1>小红是个游戏迷,他和小蓝一起玩拿石子游戏。游戏规则为2个人轮流拿石子。 一次可以拿1颗或3颗,规定谁取到最后一颗石子谁就胜出。最后决定由小红先取。两人都是 游戏高手,该赢的绝不会输(表示不会失误)。问在知道石子总数的情况下,怎样快速预测谁将会胜出。分析:小红和小蓝各取一次共有三种情况:共取走2颗石子(1,1)共取走4颗石子(1,3)共取走6颗石子(3,3)设方案取了 N1次,方案取了 N2次,方案取了 N3次后,还剩下K (k<6,否则 可以再取几轮,导致剩余量<6 )个石子。最后 K的取值有三种情况:0, 1, 3。这个要解释一

2、下:剩下的石子个数总共有 0,1,2,3,4,5几种可能,2可以再取一轮(1,1) 剩下0, 4可以再取一轮(1,3)或者两次(1,1)剩下0, 5可以再取(1,1)、(1,3)等的组 合剩下1或3个,所以综合是最终会剩下 0、1、3三种可能。设有石子 S.则 S=2*N1+4*N2+6*N3+K. 其中 2*N1+4*N2+6*N3=(1 + 1 ) *N1 +(1+3 ) *N2+ (3+3 ) *N3 ,说明取的过程为偶数次,所以剩下K时该最先取石子的人取。K=1 , 3 则先取方胜。反之,另一方胜。又 2*N1+4*N2+6*N3=2*( N1+2*N2+3*N3)为偶数,所以S的奇偶

3、性取决于 K,当K为偶数时,后取方胜,反之,先取方胜。总结:计算时可以先对 6取余,如果余数为 0、2、4,则K为0 (偶数,后取者胜), 如果余数为1、3、5则K为1或3 (奇数,先取者剩)。<2>有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game ):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。显然,如果n=m+1

4、 ,那么由于一次最多只能取 m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1 ) * r+s , (r为任意自然数,s<m ),那么先取者要拿走 s个物品,如果后取者拿走k (kwm)个,那么先取者再拿走m+1-k个,结果剩下(m+1 ) (r-1 )个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1 )的倍数,就能最后获胜。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。总结:通过分析可知,设 n=(m+1)*r+s(s<=m), 如果

5、s等于0,则后取者获胜!如果 s不等于0,则先取者胜利!(二)威佐夫博奕(Wythoff Game ):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用( ak, bk ) (ak < bk , k=0 , 1 , 2, ,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0, 0)、(1, 2)、(3, 5)、(4, 7)、(6, 10)、(8, 13)、(9, 15 )、(11 , 18 )、(12, 20)。我们可以知

6、道,后面的奇异局势可以通过一轮特殊的取法变为更低的奇异局势!可以看出,a0=b0=0 , ak是未在前面出现过的最小自然数,而 bk= ak + k ,奇异局势有如下三条性质:1 .任何自然数都包含在一个且仅有一个奇异局势中。由于ak是未在前面出现过的最小自然数,所以有 ak > ak-1 ,而bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 .所以性质 1.成立。2 .任意操作都可将奇异局势变为非奇异局势。事实上,若只改变奇异局势(ak, bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使( ak, bk)的两个

7、分量同时减少,则由于其差不 变,且不可能是其他奇异局势的差,因此也是非奇异局势。3 .采用适当的方法,可以将非奇异局势变为奇异局势。假设面对的局势是(a, b),若b = a,则同时从两堆中取走a个物体,就变为了奇异局势(0, 0);如果a = ak , b > bk ,那么,取走b - bk个物体,即变为奇异局势;如果 a =ak , b < bk ,则同时从两堆中拿走 ak - ab - ak 个物体,变为奇异局势( ab - a k , ab - a k+ b - a k);如果a > ak , b= ak + k ,则从第一堆中拿走多余的数量a - ak 即可;如果a

8、 < ak , b= ak + k ,分两种情况,第一种,a=aj (j < k ),从第二堆里面拿走b - bj即可;第二种,a=bj (j < k ),从第二堆里面拿走b - aj即可。从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。那么任给一个局势(a, b),怎样判断它是不是奇异局势呢?我们有如下公式:ak =k* (1+ v5) /2 , bk= ak + k(k=0 ,1,2,,n 方括号表示取整函数)奇妙的是其中出现了黄金分割数(1+V5) /2 = 1.618,因此,由ak, bk组成的矩 形近似为黄金矩形,由于

9、2/ (1+a/5) = (V5-1 ) /2 ,可以先求出j=a (V5-1 ) /2,若a= j* (1+ v5) /2,那么 a = aj ,bj = aj + j ,若不等于,那么 a = aj+1bj+1 = aj+1 + j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。总结:分析到此已经很明显,判断谁个能够胜利看是否是奇异矩阵就行了,如果是奇异矩阵,则后取者胜利,如果是非奇异矩阵,则先取者得胜!在判断是不是咸佐夫博弈的奇异 局势的时候,比如两个数 a,b ,则可以首先交换是 a<b,然后记i=b-a,如果是奇异局势,则必有m=floor(

10、i*(1+sqrt(5.0)/2), 并且b=m+i,否则比不是奇异局势!(三)尼姆博奕(Nimm Game ):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况最有意思,它与二进制有密切关系,我们用( a, b, c)表示某种局势,首先 (0, 0, 0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0, n, n),只要与对手拿走一样多的物品,最后都将导致(0, 0, 0)。仔细分析一下,(1, 2, 3)也是奇异局势,无论对手如何拿,接下来都可以变为(0, n, n)的情形。计算机算法里面有一种叫做按位模 2

11、力口,也叫做异或的运算,我们用符号( +)表示这 种运算。这种运算和一般加法不同的一点是1+1=0。先看(1, 2, 3)的按位模2加的结果:1 =二进制012 =二进制103 =二进制11(+ )0 =二进制00 (注意不进位)对于奇异局势(0, n , n)也一样,结果也是 0。任何奇异局势(a, b , c)都有a ( + ) b (+) c =0。如果我们面对的是一个非奇异局势(a, b, c),要如何变为奇异局势呢?假设a < b< c ,我们只要将c变为a (+) b,即可,因为有如下的运算结果:a (+) b (+) (a (+) b)=(a ( + ) a) (+)

12、 (b (+) b) =0 (+) 0=0 。要将 c 变为 a (+) b ,只要从 c 中减去 c- ( a (+ ) b)即可。总结:面对奇异局势,先取者必定输,如果是非奇异局势,则先取者赢!如果一个局势(a,b,c)有a(+)b(+)c=0,则是奇异局势,如果不是,则不是奇异局势!三堆石子的结论同样也适用于n堆石子的情况!取火柴的游戏题目1 :今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,可将一堆全取走,但不可不取,最后取完者为负,求必胜的

13、方法。嘿嘿,这个游戏我早就见识过了。 小时候用珠算玩这个游戏: 第一档拨一个,第二档拨两个,依次直到第五档拨五个。然后两个人就轮流再把棋子拨下来,谁要是最后一个拨谁就赢。有一次暑假看见两个小孩子在玩这个游戏,我就在想有没有一个定论呢。 下面就来试着证明一下吧先解决第一个问题吧。定义:若所有火柴数异或为 0,则该状态被称为利他态,用字母 T表示;否则,为利己态,用S表不。定理1:对于任何一个 S态,总能从一堆火柴中取出若干个使之成为T态。证明:若有n堆火柴,每堆火柴有A(i)根火柴数,那么既然现在处于 S态,c = A(1) xor A(2) xor xor A(n) > 0;把c表示成二

14、进制,记它的二进制数的最高位为第p位,则必然存在一个 A(t),它二进制的第p位也是1。(否则,若所有的 A(i)的第p位都是0,这与c的第p位就也为0矛盾)。那么我们把x = A(t) xor c,则得到x < A(t).这是因为既然 A(t)的第p位与c的第p位同为1,那么x的第p位变为0,而高于p的位并没有改变。所以 x < A(t).而A(1) xor A(2) xor xor x xor xor A(n)=A(1) xor A(2) xor xor A(t) xor c xor xor A(n)=A(1) xor A(2) xor xor A(n) xor A(1) xo

15、r A(2) xor xor A(n)=0这就是说从A(t)堆中取出A(t) x根火柴后状态就会从S态变为T态。证毕定理2: T态,取任何一堆的若干根,都将成为S态。证明:用反证法试试。若c = A(1) xor A(2) xor xor A(i) xor xor A(n) = 0 ;c' = A(1) xor A(2) xor xor A(i ' xor c xor xor A(n) = 0;则有c xor c' = A(1) xor A(2) xor xor A(i) xor xor A(n) xor A(1) xor A(2) xor xor A(i ')

16、xor c xor xor A(n) = A(i) xor A(i ' =0进而推出A(i) = A(i '),这与已知矛盾。所以命题得证。定理3 : S态,只要方法正确,必赢。最终胜利即由S态转变为T态,任何一个 S态,只要把它变为 T态,(由定理1,可以把它变成T态。)对方只能把T态转变为S态(定理2)。这样,所有S态向T态的转变都可以有己方控制,对方只能被动地实现由T态转变为S态。故S态必赢。定理4 : T态,只要对方法正确,必败。由定理3易得。总结:如果先手遇到 s态,则先手必赢,如果遇到 T态,必败!接着来解决第二个问题。定义:若一堆中仅有 1根火柴,则被称为孤单堆。

17、若大于 1根,则称为充裕堆。定义:我们设只有一根火柴的堆为单根堆,否则为充裕堆,充裕堆=2的T用T2表示,全是单根堆的T用T0表示(没有T1这种状态,分析可知)同样的充裕堆=2的S态用S2表示,全为孤单堆的 S (可知堆数必为奇数) 态用S0表示,只有一堆充裕堆的用 S1表示孤单堆的根数异或只会影响二进制的最后一位,但充裕堆会影响高位(非最后一位)。一个充裕堆,高位必有一位不为 0,则所有根数异或不为 0。故不会是T态。定理5 : S0态,即仅有奇数个孤单堆(没有充裕堆),必败。T0态必胜。证明:S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对方取,所以最后一根必己取。败。

18、同理,T0态必胜#定理6 : S1态,只要方法正确,必胜。证明:若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成只剩下一根(此时变成S0态,但是自己是后手)。这样,就变成奇数个孤单堆,由对方取。由定理 5,对方必输。己必胜。#定理7 : S2态不可转一次变为 T0态。证明: 充裕堆数不可能一次由 2变为0。得证。#定理8 : S2态可一次转变为 T2态。证明:由定理1, S态可转变为 T态,又由定理 7, S2态不可转一次变为 T0态,所以转变的 T态为T2态。#定理9 : T2态,只能转变为 S2态或S1态。证明:由定理2, T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的S态

19、不可能为S0态。命题得证。定理10 : S2态,只要方法正确,必胜 .证明:方法如下:1 ) S2态,就把它变为 T2态。(由定理8)2 ) 对方只能T2转变成S2态或S1态(定理9)若转变为S2,转向1 )若转变为S1,这己必胜。(定理5)定理11 : T2态必输。证明:同10。总结,必输态有: T2,S0必胜态: S2,S1,T0.两题比较:第一题的全过程其实如下:S2->T2->S2->T2->->T2->S1->T0->S0->T0-> ->S0->T0( 全 0)第二题的全过程其实如下:S2->T2->

20、;S2->T2->->T2->S1->S0->T0->S0-> ->S0->T0( 全 0)下划线表示胜利一方的取法。是否发现了他们的惊人相似之处。我们不又t发现(见加黑部分),S1态可以转变为S0态(第二题做法),也可以转变为T0 (第一题做法)。哪一方控制了 S1态,他即可以有办法使自己得到最后一根(转变为T0),也可以使对方得到最后一根(转变为 S0)。所以,抢夺S1是制胜的关键!为此,始终把T2态让给对方,将使对方处于被动状态,他早晚将把状态变为S1.推荐HDOJ题目http:http:看完上面的结论,就能顺利解决上面2道了S

21、-Nimhttp: http: 博弈算法入门小节 1536 1517 1907小子最近迷途于博弈之中。感触颇深。为了让大家能够在学习博弈的时候少走弯路,最重要的也是为了加深自己的影响,温故而知新,特发此贴与大家共勉。学博弈先从概念开始:特别推荐LCY老师的课件:博弈入门。下载地址:http:这个课件个人认为从博弈的基本思想,一直到解博弈的中心算法做了很好的诠释。但是特别要注意的是。课件后面一部分英语写的讲义是重中之重。小子英语很弱,在这困扰很久。现在为大家大概介绍一下。主要是后继点和 SG值的问题:SG值:一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数。后继点:也就是按照

22、题目要求的走法(比如取石子可以取的数量,方法)能够走一步达到的那个点。具体的有关SG值是怎么运用的希望大家自己多想想。课件后面有一个1536的代码。可以放在后面做做看到这里推荐大家做几道题:1846 (最简单的博弈水题)1847 (求 SG 值)有了上面的知识接下来我们来看看组合博弈(n堆石子)推荐大家看个资料: 博弈-取石子游戏(推荐等级五星级)http: 这里提出了一个奇异状态的问题。看了这篇文章你会发现异或运算在博弈中使用的妙处。当然这里指出的只是组合博弈中一种特殊情况。王道还是对SG值的求解,但是知道这么一种思路无疑对思维的广度和深度扩展是很有帮助的。ZZ博弈http:这里介绍了组和博

23、弈的两种大的类型,一种是最后取的是 N状态一种是最后取的是 P状态,两个状态的解题方法能看懂很有帮助。当然,能够把推导过程理解,吃透无疑是大牛级的做法小子也佩服的紧1536题推荐做做这题,这题前面提醒大家是一个求SG值的题目,题目前面是对异或运算运用在组合博弈问题中的很好的解释。当然题目本身是有所不同的。因为在这里面对取法有所要求。那么这样就回归到了解决博弈问题的王道算法一一求SG值上。有关运用求SG值的博弈题目有:1850 (也可基于奇异状态异或)1848 (中和的大斐波那契数列的典型求SG值题)1517 (个人认为有点猥琐的题目。在此题上困扰很久。当然搞出来很开心。小子是用比较规矩的求SG

24、值的方法求出来的,但是论坛有人对其推出来了规律,这里佩服一下,大家可以学习一下)1079 (更猥琐的题目,对新手要求较高,因为按传统方法需要比较细致的模拟加对边角状态的考虑,同样有人推出来了公式)当你全部看完以上的东西。做完以上的题目的话。小子恭喜你你博弈入门了/Accepted 1536 578Ms 416K 904 B这里小子告诉大家。博弈很强大。学习要耐心谢谢Current System Time : 2008-12-11 19:16:03ACM课作业:1001 Brave Game1002 Good Luck in CET-4 Everybody!1003 Fibonacci agai

25、n and again1004 Rabbit and Grass1005 Being a Good Boy in Spring Festival1006 Public Sale1007悼念512汶川大地震遇难同胞一一选拔志愿者1008 kiki ' game1009 Calendar Game1010 A Multiplication Game1011 Digital Deletions1012 S-Nimhttp:1536的参考代码本部分设定了隐藏,您已回复过了,以下是隐藏的内容Copy code博弈-基于求SG值#include " iostream ” using na

26、mespace std;int f101,sg10001,k;int mex(int b)int a101=0,i;for(i=0;i<k;i+)if(b-f <0)/b-f 后继点 break;if(sgb-f=-1)sgb-f=mex(b-f);asgb-f=1;for(i=0;i<k;i+)if(return i;int main()(int i,t,n,s,bead,j;while(cin >> k,k)(for(i=0;i<k;i+)(cin >> f;)memset(sg,-1,sizeof(sg);for(i=0;i<k;i+

27、)for(j=i+1;j<k;j+)if(f>fj)(f+=fj;fj=f-fj;f-=fj;)sg0=0;cin >> t;while(t -)cin >> n;s=0;while(n -)cin >> bead;/该堆的成员个数if(sgbead=-1)sgbead=mex(bead);s=sAsgbead;if(s=0)cout <<“ L ” ;elsecout <<“ W ;cout << endl;return 0;1517参考代码本部分设定了隐藏,您已回复过了,以下是隐藏的内容Copy code博

28、弈-基于求SG值/Accepted 1517 234Ms 0K 837 B#include " iostream ”using namespace std;int main()_int64 a7000=1,min,n;int p10,sg7000,i,j,k;for(i=2;i<10;p=0,i+);for(i=1;i<7000;i+)for(j=2,min=-1;j<10;j+)if(min=-1|apj*j<apmin*min) min=j;a=apmin*min;min=apmin*min;if(a>=5000000000)break;for(j=

29、2;j<10;j+)if(apj*j=min)pj+;/从小到大求出所有乘积while(scanf( " 164d ",&n)!=EOF)for(i=0;i<7000;i+)sg=0;if(a>=n)break;for(j=i-1;aj*9>=n&&j>=0;j-)sgj=1;while(j>=0)for(k=j+1;k<i&&aj*9>=ak;k+)if(ak%aj=0&&sgk=0)sgj=1;break;j彳puts(sg0? ” S/tiars. " :

30、" OWins.");return 0;这里感谢sh础同学的一段代码让小子学会了 puts的妙用1907参考代码本部分设定了隐藏,您已回复过了,以下是隐藏的内容#include " iostream ”using namespace std;int main()int temp,t,n,s,x,i;cin >> t;while(t -)cin >> n;for(i=s=temp=0;i<n;i+)cin >> x;if(x>1) temp=1;sA=x;if(s&&temp)|(!s&&

31、;!temp)cout <<“ John " << endl;elsecout <<" Brother"<< endl;return 0;Sprague-Grundy Function- 简称 sgNim游戏;比如说:有n堆石子,每次可以从第1堆石子里取1颗、2颗或3颗,可以从第2堆石子里取奇数颗,可以从第3堆及以后石子里取任意颗 这时看上去问题复杂了很多,但相信你如果掌握了本节的内容,类似的千变万化的问题都是不成问题的。现在我们来研究一个看上去似乎更为一般的游戏:给定一个有向无环图和一个起始顶点上 的一枚棋子,两名

32、选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。事实上,这个游戏可以认为是所有 Impartial Combinatorial Games(公正的组合游戏)的抽象模型。也就是说,任何一个ICG都可以通过把每个局面(状态、局势)看成一个顶点,对每个局面和它的子局面连一条 有向边来抽象成这个有向图游戏”。下面我们就在有向无环图的顶点上定义Sprague-Garundy函数。首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex0,1,2,4=3 、mex2,3,5=0、mex=0。对于一个给定的有向无环图,定义关于

33、图的每个顶点x的Sprague-Garundy 函数g如下:g(x)=mex g(y) | y 是 x 的后继。来看一下SG函数的性质。首先:所有的terminal position(末端位置)n所对应的顶点,也就是没有出边的顶点,其 SG值为0, 因为它的后继集合是空集。(所有终结点是必败点(P点)然后对于一个g(x)=0的顶点x,它的所有后继 y都满足g(y)!=0。(无论如何操作,从必败点(P点)都只能进入必胜点(N点)对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0。(从任何必胜点(N点)操作,至少有一种方法可以进入必败点( P点)以上这三句话表明,顶点x所代表的pos

34、tion 是P-position 当且仅当 g(x)=0 (跟P-positioin/N-position的定义的那三句话是完全对应的)。我们通过计算有向无环图的每个顶点的SG值,就可以对每种局面找到必胜策略了。但 SG函数的用途远没有这样简单。如果将有向图游戏变复杂一点,比如说,有向图上并不是只有一枚棋子,而是有n枚棋子,每次可以任选一颗进行移动,这时,怎样找到必胜策略呢?让我们再来考虑一下顶点的SG值的意义。当g(x)=k时,表明对于任意一个 0<=i<k ,都存在x的一个后继y满足g(y尸i (根据mex函数定义和g函数定义可知)。也就是说,当某枚棋子 的SG值是k时,我们可

35、以把它变成0、变成1、变成k-1 ,但绝对不能保持 k不变。不知道你能不能根据这个联想到Nim游戏,Nim游戏的规则就是: 每次选择一堆数量为 k的石子,可以把它变成 0、变成1、变成k-1 ,但绝对不能保持 k不变。这表明,如果将 n枚棋子 (图上面有n枚棋子在移动,相当于 n个取石子的子游戏)所在的顶点的SG值看作n堆相应数量的石子,那么这个 Nim游戏的每个必胜策略都对应于原来这n枚棋子的必胜策略!对于n个棋子,设它们对应的顶点的 SG值分别为(a1,a2,an),再设局面(a1,a2,an) 时的Nim游戏的一种必胜策略是把 ai变成k,那么原游戏的一种必胜策略就是把第i枚棋子移动到一个SG值为k的顶点。这听上去有点过于神奇 一一怎么绕了一圈又回到 Nim游戏上了。其实我们还是只要证明这种多棋

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论