[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
我的第一个算法是最普遍的,前面那个贴出C代码的算法=。=
只不过我用了大量诸如
判断超标
set /a "x=^!(%%x-1)*25+(%%x-1)" ,当X-1等于0,就让X=25,否着不变。
set /a "x=^!(%%x+1-26)+^!^!(%%x+1-26)*(%%x+1)" 当x+1等于26,就让X=1,否着不变。

重新赋值
set /a "new=^!(sum-3) | ^!(sum-2) * !old!"  ::sum=3,new=1; sum=2,new=old; else new=0
但最后发现,|  之前的可以提速,| 之后的计算,没有比if判断快。

第二个算法是猜想terse的效率,估计他是一行一行处理的,而不是每个坐标都处理。效率提升几十倍只能这么做。

TOP

优化了代码,运行时间大幅提升,电脑好点,或许可以进入20秒内了。如果能够直接支持26位长度的大数加法,估计只要15秒不到。
下面是运行结果。

第99代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓■▓
▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓■
▓▓▓▓▓▓■■■▓▓▓▓▓▓▓▓▓■▓▓▓▓▓■
■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■▓■■▓▓■■
▓■■▓■■■▓▓▓▓■■▓▓▓▓▓■■■▓▓▓▓
▓▓■■■■▓▓▓▓▓■■▓▓▓▓▓▓■▓▓▓▓▓
▓▓▓■▓▓▓▓▓▓■■■■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■■▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓
第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■
▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓
■■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓■▓▓■▓▓■■
■■■▓▓▓■▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓■
▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓■■■▓▓▓▓
▓▓■■▓▓▓▓▓▓■▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
0:05:11.00--> 0:05:36.46


[ 本帖最后由 caruko 于 2011-2-24 00:10 编辑 ]

TOP

回复 47楼 的帖子

somebody总是在预想设备好的情况,
此处当我没说过   

[ 本帖最后由 523066680 于 2011-2-24 08:50 编辑 ]

TOP

换了一种算法,破电脑跑了1分钟,换台双核的应该在40多秒,小有进步=。=

循环代码行数40行 #.#,算法不复杂,只可惜批处理不支持26个字符长度的数值计算,也还没找到好的大数计算方法,目前是把25位数分成4段处理的,导致多出大量的字符数值转换跟计算。

如果支持大数计算,可以节省1/3的时间,如果支持BIT(OR),还能节省1/3时间。

我再优化优化,还有某些地方得出的数值可重用,应该可以节省10多秒。 现在才迫切希望换成64位机来运行它 =.=。

[ 本帖最后由 caruko 于 2011-2-23 22:54 编辑 ]

TOP

=.=  仔细一想,经过验证,果然一行一行的计算可行,依靠4次移位来计算细胞和,循环25次得到和,再循环25次替换得到新细胞图。
不知道是不是terse一样的算法,等写出代码试试效率。

呃,不支持近30位的数值计算=。=,难道要切成4段算?

[ 本帖最后由 caruko 于 2011-2-23 16:52 编辑 ]

TOP

猜想,17秒*25,扣除输出时间,大约是我的运行时间,terse 可能一次计算只循环了25次。。
也就是一行一行的处理?
我也想想,有没可能做到。

[ 本帖最后由 caruko 于 2011-2-23 15:53 编辑 ]

TOP

稍微参与下,呵呵, 我贴下我的关键算法, 很菜, 转成批处理速度应该很慢吧
  1. for (i = 0; i < N; ++i)
  2. for (j = 0; j < N; ++j) {
  3. sum = list[(i+1+N)%N][(j+N)%N] + list[(i-1+N)%N][(j+N)%N] + list[(i+N)%N][(j+1+N)%N] + list[(i+N)%N][(j-1+N)%N];
  4. sum += list[(i+1+N)%N][(j+1+N)%N] + list[(i+1+N)%N][(j-1+N)%N] + list[(i-1+N)%N][(j-1+N)%N] + list[(i-1+N)%N][(j+1+N)%N];
  5. switch (sum) {
  6. case 2://不变
  7. backUp[i][j] = list[i][j]; break;
  8. case 3://生
  9. backUp[i][j] = 1; break;
  10. default://死
  11. backUp[i][j] = 0; break;
  12. }
  13. }
  14. for (i = 0; i < N; ++i)
  15. for (j = 0; j < N; ++j)
  16. list[i][j] = backUp[i][j];
复制代码

TOP

运行速度和机器配置有关 我的 酷睿2 4400 @ 2.00GHz   2 GB DDR2 667MHz  sp3  现在运行 17秒
我相信 继续优化后 速度还可以提升的

TOP

=.= 我的电脑纯输出2500行就得20秒啊,等会换个电脑试试。
这破机器开龙之谷,每次加载要5分钟,而别的电脑只要15秒。

还有边角问题,是只有4个顶点相连?还是上下边,左右边相连?

难道批处理的纯数值计算更慢?? 回头再想想有没别的办法,减少循环。
这是新的运行结果。

10:46:41.35
10:48:08.14
第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓■
▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓■■▓▓▓▓▓
■■▓▓▓▓▓▓■▓▓▓▓▓▓▓▓■▓▓■▓▓■■
■■■▓▓▓■▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓■
▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓■■■▓▓▓▓
▓▓■■▓▓▓▓▓▓■▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓


[ 本帖最后由 caruko 于 2011-2-23 10:52 编辑 ]

TOP

回复 40楼 的帖子

hia hia 那就跟整体机制有关。 继续膜拜某的 带刷屏到100代  20秒 。
也就是0.2一张,我内牛满面……

TOP

=。= 已经按照边角对接修改过了..
输出速度大约是一副图2秒。
不输出的计算速度大约是1.5秒一代。
我的电脑是用了5年的本本,CPU P4M 1.7G的。

效率貌似难以提升了,所有IF判断后再赋值,都是用set /a直接得到结果,效率应该还可以才是。

如果计算中不需要输出,核心循环代码包括FOR(100)的括号在内,可以简化到4行。

[ 本帖最后由 caruko 于 2011-2-23 00:21 编辑 ]

TOP

代码先上传吧 =。=
到时不知道还记得不,也可能没时间来。
已经更新过,按边角对接算的。

这个代码算法太慢了,已经另写了效率高很多的代码,这个就不设权限了,有意的可以看看。

TOP

只用了set for echo 3个命令,效率应该还可以=。=,如果不echo,直接得到第100代就更快一点了。我这里大概2分多钟算出来。
原来不用代码,等下直接贴结果。

第100代
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓■▓■▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓■■▓▓▓▓▓■▓■▓▓▓▓■■▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■■▓▓▓▓■■▓■▓▓▓▓▓
▓▓▓▓▓▓▓▓■■▓▓▓▓■■▓▓■■▓▓▓▓▓
▓▓▓▓▓▓▓■▓■▓▓▓■▓▓■▓■■■▓▓▓▓
▓▓▓▓▓▓■■▓▓■■■▓▓▓■▓▓■■▓▓▓▓
▓▓▓▓▓▓▓▓▓▓■■■▓■▓■▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓■▓▓▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓■▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓▓■■▓■■▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓■▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
▓■▓▓▓▓▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓
■▓■■▓▓▓▓▓■■▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓■■▓▓▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓■■■▓■▓■■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓■▓▓■■■■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓■▓■▓▓▓■▓▓■▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓■▓▓▓▓■▓■▓▓▓▓▓▓▓▓▓▓▓


[ 本帖最后由 caruko 于 2011-2-22 23:05 编辑 ]

TOP

忘记设权限了。。
先删掉

[ 本帖最后由 caruko 于 2011-2-22 22:22 编辑 ]

TOP

为积分  再优化 提升点效率

TOP

返回列表