游戏开发论坛

 找回密码
 立即注册
搜索
查看: 31955|回复: 21

[原创] 马尔科夫链强化问题

[复制链接]

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
发表于 2016-9-13 14:56:51 | 显示全部楼层 |阅读模式
掉级强化模拟.rar (24.24 KB, 下载次数: 350)
在游戏设计中大家经常会遇到马尔科夫链问题的系统设计,在这里跟大家分享一个自己做的VBA模拟器。

数据结构

数据结构

第一部分数据结构,ID、花费、强化ID、对应权重
ID:就是当前强化等级  默认为1级,实际你按-1去考虑就可以了。
花费:强化需消耗的货币数量
强化ID:当前等级强化后可能跳转的等级
对应权重:可跳转的等级对应的权重。
举例说明:第一行数据,初始等级1级时花费500,强化操作后有20%的概率是1级,80的概率是2级。
这里强化ID格式为 A+B+C形式,填写的时候注意不要有断档,就是你操作到某一个等级后你填的数据无法保证可以继续走下去,简单来说你要保证1-2-3-4-5-6-7-8-9-10......这个概率一定存在。
由于代码读取问题,注意数据的格式和所在列!!!!!

参数

参数

参数界面:目标ID、目标次数、平均次数、平均花费
目标ID:测试时指定要强化到的等级,注意初始是1这个区别。实际你期望的要+1
目标次数:反复测试的次数,次数越大得到的数据越接近实际数据
平均次数:达到目标所需要强化的次数取小数点后两位
平均花费:达到目标所需要的强化消耗取小数点后两位
进度详情:因为目标次数太大EXCEL运行速度问题,给一个可视的进度防止文件卡死不知道。
由于代码读取问题,注意数据的格式和所在列!!!!!
之后是代码相关介绍:
随机算法及数据解析:
Option Explicit
Option Base 1
Public set_id As Integer
Public set_cost As Integer
Public Sub rand_show(ByVal arr)
Dim i#
Dim rnd_num#
Dim rnd_rank#
Dim rnd_rank_p#
Dim m_select#
Dim temp_arr3
Dim temp_arr4
'初始化随机种子
Randomize
'----------------------------------------------随机过程-----------------------------------------------
        rnd_num = Int(Rnd() * 10000 + 1)

        temp_arr3 = analysis_data(arr(set_id, 3))
        temp_arr4 = analysis_data(arr(set_id, 4))
        rnd_rank = 0
        '-------------------------------判断此次结果ID位置-----------------------------------
        For i = 0 To UBound(temp_arr4)
            rnd_rank_p = rnd_rank
            rnd_rank = rnd_rank + temp_arr4(i)
            If temp_arr4(i) <> 0 Then
                If rnd_num > rnd_rank_p And rnd_num <= rnd_rank Then
                    m_select = temp_arr3(i)
                    Exit For
                End If
            End If
        Next i
'------------------End----------------
        set_cost = arr(set_id, 2)
        set_id = m_select
End Sub
'-----------------------解析数组里的字符--------------------
Function analysis_data(my_str)
Dim ana_arr
ana_arr = Split(my_str, "+")
analysis_data = ana_arr
End Function
主要运行过程:
Option Explicit
Option Base 1
Sub new_test()
Dim goal_id#
Dim goal_time#
Dim sum_cost#
Dim aver_time#
Dim aver_cost#
Dim sum_time#
Dim goal_id_needtime#
Dim brr
Dim test_sht
Dim k#
Dim T#
'-----------------------载入数据-------------------------
Set test_sht = Sheet1                                  '|
With test_sht                                          '|
    brr = .[A2].Resize(.[A1].End(xlDown).Row - 1, 4)   '|
    goal_id = .[H2]                                    '|
    goal_time = .[I2]                                  '|
    .[k2] = 0                                          '|
    .[H4] = "···"                                   '|
    .[I4] = "···"                                   '|
End With                                               '|
'-----------------------循环模拟-------------------------
    '----初始化数据----
    aver_time = 0
    aver_cost = 0
    sum_time = 0
    sum_cost = 0
    For k = 1 To goal_time
    '----初始化数据----
        set_id = 1
        goal_id_needtime = 0
            '---------调用随机过程-------
            Do Until set_id = goal_id
                rand_show (brr)
                goal_id_needtime = goal_id_needtime + 1
                sum_cost = sum_cost + set_cost
            Loop
        sum_time = sum_time + goal_id_needtime
    test_sht.[k2] = k / goal_time
    delay 0.0001
    Next k
    '-----------------TEST数据存入数组-----------------
    aver_cost = Round(sum_cost / k, 2)
    aver_time = Round(sum_time / k, 2)
'--------------------数据输出---------------------
With test_sht
    .[H4] = aver_time
    .[I4] = aver_cost
End With
End Sub
Function delay(T As Single)
Dim T1 As Single
T1 = Timer
Do
DoEvents
Loop While Timer - T1 < T
End Function

解析函数:用来解析数据表里的特殊格式数据
随机算法:用权重来随机取值,这里数据格式很自由所以考虑了如果权重填0也正常的判断。
主过程:用于取得参数来运行主逻辑。
延迟函数:主要是为了防止次数太多时EXCEL运算有概率会卡死,因为EXCEL会以最快速度运算,配置不好会无响应一段时间这段时间内无法操作电脑。
代码相对来说还算通用,大家可以借鉴参考。


6

主题

22

帖子

174

积分

注册会员

Rank: 2

积分
174
发表于 2016-9-13 15:54:15 | 显示全部楼层
干货,代码简洁思路清晰~~~~~

11

主题

27

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2016-9-13 16:00:31 | 显示全部楼层
学习啦,3Q

PS:话说现在老是有程序员出来冒充策划,真是讨厌,嘿嘿.......(玩笑玩笑)

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
 楼主| 发表于 2016-9-13 16:05:26 | 显示全部楼层
qzjojo 发表于 2016-9-13 16:00
学习啦,3Q

PS:话说现在老是有程序员出来冒充策划,真是讨厌,嘿嘿.......(玩笑玩笑) ...

真的是策划,不信你看,被美术砍过的伤!

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
 楼主| 发表于 2016-9-13 21:25:29 | 显示全部楼层
有什么问题欢迎大家提问

0

主题

15

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2016-9-14 15:58:46 | 显示全部楼层
goal_id = .[H2]                                    '|
运行到这得时候提示  “‘类型不匹配’”
楼主,这是什么问题,我表格填的和你一模一样

2

主题

46

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
QQ
 楼主| 发表于 2016-9-14 21:05:50 | 显示全部楼层
陶哥哥 发表于 2016-9-14 15:58
goal_id = .[H2]                                    '|
运行到这得时候提示  “‘类型不匹配’”
楼主, ...

你的数据是在哪个sheet表,我不是按表名声明的是sheet的编号

9

主题

55

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
发表于 2016-9-17 13:49:01 | 显示全部楼层
如果能解释一下你的代码大大概是什么意思就更好了。
马尔科夫链 转换到 具体代码的过程和思路,解释方面的

我下了楼主的文档,做了些修改,感觉快了些。但不知道是不是原来的效果了。

0

主题

104

帖子

1602

积分

金牌会员

Rank: 6Rank: 6

积分
1602
发表于 2016-9-17 16:32:38 | 显示全部楼层
good 这才像个策划论坛

9

主题

55

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
发表于 2016-9-17 19:59:23 | 显示全部楼层
捕获4.PNG
这是我修改后的效果。
不知道有没有改错什么东西。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-20 03:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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