- 博客(0)
- 资源 (12)
- 收藏
- 关注
tomcat解决跨域访问问题配置
tomcat解决跨域访问问题,具体配置如下:
1、修改tomcat下的Conf/web.xml文件,在该文件内容中新增以下配置,注意,若该web.xml中存在其它filter,则需要将该filter放在所有filter前面;
CorsFilter
org.apache.catalina.filters.CorsFilter
cors.allowed.methods
GET,POST,HEAD,OPTIONS,PUT
cors.allowed.headers
<!--注意,若你的应用中不只有这些文件头,则需要将你应用中需要传的文件头也加上;
例如:我的应用中需要在header中传token,所以这里的值就应该是下面的配置,在原有基础上将token加上,否则,应用就不会被允许调用
token,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers
-->
Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers
true
CorsFilter
/*
2016-09-06
java使用Xuggler获得视频时长,分辨率,高宽,码率等信息
java使用Xuggler获得视频时长,分辨率,高宽,码率等信息,其中包括xuggle-xuggler-5.4.jar这个jar包,使用该jar包可直接获取视频的各种信息
2016-08-16
zTree官方Demo以及api文档
zTree的官方Demo以及api文档,解压后,不要用Chrome浏览器打开,因为Chrome浏览器不能打开file://的文件,建议用Ie打开api文档学习
2016-06-08
A*算法求解八数码问题_C#语言
A*算法求解八数码问题
1、A*算法基本思想:
1)建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。
2)取出队列头(队列头指针所指)的结点,如果该结点是目标结点,则输出路径,程序结束。否则对结点进行扩展。
3)检查扩展出的新结点是否与队列中的结点重复,若与不能再扩展的结点重复(位于队列头指针之前),则将它抛弃;若新结点与待扩展的结点重复(位于队列头指针之后),则比较两个结点的估价函数中g的大小,保留较小g值的结点。跳至第五步。
4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。
5)如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。
2、程序运行基本环境:
源程序所使用编程语言:C#
编译环境:VS2010,.net framework 4.0
运行环境:.net framework 4.0
3、程序运行界面
可使用程序中的test来随机生成源状态与目标状态
此停顿过程中按Enter即可使程序开始运行W(n)部分;
此停顿部分按Enter后程序退出;
4、无解问题运行情况
这里源程序中是先计算源状态与目标状态的逆序对的奇偶性是否一致来判断是否有解的。下面是无解时的运行画面:
输入无解的一组源状态到目标状态,例如:
1 2 3 4 5 6 7 8 0
1 2 3 4 5 6 8 7 0
运行画面如下:
5、性能比较
对于任一给定可解初始状态,状态空间有9!/2=181440个状态;当采用不在位棋子数作为启发函数时,深度超过20时,算法求解速度较慢;
其中启发函数P(n)与W(n)的含义如下:
P(n): 任意节点与目标结点之间的距离;
W(n): 不在位的将牌数;
源状态 目标状态 P(n)
生成节点数 W(n)
生成节点数 P(n)
扩展节点数 W(n)
扩展节点数
2 8 3
1 6 4
7 0 5 1 2 3
8 0 4
7 6 5 11 13 5 6
1 2 3
8 0 4
7 6 5 0 1 3
8 2 4
7 6 5 6 6 2 2
4 8 2
5 1 6
7 0 3 7 4 2
8 5 6
1 3 0 41 79 22 46
6 2 5
8 7 0
3 1 4 0 3 6
7 1 8
4 5 2 359 10530 220 6769
7 6 3
1 0 4
8 5 2 2 8 7
1 3 4
6 5 0 486 8138 312 5295
下图是解决随机生成的100中状态中,P(n)生成函数的生成节点与扩展节点统计图:
由上图可知,P(n)作为启发函数,平均生成节点数大约在1000左右,平均扩展节点数大约在600左右;
下图是解决随机生成的100中状态中,W(n)生成函数的生成节点与扩展节点统计图:
由上图可知,W (n)作为启发函数,平均生成节点数大约在15000左右,是P(n)作为启发函数时的平均生成节点的15倍;W (n)作为启发函数,平均扩展节点数大约在10000左右,是P(n)作为启发函数时的平均扩展节点的15倍;
下图是解决随机生成的100中状态中,两个生成函数的生成节点与扩展节点统计图:
由上述图表可以看到,将P(n)作为启发函数比将W(n)作为启发函数时,生成节点数与扩展节点数更稳定,相比较来说,采用P(n)作为启发函数的性能比采用W(n)作为启发函数的性能好。
6、源代码说明
1)AStar-EightDigital-Statistics文件夹:用来随机生成100个状态,并对这100个状态分别用P(n)与W(n)分别作为启发函数算出生成节点以及扩展节点,以供生成图表使用;运行界面如下:
2)Test文件夹:将0-8这9个数字随机排序,用来随机生成源状态以及目标状态的;运行界面如下:
3)AStar-EightDigital文件夹:输入源状态和目标状态,程序搜索出P(n)与W(n)分别作为启发函数时的生成节点数以及扩展节点数,并给出从源状态到目标状态的移动步骤;运行界面如下:
提高了运行速度的几处编码思想:
1、 在维护open以及close列表的同时,也维护一个类型为hashtable的open以及close列表,主要用来提高判断当前节点是否在open列表以及close列表中出现时的性能;
2、 对于每个状态,按照从左到右,从上到下,依次将数字拼接起来,形成一个唯一标识identify,通过该标识,可以直接判断两个状态是否是同一个状态,而不需要循环判断每个位置上的数字是否相等
3、 在生成每个状态的唯一标识identify时,同时计算了该状态的空格所在位置,通过空格所在位置,可以直接判断能否进行上移、下移、左移、右移等动作;
4、 只计算初始节点的h值,其它生成的节点的h值是根据当前状态的h值、移动的操作等计算后得出的,规则如下:
a) 采用W(n)这种方式,不在位置的将牌数,共有以下3中情况:
i. 该数字原不在最终位置上,移动后,在其最终位置上
这种情况下,生成的子节点的h值= 父节点的h值-1
ii. 该数字原在最终位置上,移动后,不在其最终位置上
这种情况下,生成的子节点的h值= 父节点的h值 +1
iii. 该数字原不在最终位置上,移动后,还是不在其最终位置上
这种情况下,生成的子节点的h值= 父节点的h值
iv. 该数字原在最终位置上,移动后,还在其最终位置
这种情况不存在
b) 采用P(n)这种方式,节点与目标距离,可通过下面3步完成
i. 首先计算在原位置时,与目标位置的距离,命名为Distance1
ii. 移动后,计算当前位置与目标位置的距离,命名为Distance2
iii. 计算子节点的h值:
子节点的h值 = 父节点的h值- Distance1+ Distance2
5、 在任意状态中的每个数字和目标状态中同一数字的相对距离就有9*9种,可以先将这些相对距离算出来,用一个矩阵存储,这样只要知道两个状态中同一个数字的位置,就可查出它们的相对距离,也就是该数字的偏移距离;例如在一个状态中,数字8的位置是3,在另一状态中位置是7,那么从矩阵的3行7列可找到2,它就是8在两个状态中的偏移距离。
2015-11-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人