MADDPG-学习笔记(1)

news2024/11/25 20:34:44

文献链接:https://arxiv.org/abs/1706.02275

"Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"(作者:Lowe, Ryan等人,2017年)

环境搭建:https://zhuanlan.zhihu.com/p/41954025

MADDPG代码讲解博客链接:https://blog.csdn.net/qq_41871826/article/details/110678626?spm=1001.2014.3001.5506

多智能体粒子环境(multiagent-particle-envs)链接
https://github.com/openai/multiagent-particle-envs

MADDPG代码链接:https://github.com/openai/maddpg

注意:学习者多看相关博客文章的评论等,会有一些错误的解决方式。

注意:本文是按照https://zhuanlan.zhihu.com/p/41954025这篇文章搭建的环境,执行的是simple这个环境

python train.py --scenario simple

使用的环境:ubuntu18.04、python3.6.13、numpy1.19.5、gym0.10.5、tensorflow1.8.0

目录

1.报错

1.1 TypeError: must be str, not NoneType

1.1.1 第一种解决方式-添加条件

1.1.2 第二种解决方式-打印哪个为空

1.1.3 第三种解决方式- default=" "

1.2 Non-UTF-8 code starting with '\xcc' in file train.py

1.3 FileNotFoundError: [Errno 2] No such file or directory

1.4 InvalidArgumentError (see above for traceback)

1.5 NotFoundError (see above for traceback)

1.6 [ 4844.367517] Out of memory:

1.7 set the environment variable `SUPPRESS_MA_PROMPT=1`

2.问题

2.1 Linux中隐藏文件是如何显示的?

2.2 使用ls -a显示 . .. train.py是什么意思?

2.3 c#中\t

2.4 display和render区别和联系


1.报错

1.1 TypeError: must be str, not NoneType

正常训练的显示:

 train.py文件链接:https://github.com/openai/maddpg/blob/master/experiments/train.py

Traceback (most recent call last): File "train.py", line 193, in <module> train(arglist) File "train.py", line 182, in train rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl' TypeError: must be str, not NoneType

注意:这个错误是执行到1499975步发生的,即将结束的阶段(episodes总共60000个):

steps: 1499975, episodes: 60000, mean episode reward: -6.559353017320698, time: 10.777

其实错误发生在在往learning_curves中写入结果时报错:

parser.add_argument("--plots-dir", type=str, default="./learning_curves/", help="directory where plot data is saved")

报错对应的代码: 

           if len(episode_rewards) > arglist.num_episodes:
                rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
                with open(rew_file_name, 'wb') as fp:
                    pickle.dump(final_ep_rewards, fp)
                agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
                with open(agrew_file_name, 'wb') as fp:
                    pickle.dump(final_ep_ag_rewards, fp)
                print('...Finished total of {} episodes.'.format(len(episode_rewards)))
                break 

根据错误信息,问题出现在 "train.py" 文件的第 193 行,具体原因是在第 182 行中 arglist.plots_dir + arglist.exp_name + '_rewards.pkl' 的部分。错误信息表明出现了类型错误,需要的是字符串类型,而实际上得到的是 NoneType 类型。

这个错误通常表示 arglist.plots_dirarglist.exp_name 中的一个或多个值为 None。导致这种情况可能有以下几种原因:

①检查是否正确设置了 arglist.plots_dirarglist.exp_name 的值。确保它们被正确赋值为字符串类型,并且没有被设置为 None

②如果这些值是从命令行参数或配置文件中获取的,请检查输入参数或配置文件中对应的键是否正确,并确保为它们提供了有效的值。

③如果这些值是在代码中动态生成的,请确保生成路径的过程没有出现错误,并且生成的结果是预期的字符串类型。

1.1.1 第一种解决方式-添加条件

为了解决这个问题,可以添加一些检查来确保文件名的生成不会引用空值或 None 值。下面是一个示例的修改建议:

