游戏开发论坛

 找回密码
 立即注册
搜索
楼主: swd153

[求助] 关于多重循环数值的产出估算问题

[复制链接]

0

主题

185

帖子

728

积分

高级会员

Rank: 4

积分
728
发表于 2013-11-21 18:00:29 | 显示全部楼层
smallcorpse 发表于 2013-11-21 17:00
……我觉得光改写这个函数还不行,bineye的算法应该用另一种模式去编写。

第一步是将当前体力折算成的经 ...

其实,我觉得如果是估算的话,可以忽略这两点。因为这部分的误差肯定会被作为零头的零头而舍弃。

仔细算了一下,发现这两种方案差别其实很小:
玩家24小时在线使得体力获取时间无溢出的时候,会导致这两种方案误差最大。此时,也不过是1713.1和1702.5的区别,相对误差仅为0.6%。

因此,对玩家玩游戏时间和习惯的期望假设才是主要影响因素。
简单的估算为:假设玩家每天有效游戏时间为a小时,那么每天大约能获得的体力值为a*1713/24。

19

主题

197

帖子

1171

积分

金牌会员

实干兴邦,空谈误国

Rank: 6Rank: 6

积分
1171
发表于 2013-11-21 18:06:01 | 显示全部楼层
本帖最后由 smallcorpse 于 2013-11-21 18:14 编辑
猴与花果山 发表于 2013-11-21 17:58
我大概了解了这个“预升级技能序列”的工作方式,不知道理解得对不对?
1,把差100经验的技能丢进这个序 ...

顺序投放到不是“预升级技能序列”的序列里。

因为在本题中,所有技能都有相同的成长经验曲线。我们又是顺序给技能增加经验一直到此技能进入“预升级技能序列”中的。所以无论是“预升级技能序列”还是这个序列的补集,技能的等级都应该按a1到a10降序排列的。

当这个“预升级技能序列”中的技能为空时,还是按照第一步的设定,顺序的填充经验,也就是从a1开始填充。一直到“预升级技能序列”中有技能且当前还剩100经验为止。
(差了一句技能的等级使得表述不清……)

98

主题

784

帖子

4495

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4495
发表于 2013-11-21 18:23:07 | 显示全部楼层
smallcorpse 发表于 2013-11-21 18:06
顺序投放到不是“预升级技能序列”的序列里。

因为在本题中,所有技能都有相同的成长经验曲线。我们又是 ...

好吧,我就把你想要的和我原本的算法结合,给你一个更不错的算法:
把这个函数扩展一个参数,这个参数是剩余工作次数。
1,如果剩余次数大于1,那么我选择技能的依据:如果还没有选中的技能则选中这个技能,如果这个技能的等级低于选中技能的等级,且需要经验-当前经验>100,那么就选中这个技能。
2,如果剩余次数小于等于1,那么选择技能的依据就是:如果当前还没有选中技能,那么就选中这个技能,如果这个技能的等级大于选中的技能且(选中技能的升级所需-当前经验>100 或 升级所需-当前经验<=100),就选定现在这个技能。

这是我选择技能加点的方案。这里和你想的有一点不同的是,在最后1次工作的分配中,我选择优先等级高的,而平时和你想的一样优先等级低的,另外在选择的时候加一个阀,而不是一个新的列表和排序,效率会好不少。你觉得这个方案和最初我们说的那些相比如何?

19

主题

197

帖子

1171

积分

金牌会员

实干兴邦,空谈误国

Rank: 6Rank: 6

积分
1171
发表于 2013-11-21 18:38:54 | 显示全部楼层
猴与花果山 发表于 2013-11-21 18:23
好吧,我就把你想要的和我原本的算法结合,给你一个更不错的算法:
把这个函数扩展一个参数,这个参数是 ...

……在bineye啪啪啪打我脸得时候我突然对这个算法没有兴趣了……

在经验成长斜率k = 1的时候,差距就这么不明显,除非降低斜率,要不然的话算法越简单越好。也就是说你一开始的算法是最好的……

由于技能数又是一个常量定值,所以不停的做循环顶多是一个O(n)的算法……

哎,白费这么多脑细胞了……

不过与业内前辈们请教思路也是对自己的一个不小的提升了,感谢各位。

0

主题

185

帖子

728

积分

高级会员

Rank: 4

积分
728
发表于 2013-11-21 18:46:05 | 显示全部楼层
smallcorpse 发表于 2013-11-21 18:38
……在bineye啪啪啪打我脸得时候我突然对这个算法没有兴趣了……

在经验成长斜率k = 1的时候,差距就这 ...

我是在打自己脸……
原先没想到所谓的最佳方案对结果影响这么小,所以就提了“最佳方案”这个概念。
仔细一算才发现,误差最大值连1%都还不到。甚至整个升级对体力的影响都是不过10%出头……
如果只是要估算,那只需要计算时间与体力的关系就行了

19

主题

197

帖子

1171

积分

金牌会员

实干兴邦,空谈误国

Rank: 6Rank: 6

积分
1171
发表于 2013-11-22 10:58:50 | 显示全部楼层
本帖最后由 smallcorpse 于 2013-11-22 11:06 编辑
猴与花果山 发表于 2013-11-21 18:23
好吧,我就把你想要的和我原本的算法结合,给你一个更不错的算法:
把这个函数扩展一个参数,这个参数是 ...

加经验模式.JPG

我又忍不住画了算法模型图……

此算法采用了双队列模式。

当可加经验次数大于2次时,一直点基础队列里第一个技能,一直到他成为预升级技能就把它推到预升级队列里面。

当可加经验只有一次时,点预升级队列里面第一个技能。

然后预升级队列里面已经升级了的的技能推到基础队列末尾。

98

主题

784

帖子

4495

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4495
发表于 2013-11-22 11:07:57 | 显示全部楼层
smallcorpse 发表于 2013-11-22 10:58
我又忍不住画了算法模型图……

此算法采用了双队列模式。

如果你的2个队列仅有一丁点区别,不如把区别加入到结构中去;如果你的区别只是一个逻辑,就不要额外去加任何东西。其实你现在的区别,仅仅只是一层判断,所以其实没必要去开2个队列,2个数组的开销可比1个大多了。

19

主题

197

帖子

1171

积分

金牌会员

实干兴邦,空谈误国

Rank: 6Rank: 6

积分
1171
发表于 2013-11-22 11:15:17 | 显示全部楼层
猴与花果山 发表于 2013-11-22 11:07
如果你的2个队列仅有一丁点区别,不如把区别加入到结构中去;如果你的区别只是一个逻辑,就不要额外去加 ...

……最主要的区别是规避了循环查找匹配的一个运算……如果技能很多的话会提高不少效率。

采用双队列模式只需要盯着队列头加经验就行了……

98

主题

784

帖子

4495

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4495
发表于 2013-11-22 11:18:54 | 显示全部楼层
smallcorpse 发表于 2013-11-22 11:15
……最主要的区别是规避了循环查找匹配的一个运算……如果技能很多的话会提高不少效率。

采用双队列模式 ...

你这该循环的还是循环了,还要额外循环第2个Array……for (xxx in skill)这个总是要做的。

19

主题

197

帖子

1171

积分

金牌会员

实干兴邦,空谈误国

Rank: 6Rank: 6

积分
1171
发表于 2013-11-22 11:21:02 | 显示全部楼层
猴与花果山 发表于 2013-11-22 11:18
你这该循环的还是循环了,还要额外循环第2个Array……for (xxx in skill)这个总是要做的。 ...

……啊?

这点我倒是不太清楚,请指教。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-27 00:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表