摘要:what 什么是继承?why 为什么要用继承?(继承有什么用?继承有什么优点?)how 怎么使用继承?when,where 什么时候,什么地方使用继承?if not 如果不使用继承,能否实现同样的设计,如果可以两个方案的区别又在什么地方what?继承是一个动词,相对与接口这一名词,理解上应该有所区别继承一种定义作为派生类基础的类的能力。派生类继承并可扩展基类的属性、方法和事件。派生类还可以用新的实......
摘要:转:[ 分享] 我收集的ebook。自己肯定是看不完的,收集是为了给用的到的朋友。 http://www.itpub.net/259894.html
......
棋类游戏的智能模块设计――浅谈人工智能上一页 ...
如果我们将这棵树不停的扩展下去,直到棋局分出输赢,那么我们就建立了一棵完整的博弈树,称为最大最小树,树中包含了下棋过程中所有可能出现的棋局,而且树的叶子节点都是可以分胜负的棋局.这真是一个好办法,只要建立这棵完整的博弈树就可以找到一条通往胜利的路,真是太好了.但是稍加分析就知道,这棵树根本建立不起来.比如象棋,可以把一个棋子来回的移动,这棵树就没有了尽头;对于黑白棋来说,虽然棋局结束是肯定的,但是这棵树上的节点也是天文数字,即使1秒钟能生成10^10个节点,这棵树的生成时间也是天文数字.因此建立完整博弈树是完全不实用的.
局面估值 【程序编程相关:
FedoraCore2正式版使用问题解决】
【推荐阅读:
[原创]用脚本控制Select的展开与折】
在博弈程序中,我们也要把这个方法教给计算机.计算机只进行有限深度的搜索,到达某一深度时,将停止搜索,而改用对局面的静态估值,将这个估值作为节点的值.这样,计算机就可以考察若干步之后的局面,从而找到一个最佳的走法.当然,这个“最佳”是在对手与计算机同等聪明的情况下得出的. 【扩展信息:
VC数字图像处理编程讲座之四】
但是我们仍然会下棋,而且水平还不错,这是为什么呢?因为我们会估计,即对棋局进行评估.比如象棋的某个局面,我车马炮齐全,而你已经没有车了,那么这个局面显然对我有利.在黑白棋里,我的棋子比你多,那么就对我有利.(注:这个评估方法实际上很差,因为黑白棋存在吃子的问题,而且一步吃子可达到10个以上,所以当前局面对我有利,但下一个局面就不一定了,所以比较棋子个数的评估方法一般都是在最后一步使用,即所谓的终局)
很显然,对局面的估值无论怎样都不可能精确,否则就没有搜索的必要了.但估值必须要有大致精确的方向,只有这样才能让搜索引擎向着正确的方向搜索.不同程序的棋力差别也源自估值函数,在相同搜索深度的情况下,不同的搜索引擎决定了效率,而估值函数决定了棋力.
估值这部分与程序编写者自身的知识有很大的关系,很难想象一个对黑白棋不精通的人能写出棋力很强的程序.
综合应用
将搜索算法.走法生成与局面估值结合在一起就可以得到一个最简单的.可以实用的程序了.在这里用伪码的形式作个实例.
int minmax(局面 p, int depth)//depth是搜索深度
{
int bestvalue, value;
//一般来说,这里有一个判断棋局是否结束的函数,一旦棋局结束就不必继续搜索了,直接返回极值.但由于黑白棋不存在中途结束的情况,故省略.
if(depth<=0)//叶子节点
{
返回估值(p);//直接返回对局面的估值
}
if(当前是计算机走棋)
{
bestvalue=-inf;//初始最佳值设为负无穷
}
else
{
bestvalue=inf;// 初始最佳值设为正无穷
}
for(每一个合法的走法)//走法的生成与具体问题紧密相关,具体方法省略
{
走一步棋;//局面p随之改变
value=minmax(p, depth-1);//搜索子节点
撤销刚才的一步;//恢复局面p
if(当前是计算机走棋)
{
if(value>bestvalue)//取最大值
{...
下一页 摘要:1)instanceof:实现了某接口的类的对象也是该接口的实例;某类的对象也是该类超类的实例。
2)native()修饰的方法没有方法体,用一个分号";"代替大括号。
3)main不是关键字。
4)system.exit(int value),也就是说,只要是int的,就能够使jvm退出system.exit(´a´);同样的是合法的。
5)&......