if len(episode_rewards) > arglist.num_episodes:
    rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
    if rew_file_name is not None:  # 添加检查,确保文件名不为 None
        with open(rew_file_name, 'wb') as fp:
            pickle.dump(final_ep_rewards, fp)
    agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
    if agrew_file_name is not None:  # 添加检查,确保文件名不为 None
        with open(agrew_file_name, 'wb') as fp:
            pickle.dump(final_ep_ag_rewards, fp)
    print('...Finished total of {} episodes.'.format(len(episode_rewards)))
    break

在上述修改中,添加了两个条件检查来确保 rew_file_nameagrew_file_name 不为 None。这样可以避免出现文件名为 None 导致的错误。

注意:我照此种方法改代码出现了同样的错误

1.1.2 第二种解决方式-打印哪个为空

可以在代码中打印相关变量的值,以便进一步调试和确定问题所在。

rew_file_nameagrew_file_name 的生成代码之前,添加以下打印语句:

print("arglist.plots_dir:", arglist.plots_dir)
print("arglist.exp_name:", arglist.exp_name)

这将显示 arglist.plots_dirarglist.exp_name 的值。检查这些值是否为空或不正确,可能是导致文件名为空的原因。

打印结果:

arglist.plots_dir: ./learning_curves/
arglist.exp_name: None

要解决这个问题,需要确保在设置 arglist.exp_name 变量时赋予它一个非空的值。检查代码中设置 arglist.exp_name 的部分,并确保为其赋予一个合适的字符串值。

例如,可以在设置 arglist.exp_name 的地方添加以下代码:

arglist.exp_name = "your_experiment_name"

代码具体的添加方法:

if len(episode_rewards) > arglist.num_episodes:
    if arglist.exp_name is None:
        arglist.exp_name = "my_experiment"
    rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
    with open(rew_file_name, 'wb') as fp:
        pickle.dump(final_ep_rewards, fp)
    agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
    with open(agrew_file_name, 'wb') as fp:
        pickle.dump(final_ep_ag_rewards, fp)
    print('...Finished total of {} episodes.'.format(len(episode_rewards)))
    break

注意:这种方法尝试了之后仍然出现相同的错误,具体不清楚是文件名起的不对,还是什么。

在命令行输入仍然报相同的错误:

python your_script.py --exp-name my_experiment

1.1.3 第三种解决方式- default=" "

解决方式:将default=None改为default=" "

没有了TypeError: must be str, not NoneType这个错误

    # Checkpointing
    parser.add_argument("--exp-name", type=str, default="", help="name of the experiment")

    # parser.add_argument("--exp-name", type=str, default=None, help="name of the experiment")

但出现了新的错误:

Traceback (most recent call last): File "train.py", line 196, in <module> train(arglist) File "train.py", line 186, in train with open(rew_file_name, 'wb') as fp: FileNotFoundError: [Errno 2] No such file or directory: './learning_curves/_rewards.pkl'

这个错误提示表明在打开文件'./learning_curves/_rewards.pkl'时发生了找不到文件或目录的错误。

解决方式:在当前目录(即包含train.py文件的目录)下创建learning_curves

mkdir learning_curves

1.2 Non-UTF-8 code starting with '\xcc' in file train.py

File "train.py", line 184 SyntaxError: Non-UTF-8 code starting with '\xcc' in file train.py on line 184, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

根据提供的错误信息,遇到了一个编码错误 SyntaxError: Non-UTF-8 code starting with '\xcc' in file train.py on line 184, but no encoding declared

这个错误通常发生在代码文件中存在非 UTF-8 编码的字符,而没有声明文件的编码类型。在 Python 中,为了正确地解析和处理文件中的特定字符集,需要在代码文件的开头添加编码声明。

要解决这个问题,可以在代码文件的开头添加一个编码声明行,指明文件的编码类型。

例如,如果代码文件使用的是 UTF-8 编码,可以在文件的开头添加以下行:

# -*- coding: utf-8 -*-

确保将上述行添加到代码文件的开头,并在其中指定适当的编码类型(例如 UTF-8)。

在代码文件 train.py 中的第 1 行之前添加编码声明行,然后保存文件并重新运行您的代码,这应该能够解决编码错误。

