摘要:模拟退火算法
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据metropolis准则,粒子在温度t时趋于平衡的概率为e-δe/(kt),其中e为温度t时的内能,δe为其改变量,k为boltzmann常数。用固体退火模拟组合优化问题,......
摘要:每个java对象都有hashcode()和 equals()方法。许多类忽略(override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在java理念和实践这一部分,java开发人员brian goetz向您介绍在创建java类以有效和准确定义hashcode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文......
A*算法实现8数或者15数问题(C#实现)8数与15数问题 【程序编程相关:
设计模式学习笔记——《设计模式》引言】 【推荐阅读:
Spring指南(官网)】 【扩展信息:
毕业五年有感,给年轻人的一点忠告】
-.问题描述
8数或15数问题是同一个问题,其就是一个随机排列的8个或15个数在一个方正格子中移动到达规定的一个目标状态.由于只有一个空格子,故只有在空格附近的棋子可以移动.
二.算法描述
f 算法选择
此问题需要对所有可能的路径进行穷举,但是由于随着树的高度的加大,其子结点的增加宿舍剧增,所以对所有的子结点进行穷举是不大现实的.而根据当前的状态与目标状态进行对比可以用一个评估函数来评估当前状态的好坏情况.而在这里我们选择a*算法来进行求解,a*算法是一种最好优先的算法.f´(n) = g´(n) + h´(n),f´(n)是估价函数,g´(n)是起点到终点的最短路径值,这里就表示树的高度,h´(n)是n到目标的最断路经的启发值,其原理是把当前产生的状态与以前所以的状态的评估函数值进行对比,选择其中最小的评估函数继续进行下一步.这里我选择h´(n)的启发值为每个格子到达它的目标位置所需要经过的最少步数.
f 算法描述
需要说明的几点:
1. 用openarr表示初始节点列表(待扩展,此为一个动态数组)
2.closedarr保存已经访问过的结点
3.算法首先需要给出初始状态,由于随机产生的状态并不一定能够走到目标状态,因此这里采用从标准状态往回走产生一个被打乱的随机状态,这样可以保证有解.
算法实现:
1. openarr放置初始结点
2. 如果openarr为空集,则退出并给出失败信号
3. n取为openarr的第一个节点,并从openarr中删除节点n
4. 如果n为目标节点,则退出并给出成功信号
5. 否则,将产生n子节点,并对n的每个子结点n’ 进行如下操作:
1)如果n’ 不在openarr与closedarr表中,则把n’放入openarr表中
2)否则,如果在openarr表中,计算评估值,并且如果比表中的评估函数的值小,则更新表中的评估值为当前的值.
3)否则,如果在closedarr表中,计算评估值,并且如果比表中的评估函数的值小,则把表中的评估值更新为当前的值,并把该结点从表中删除,并在openarr表中加入该结点.
6.把n结点加入closedarr中
7.对openarr进行排序(根据评估函数从小到大),并转到2.
三.程序设计
算法使用c#语言来实现的.程序主要根据上面提供的广度优先算法的描述来对算法进行实现的.程序共有四个类:
stepnode类,用来描述产生的各个结点的属性以及方法等
heuristic_15num_search类,算法实现类
form1类,是界面设计的类.
这里分别提供了8数与15数问题的求解.并显示了所经历过的各个状态转移
以下主要对几个核心算法的程序实现进行说明介绍.
//stepnode类 以下几个方法主要是控制格子的左右上下的移动
//0 数字上移
private void moveup(position p)
{
if(p.x>=1)
{
stepnode node = new stepnode();
to(this,node);
...
下一页 摘要:不变对象具有许多能更方便地使用它们的特性,包括不严格的同步需求和不必考虑数据讹误就能自由地共享和高速缓存对象引用。尽管不变性可能未必对于所有类都有意义,但大多数程序中至少有一些类将受益于不可变。在本月的 java 理论与实践中,brian goetz 说明了不变性的一些长处和构造不变类的一些准则。请在附带的论坛中与作者和其他读者分享您关于本文的心得。(也可以单击文章顶部或底部的“讨论&......