17伪代码1

1. 创建一个类的过程
1.1 创建类的总体设计

​ 设计一个类的过程包含一些特有的设计任务——定义类的特定职责,定义类所有隐藏的“秘密”,以及精确地定义了类的接口所代表的抽象概念;决定这个类是否要从其他类派生而来,以及是否允许其他类再从它派生;指出这个类中关键的公用方法,标识并设计出类所需用到的重要数据成员。上述这些设计任务可能需要反复迭代多次,直到直接了当地设计出了程序为止。

1.2 创建类中的子程序

​ 你在前面第一个步骤中标识出类的主要子程序之后,还需要创建这些子程序。在编写各个程序时通常还会引出更多的获重要、或次要的子程序,创建这些新加入的子程序的过程往往还会反过来波及类的总体设计。

1.3 复审并测试整个类

​ 通常情况下,子程序在创建的同时也经过了测试。在整个类可以工作之后,应该再对其整体进行复查和测试,以便发现那些在子程序的独立测试层次上无法测出的问题。

2. 创建子程序的步骤

​ 在创建子程序的过程中涉及到的主要活动——也就是设计子程序、检查设计、编写子程序的代码、检查代码。

3. 伪代码

​ “伪代码”这个术语是指某种用来描述算法、子程序、类或完整程序的工作逻辑的、非形式的、类似于英语的记法。伪代码编程过程则是一种通过书写伪代码而更高效地创建程序代码的专门方法。

3.1 下面是一些有效使用伪代码的知道原则。
  • 用类似英语的语句来精确描述特定的操作

  • 避免使用目标编程语言中的语法元素。伪代码能让你咋一个比代码本身略高的层次上进行设计。当用编程语言来构建时,你就又降到了更低的层次上,这不但失去了在更高层次上设计时所能得到的主要好处,而且也会受限与不必要的语法上的约束。

  • 在本意的层面上编写伪代码。用伪代码去描述解决问题的方法的意图,而不是去写如何在目标语言中实现这个方法。

  • 在一个足够低的层次上编写伪代码。以便可以近乎自动的从它生成代码。如果伪代码的层次太高,就会掩盖代码中的问题细节。你应该不断的精化伪代码,加入越来越多的细节,直到看起来已经很容易直接写出伪代码为止。

    伪代码一经写好,你就可以依照它去生成代码了,同时还把伪代码变成编程语言中的注释。这样就节省了大部分注释的工作。如果伪代码是按照上述各原则写成的,那么这些注释就会很完整也很有意义了。

3.2 使用这种风格伪代码的好处
  • 伪代码使得评审更容易。你无须检查源代码就可以评审细节设计。伪代码使的底层设计的评审工作更容易,同时减少了对代码本身进行评审的需要。

  • 伪代码支持反复迭代精化的思想。从一个高层设计开始,把这一设计精化为伪代码,然后再把伪代码精化为源代码。这样持续不断地小步精化,使你可以在把它推向更低的层次的同时,不断检查已形成的设计。这样做的结果,使你可能在最高的层次上发现最高层次的错误,在中间的层次上发现中间层次的错误,而在最低的层次上发现最低层次的错误——避免其中的任何错误变成真正的问题或者危害到更细节层次的工作。

  • 伪代码使变更更加容易。短短几行伪代码要比整页的代码更容易修改。

  • 伪代码能使给代码做注释的工作量减到最少。在典型的编码过程中,人们都是先写出代码,然后再添加注释。而在伪代码编程过程中,伪代码中的语句将会变为代码中的注释,所以实际上更多的工作是删除注释,而不是把它加进来。

  • 伪代码比其他形式的设计文档更容易维护。使用其其他方法时,设计和代码是分离的,当其中之一变动的时候,两者就不再一致。而使用伪代码编程过程时,伪代码中的语句将会转变为代码中的注释。因此只要维护代码间的这些注释,那么这些伪代码所形成的设计文档就仍然是准确的。

    作为进行详细设计的工具,很难有其他方法能与使用伪代码相媲美。一项调查表明,程序员们更使用伪代码,因为它简化了用编程语言进行构建的工作,且有助于发现细节设计中的不足之处,还能简化文档的编制以及修改的工作。诚然,伪代码不是进行详细设计的唯一工具,但是伪代码和伪代码编程过程却都会是你非常有用的工具。

转载于:https://www.cnblogs.com/rock-cc/p/11022888.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MADDPG(Multi-Agent Deep Deterministic Policy Gradient)是一个多智能体强化学习算法,它是 DDPG 算法在多智能体场景下的扩展。 下面是 MADDPG 的伪代码: 1. 初始化每个智能体的 actor 网络和 critic 网络 2. 初始化 replay buffer 3. for episode = 1 to M do 4. for t = 1 to T do 5. for each agent i do 6. 根据 actor 网络和噪声生成动作 a_i 7. 执行动作 a = (a_1, a_2, ..., a_n) 8. 观察环境状态 s' 和奖励 r 9. 将 (s, a, r, s') 存储到 replay buffer 中 10. if the number of samples in replay buffer is greater than batch size then 11. for each agent i do 12. 从 replay buffer 中随机采样一批数据 13. 计算目标 Q 值 target_Q_i = r_i + gamma * critic_target(s', actor_target(s')) 14. 计算当前 Q 值 Q_i = critic(s, a) 15. 更新 critic 网络参数 theta_i by minimizing the loss: L = 1/N * sum((target_Q_i - Q_i)^2) 16. 计算 actor 的梯度 dJ/dtheta_i = 1/N * sum(dQ_i/da_i * da_i/dtheta_i) 17. 更新 actor 网络参数 theta_i using the gradient dJ/dtheta_i 18. soft update actor_target 和 critic_target 网络参数 19. end if 20. end for 21. end for 在这个伪代码中,每个智能体的 actor 网络和 critic 网络都是独立的,每个智能体都在执行自己的 actor 网络生成动作。 在更新 critic 网络时,每个智能体的 critic 网络都使用一个共同的 replay buffer,但每个智能体的目标 Q 值、当前 Q 值和梯度都是独立计算的。 在更新 actor 网络时,每个智能体的 actor 网络也是独立更新的,但 softmax 函数的输入是所有智能体 actor 网络输出的总和,因此每个智能体在更新 actor 网络时需要考虑其他智能体的影响。 最后,在更新 actor 网络和 critic 网络时,使用了 soft update 的策略,使得目标网络与真实网络的参数逐渐趋近。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值