另外,如果代码文件确实包含了其他编码的字符集,并且不是 UTF-8 编码,请根据实际情况选择适当的编码类型,并在编码声明行中进行声明。

1.3 FileNotFoundError: [Errno 2] No such file or directory

2023-05-16 08:37:33.982168: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Traceback (most recent call last): File "train.py", line 194, in <module> train(arglist) File "train.py", line 82, in train env = make_env(arglist.scenario, arglist, arglist.benchmark) File "train.py", line 54, in make_env scenario = scenarios.load(scenario_name + ".py").Scenario() File "/home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/__init__.py", line 7, in load return imp.load_source('', pathname) File "/home/xiaowang/anaconda3/envs/py3.6/lib/python3.6/imp.py", line 172, in load_source module = _load(spec) File "<frozen importlib._bootstrap>", line 684, in _load File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 674, in exec_module File "<frozen importlib._bootstrap_external>", line 780, in get_code File "/home/xiaowang/anaconda3/envs/py3.6/lib/python3.6/imp.py", line 158, in get_data return super().get_data(path) File "<frozen importlib._bootstrap_external>", line 832, in get_data FileNotFoundError: [Errno 2] No such file or directory: '/home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/simple_adversary.py.py'

根据错误信息,是找不到文件 /home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/simple_adversary.py.py

检查文件路径,确保文件存在,并且文件名没有重复的扩展名。在错误信息中,文件名的末尾似乎有一个额外的 .py 扩展名,可能是重复添加导致的。

解决方法,

删除一个.py后缀

1.4 InvalidArgumentError (see above for traceback)

InvalidArgumentError (see above for traceback): Unsuccessful TensorSliceReader constructor: Failed to get matching files on /tmp/policy/: Not found: /tmp/policy; No such file or directory [[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]

这个错误表明在执行 TensorFlow 模型恢复操作时,找不到指定的文件或目录。具体来说,它指示找不到 /tmp/policy/ 目录下的文件。

解决方法:

再训练一次,观察/tmp/policy/ 目录是否生成。因为只有训练时才会产生,如果是第一次训练,是没有这个路径的。

1.5 NotFoundError (see above for traceback)

Caused by op 'save/RestoreV2', defined at:
File "./experiments/train.py", line 193, in <module>
train(arglist)
File "./experiments/train.py", line 96, in train
U.load_state(arglist.load_dir)
File "d:\pytorch\maddpg-master\maddpg\common\tf_util.py", line 229, in load_state
saver = tf.train.Saver()

……
NotFoundError (see above for traceback): Key agent_1/agent_1/p_func/fully_connected/biases/Adam not found in checkpoint
[[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT
, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/R
estoreV2/shape_and_slices)]]

解决方法:

1.6 [ 4844.367517] Out of memory:

在运行simple_adversary.py这个环境时报的错

[ 4844.367517] Out of memory: Kill process 2996 (python) score 424 or sacrifice child [ 4844.367530] Killed process 2996 (python) total-vm:2244352kB, anon-rss:1296896kB, file-rss:0kB, shmem-rss:0kB

这个错误表明系统内存不足,导致进程被操作系统终止。

这种情况通常发生在程序使用了过多的内存资源,而系统无法为其提供足够的内存空间。这可能是由于程序本身的内存使用量较大,或者系统上同时运行的其他进程也占用了大量的内存资源。

1.7 set the environment variable `SUPPRESS_MA_PROMPT=1`

Please read the raised warning, then press Enter to continue... (to suppress this prompt, please set the environment variable `SUPPRESS_MA_PROMPT=1`)

