C/C++ 编程代写
当前位置:以往案例 > >CS案例之C语言代码案例基于概率的冒险游戏
2018-01-08

下载 (2).jpg、

说明

对于这个任务,你需要实现两个功能来完成⼀一个“⽹网格世界”项⽬目,这是⼀一个基于概率的冒险游戏。 您需要使⽤用⻢马尔可夫决策过程(MDP)技术来分析⽹网格世界中每个位置的潜在“⻛风险”,并提供建议 采取的措施。 因此,⼀一个策略略将在值迭代后最终输出。 以下是您需要实现的两个功能:



函数1:void MDP :: computeQValue(State&s,const int action)


这个函数被另⼀一个函数–valueIteration()调⽤用,你也需要实现它。 由于函数名称暗示

“computeQValue”,因此您需要根据所采取的操作更更新状态s的Q值。 每个州有四个与“东”,“南”,

“⻄西”和“北北”⾏行行动相对应的Q值。 如果输⼊入动作是“南”,则需要为“南”动作更更新s的相应Q值。输⼊入:

(1)国家&s – 实际上这是该函数的输⼊入和输出参数。最初,您根据s的位置和第⼆二个输⼊入参数

“action”使⽤用此输⼊入来确定潜在的下⼀一个状态。 “状态”的数据结构在“MDP.h”⽂文件中定义。


(2)int action – 从状态s到下⼀一个状态的动作。有四种不不同的⾏行行动:东,南,⻄西,北北。它们的数据类型是整数,它们在MDP.h的开头定义为宏:

#define ACTION_EAST 0

#define ACTION_SOUTH 1

#define ACTION_WEST 2

#define ACTION_NORTH 3


注意:


(a)请使⽤用上述国家的“q_values”⾏行行动顺序。每个状态有四个Q值,可以存储在⼀一个数组中。所以每个数组成员的值与四个动作的顺序相同。例例如,q_values [2]对应于动作:ACTION_WEST; q_values [1]对应于动作:ACTION_SOUTH。


(b)此外,您需要确定何时采取了了每项⾏行行动,您需要检查沿着⽅方向是“墙”(位置(1,1))的 下⼀一个状态s',否则s'不不在的边界。如果是这样,它会反弹回s,所以s'= s。


(c)您还需要更更新类数据成员“float cur_convergence”以记录当前迭代中所有状态的q_values

的最⼤大变化。这⾥里里“最⼤大的变化”意味着所有状态的所有q_value中的⼀一个,⽽而不不是⼀一个状态的四个

q_value中的⼀一个。



函数2:void MDP :: valueIteration()


虽然它被称为“valueIteration”,但这⾥里里并没有涉及迭代。迭代过程由“VisualDisplay”类中的“onGo

()”函数控制,该函数是“play”按钮的响应函数。因为我们希望看到每次迭代的临时结果,所以我必须移动迭代的代码进展到GUI部分。



事实上,它在⼀一定程度上简化了了您在“valueIteration()”实现⽅方⾯面的⼯工作。你不不需要使⽤用循环来做 任何迭代。你只是假定这个函数被调⽤用时,它是在⼀一个特定的迭代。你只需要更更新所有状态的“state_value”,这些状态被存储为类数据成员:“states [3] [4]”。当你进⾏行行状态值更更新时,你需要调

⽤用“computeQValue(State&s,int  action)”函数先计算q_values  [4]并选择最⼤大值作为状态值。有

⼀一件事需要注意,是有三个特殊的正⽅方形或状态:墙(1,1),钻⽯石(1,3)和陷阱(2,3)。对于这 三种状态,您不不需要更更新其状态值或q_values。



其他⼀一些信息:


在实现上述两个功能时,需要使⽤用⼏几个重要变量量。这些变量量在“MDP.h”⽂文件的宏(顶部)中定义。


(1)“TRANSITION_SUCCEED” – 成功达到预期下⼀一个状态的条件概率。例例如,当你采取⾏行行动北北⽅方时,你有80%的可能性到达北北⽅方。


(2)“TRANSITION_FAIL” – 作为“TRANSITION_SUCCEED”的对⽴立部分,您有20%的概率未按预期着陆。你可以沿着⾏行行动的相邻⽅方向到达州,每个州10%。例例如,当你采取⾏行行动北北⽅方时,你可能有10%的登陆⻄西部,10%登陆东部。


(3)“GAMMA” – 折扣系数。


(4)“ACTION_REWARD” – 每个动作的即时奖励。


(5)“CONVERGENCE” – 该变量量由VisualDisplay类使⽤用,它将决定迭代何时停⽌止。


1513067809116994.png

在线提交订单