请阅读所提出的警告信息,然后按回车键继续...(如果要禁止此提示,请设置环境变量SUPPRESS_MA_PROMPT=1

在Linux系统中,可以通过以下方式设置环境变量:

 临时设置:在终端中执行以下命令来临时设置环境变量:

export SUPPRESS_MA_PROMPT=1

永久设置:要在系统中永久设置环境变量,可以编辑用户的配置文件。

常见的配置文件包括~/.bashrc~/.bash_profile~/.profile等。使用文本编辑器打开其中一个文件,然后在文件的末尾添加以下行:

export SUPPRESS_MA_PROMPT=1

保存文件并关闭文本编辑器。

接下来,在终端中运行以下命令以使更改生效:

source ~/.bashrc

或者,您可以注销并重新登录系统,使更改生效。

请注意,上述示例中的SUPPRESS_MA_PROMPT是一个示例环境变量名称,您可以根据需要自定义环境变量名称。同样,示例中的值为1,但您可以根据需要设置不同的值。

设置环境变量后,应该不再收到"Please read the raised warning, then press Enter to continue..."的提示

2.问题

2.1 Linux中隐藏文件是如何显示的?

在Linux系统中,文件名以点(.)开头的文件被视为隐藏文件。默认情况下,使用常规的 ls 命令是无法显示隐藏文件的,但可以通过添加命令参数来显示它们。

要显示所有文件(包括隐藏文件),您可以使用以下命令:

ls -a

或者,如果您只想查看隐藏文件,您可以使用以下命令:

ls -ld .?*

这个命令使用了通配符 .?*,它会匹配以点开头的文件和目录(隐藏文件)。命令的输出将显示隐藏文件的详细信息。

请注意,隐藏文件的名称通常是以点开头的,例如 .bashrc.gitignore。如果您在指定路径中没有看到类似的文件名,请确保目录中确实存在隐藏文件。

2.2 使用ls -a显示 . .. train.py是什么意思?

在Linux系统中,使用 ls -a 命令会显示当前目录中的所有文件和目录,包括隐藏文件和特殊目录。

  • . 代表当前目录,即命令执行的目录本身。
  • .. 代表当前目录的上级目录,即父级目录。

这两个特殊项是每个目录中的默认项。它们用于表示目录结构中的位置关系。下面是对它们的详细说明:

  1. . (点)

    • 在命令行中,. 表示当前目录
    • 在文件系统中,每个目录中都存在一个隐含的 . 条目,表示该目录本身。
    • 例如,如果你执行 ls -a 命令,你会看到以 . 开头的文件或目录,它们是当前目录下的内容。.. (点点)
      • 在命令行中,.. 表示当前目录的上级目录
      • 在文件系统中,每个目录中都存在一个隐含的 .. 条目,表示该目录的上级目录。
      • 例如,如果你执行 ls -a 命令,你会看到以 .. 开头的文件或目录,它们是当前目录的父级目录下的内容。

在您提供的示例中,ls -a 命令显示了当前目录下的所有文件和目录,其中包括隐藏文件(以 . 开头的文件或目录)以及默认的 ... 条目。

train.py 是一个普通的文件,它是当前目录中的一个Python源代码文件。

2.3 c#中\t

在C#中,\t 是一个转义序列,代表水平制表符(Tab)。当你将 \t 插入到字符串中时,它将在该位置插入一个水平制表符,从而产生一段水平对齐的空格。

下面是一个示例,演示如何在C#中使用 \t

string text = "Name:\tJohn\nAge:\t25";
Console.WriteLine(text);

输出结果将是:

Name:   John
Age:    25

注意到在字符串中的 \t 被解释为一个水平制表符,生成了一段空格来实现对齐效果。

使用 \t 可以帮助在输出文本时创建整齐对齐的格式,特别是在表格或其他需要垂直对齐的情况下。

2.4 display和render区别和联系

在强化学习中,displayrender 是用于可视化环境的两个相关概念,它们有一些区别和联系。

  • displaydisplay 通常用于指示是否在训练过程中显示环境的可视化界面,以便观察智能体与环境的交互情况。当 display 设置为 True 时,环境将在训练过程中以可视化形式呈现,允许您实时观察智能体的决策和环境的状态。这对于调试和直观理解算法的表现很有帮助。

  • renderrender 是一个环境提供的方法,用于将当前环境状态渲染成可视化图像或视频。通过调用环境的 render 方法,您可以获取当前环境状态的可视化表示。渲染通常用于演示、记录或展示智能体在环境中的表现。

联系:

  • 在某些情况下,display 参数可能会调用环境的 render 方法来显示环境的可视化界面。当 display 设置为 True 时,通常会在每个时间步骤调用环境的 render 方法来实时显示环境状态。
  • displayrender 都与环境的可视化相关,它们提供了一种观察智能体与环境交互的方式,帮助您理解和调试算法。

需要注意的是,具体的实现可能因环境库、框架或代码而有所不同。因此,在使用特定的强化学习库或框架时,最好查阅相关文档以了解准确的定义和用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【保姆级教程】Windows安装CUDA及cuDNN

Windows安装CUDA及cuDNN 前言1. 第一次安装CUDA2. 第N次安装CUDA 一、 CUDA1. 查询CUDA版本2. 下载CUDA3. 安装CUDA4. 配置CUDA环境变量5. 检查CUDA是否安装成功 二、 cuDNN1. cuDNN版本的查询及下载2. 安装cuDNN3. 配置cuDNN的环境变量4. 检查cuDNN是否安装成功 三、查询CUDA及…

Linux常见指令理解

查看 Linux 主机 ip 在终端下敲 ssh[ip] ip 为刚才看到的 ifconfig 结果. 如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆 XShell 下的复制粘贴 复制: ctrl insert (有的 insert 需要配合 fn 来按) 粘贴: shift insert ctrl c / ctrl v 是不行的. Linu…

【C语言刷题——Leetcode10道简单题】

✨作者&#xff1a;平凡的人1 ✨专栏&#xff1a;《小菜鸟爱刷题》 ✨一句话&#xff1a;凡是过往&#xff0c;皆为序章 ✨说明: 过去无可挽回&#xff0c; 未来可以改变 今天是考四六级的日子&#xff0c;不知道大家考得怎么样呀&#xff1f;(反正我是寄了&#xff0c;好多没明…

Vue CLI ref props mixin plugin scoped

3.2. ref 属性 ref被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09; 应用在html标签上获取的是真实DOM元素&#xff0c;应用在组件标签上获取的是组件实例对象vc使用方式 打标识&#xff1a;或获取&#xff1a;this.$refs.xxx <template> <di…

Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件的名称&#xff0c;从另一个文件夹中找到与这一文件夹中文件同名的文件&#xff0c;并将找到的同名文件复制到第三个文件夹中的方法。 首先&#xff0c;我们来明确一下本…

【网络】深入浅出了解网络世界

HTTP协议 TCP/IP协议族 我们通常使用的网络&#xff0c;是在TCP/IP协议族上运作的。而HTTP协议就是TCP/IP内部的一个子集。 计算机与网络设备之间的通讯需要一定的规则&#xff0c;这种规则就称为协议。 TCP/IP就是互联网上各种协议的总称。 分层管理 TCP/IP 按层次分为…

架构活动中评估需求的五个关注点

从架构活动的整体目标出发&#xff0c;确认需求存在的必要性。很多时候&#xff0c;尤其是大的项目&#xff0c;需求方经常会夹带私货。虽然他们并没有什么恶意&#xff0c;但是这些附加的需求不仅会消耗研发资源&#xff0c;还会增加项目复杂度和规划难度。而最坏的情况&#…

【王道·计算机网络】第四章 网络层【未完】

一、 概述和功能 1.1 网络层功能 主要任务&#xff1a;把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务传输单位&#xff1a;数据报功能&#xff1a; 路由选择与分组转发&#xff0c;即选择最佳路径异构网络互联(依靠路由器)拥塞控制(所有结点都来不…

会议日程——2023第十二届中国PMO大会

2023第十二届中国PMO大会 主题&#xff1a;拥抱变革 展现PMO力量 主办方&#xff1a;PMO评论 签到与入场&#xff1a;人脸识别 时间&#xff1a;6月17-18日 地点&#xff1a;北京蓝调庄园 【邀 请 函】 企业要基业长青就必须持续保持组织活力。企业的内外部环境不会一成不…

Java --- redis实现分布式锁

目录 一、锁的种类 二、分布式锁具备的条件与刚需 三、springbootredisngnix单机实现案例 四、Nginx配置负载均衡 4.1、修改nginx配置文件 4.2、执行启动命令 4.3、启动微服务程序测试 五、使用redis分布式锁 5.1、方法递归重试 5.2、自旋方式 5.3、添加key过期时间&#xff0…

Vue3如何按需引入Element Plus以及定制主题色

1.首先使用指令进行安装 npm install element-plus --save 2.安装按需引入另外两个插件 npm install -D unplugin-vue-components unplugin-auto-import 3.在vite.config.js文件引入以下内容 import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite i…

CloudFlare系列--自定义CDN节点的IP

原文网址&#xff1a;CloudFlare系列--自定义CDN节点的IP_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍CloudFlare如何手动指定CDN为CloudFlare的IP地址。 为什么手动指定CDN IP&#xff1f; 自选节点非常重要&#xff0c;原因如下&#xff1a; 国内访问不同CDN节点的速…

Linux vim光标移动/退出命令/撤退操作/文本查找 等命令大全

1 什么是vim&#xff1f; vim是Linux环境下一款强大、高度可定制的文本编辑工具。能够编辑任何的ASCII格式文件&#xff0c;对内容进行创建、查找、替换、修改、删除、复制、粘贴等操作。编写文件时&#xff0c;无需担心目标文件是否存在&#xff0c;若不存在则会自动在内存中…

老Q魔改MACD:拒绝大幅回撤,威力比原版强太多了!

看过老Q历史文章的股友都知道,MACD是一个非常经典且依旧奋战在第一线的顶流指标。我们之前也目前主流通用的参数版本在沪深300上做了回测,17年来获得了累计365%的收益。 然而,整个沪深300大盘在这17年里也涨了超过300%,也就是说,我们的策略也仅仅比拿着不动好上一丢丢而已…

JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)

文章目录 1. Java8新特性&#xff1a;Lambda表达式1.1 关于Java8新特性简介1.2 冗余的匿名内部类1.3 Lambda 及其使用举例1.4 语法1.5 关于类型推断 2. Java8新特性&#xff1a;函数式(Functional)接口2.1 什么是函数式接口2.2 如何理解函数式接口2.3 举例2.4 Java 内置函数式接…

高压功率放大器在换流阀冷却系统均压电极结垢超声导波中的应用

实验名称&#xff1a;换流阀冷却系统均压电极结垢超声导波检测方法研究 研究方向&#xff1a;无损检测 测试目的&#xff1a; 为了探究超声导波检测的灵敏度&#xff0c;本文构建了换流阀冷却系统均压电极结垢检测模型&#xff0c;详细分析了不同厚度水垢与声波信号的交互过…

【c++】哈希---unordered容器+闭散列+开散列

1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 logN&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进…

FPGA开发基本流程详解

FPGA是一种可编程逻辑器件&#xff0c;与传统的硬连线电路不同&#xff0c;它具有高度的可编程性和灵活性。FPGA的设计方法包括硬件设计和软件设计两部分&#xff0c;硬件设计包括FPGA芯片电路、存储器、输入输出接口电路等等&#xff0c;软件设计则是HDL程序开发&#xff0c;以…

openCV 第四篇 角点检测、图像特征、图片拼接

本文原本打算直接简单介绍一下harris和sift&#xff0c;之后进行特征匹配&#xff0c;来一波图像拼接。 想来想去还是先介绍下原理吧&#xff0c;虽然没人看QAQ。可以直接点击右侧目录跳转到代码区。 本文可以完成&#xff1a; 角点检测 和 图像特征提取(就几行代码) 以及进…

Win32子窗口创建,子窗口回调函数,消息堆栈,逆向定位子窗口消息处理过程

本专栏上一篇文章中我们讲解了Win32程序入口识别&#xff0c;定位回调函数&#xff0c;具体事件处理的定位&#xff0c;这一章节中我们来讲解一下子窗口的创建&#xff0c;子窗口的回调函数&#xff0c;并且逆向分析子窗口消息处理过程。 文章目录 一.子窗口按钮的创建- 创建子…