moea项目的问题解决方案

moea项目的相关问题

  • 报错1:run_GAN-adjlvxm.py': [Errno 2] No such file or directory
  • 报错2:mkdir: cannot create directory ‘./result’: File exists
  • 报错3:from function.APG-SMOEA_framework import optimize
  • 对sh test.sh进行计时
  • 脚本解读
    • 解读1
    • 解读2
  • py文件的命名带有-
  • .format

报错1:run_GAN-adjlvxm.py’: [Errno 2] No such file or directory

(moea) aaa@ASUS:~/ML/paper/APG-SMOEA/code$ sh test.sh
python: can't open file '/home/aaa/ML/paper/APG-SMOEA/code/run_GAN-adjlvxm.py': [Errno 2] No such file or directory
Finish GAN-adjlvxm on 1

修改了run_benchmark.sh的line22->line23

报错2:mkdir: cannot create directory ‘./result’: File exists

(moea) aaa@ASUS:~/ML/paper/APG-SMOEA/code$ sh test.sh
mkdir: cannot create directory ‘./result’: File exists
mkdir: cannot create directory ‘./pop’: File exists

这个错误信息表示 test.sh 脚本试图创建两个目录(./result 和 ./pop),但这些目录已经存在。mkdir 命令默认情况下不会覆盖已经存在的目录,因此会显示这样的错误。

根据你的需求,这里有几个可能的解决方案:

  1. 忽略目录已存在的错误: 如果目录已存在并且这不是问题,你可以在 mkdir 命令后面添加 -p 选项来忽略这个错误。
mkdir -p ./result
mkdir -p ./pop

使用 -p 参数后,如果目录已经存在,mkdir 命令不会显示错误。

  1. 使用 -p 参数后,如果目录已经存在,mkdir 命令不会显示错误。
[ -d "./result" ] || mkdir ./result
[ -d "./pop" ] || mkdir ./pop

  1. 删除旧目录然后重新创建: 如果你想确保目录是空的,你也可以先删除它,然后重新创建。
rm -rf ./result
rm -rf ./pop
mkdir ./result
mkdir ./pop

警告: rm -rf 命令会删除目录和其下所有文件,使用时请小心。

根据你的实际需求选择合适的方法。

报错3:from function.APG-SMOEA_framework import optimize

File "/home/aaa/ML/paper/APG-SMOEA/code/run_APG-SMOEA.py", line 7
    from function.APG-SMOEA_framework import optimize

Python 的模块名(也就是 .py 文件名)不应该包含短横线(-)。根据 Python 的命名规约,模块名应该是小写字母,并且可以包含下划线。

如果你有一个名为 APG-SMOEA_framework.py 的文件,并且你试图用 import 语句导入它,Python 会因为短横线而报错,因为它不是一个合法的 Python 标识符。

解决方案是将文件名和对应的 import 语句中的短横线(-)改为下划线(_)或其他合法的 Python 标识符字符。

例如,你可以将文件名改为 APG_SMOEA_framework.py,然后更新 import 语句为:

from function.APG_SMOEA_framework import optimize

对sh test.sh进行计时

test.sh 的脚本内容如下:

#!/usr/bin/env bash

# 入口脚本!
# result生成原始结果 paper_process使用
mkdir -p ./result
# 在nikkei上的两个实验生成讨论的结果 discussion_process使用
mkdir -p ./pop
mkdir -p ./trial_len

# 数字控制跑哪些测试集bash run_all.sh
# instance序号:1-hangseng 2-dax 3-ftse 4-sp 5-nikkei
bash ./run_benchmark.sh 1

在命令行运行test.sh,它需要运行很久,我想记录一下,它到底是运行了多久,要如何处理?

要测量test.sh运行所需的时间,你可以在运行脚本之前使用time命令,像这样:

time sh test.sh

这将在脚本执行完成后显示实际时间、用户时间和系统时间。

time sh test.sh 命令通常会显示三种时间:
real: 实际经过的墙钟时间。
user: 用户态代码执行时间。
sys: 内核态代码执行时间。
这些时间通常以分钟和秒的形式显示,例如 1m30.002s 表示1分钟30.002秒。如果执行时间很短,它可能只会以秒或者毫秒来显示。所以,是的,显示的时间通常包括秒作为单位,但也可能包括分钟。
那上面的三个时间,到底哪个是真实的程序运行的时间呢?
moea项目的问题解决方案_第1张图片

moea项目的问题解决方案_第2张图片
对上图的解读:
moea项目的问题解决方案_第3张图片

或者,你也可以修改你的test.sh脚本,在脚本内部记录开始和结束时间:

#!/usr/bin/env bash

start_time=$(date +%s)  # 记录开始时间

# 你的原始代码
mkdir -p ./result
mkdir -p ./pop
mkdir -p ./trial_len

bash ./run_benchmark.sh 1

end_time=$(date +%s)  # 记录结束时间
elapsed_time=$(expr $end_time - $start_time)

echo "耗时: $elapsed_time 秒"

这两种方法都可以让你了解脚本需要多长时间来运行。

脚本解读

解读1

benchmarks=("hangseng" "dax" "ftse" "sp" "nikkei")
# 分别做五个测试集上的两个实验对比测试
mkdir -p ./result/${benchmarks[$1-1]}
mkdir -p ./result/${benchmarks[$1-1]}/GAN-adjlvxm

这段 Bash 脚本的代码主要执行了以下操作:

  1. 定义了一个名为 benchmarks 的数组,包含五个字符串元素:hangseng、dax、ftse、sp、nikkei。
  2. 使用 mkdir -p 命令创建两个目录。
    在这里,${benchmarks[$1-1]} 是一个 Bash 数组的索引方式。$1 是脚本的第一个参数,$1-1 是将这个参数减去 1(因为 Bash 数组是从 0 开始计数的)。所以 ${benchmarks[$1-1]} 将从 benchmarks 数组中选择一个元素。

举例来说:

  • 如果你运行脚本并传入参数 1,那么 ${benchmarks[$1-1]} 将返回 hangseng。
  • 如果传入参数 2,则返回 dax。
  • 以此类推。

然后,mkdir -p ./result/${benchmarks[$1-1]}mkdir -p ./result/${benchmarks[$1-1]}/GAN-adjlvxm 这两行代码将基于选定的数组元素创建两个目录。

例如,如果传入参数 1,脚本将创建以下目录:

  • ./result/hangseng
  • ./result/hangseng/GAN-adjlvxm
    mkdir -p 选项确保如果目录已存在,命令不会报错,并且会创建任何缺少的父目录。

解读2

python run_APG-SMOEA.py $1 >> ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt

moea项目的问题解决方案_第4张图片
>>符号是将什么的输出给重定向到igd.txt中
在 Bash 和其他 Unix-like 的 shell 中,>> 符号用于重定向命令的标准输出(stdout)到一个文件,并追加到该文件的末尾。如果文件不存在,将创建该文件。

在你给出的这个例子中:

python run_APG-SMOEA.py $1 >> ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt

python run_APG-SMOEA.py 1 命令会运行一个 P y t h o n 脚本,并将脚本的标准输出追加到 . / r e s u l t / 1 命令会运行一个 Python 脚本,并将脚本的标准输出追加到 ./result/ 1命令会运行一个Python脚本,并将脚本的标准输出追加到./result/{benchmarks[$1-1]}/GAN-adjlvxm/igd.txt 文件中。

简单来说,任何 run_APG-SMOEA.py 脚本打印(输出)到控制台(终端)的信息将被追加到 igd.txt 文件中,而不是显示在终端上。

例如,假设 run_APG-SMOEA.py 脚本包含如下代码:

print("Hello, World!")

运行上述 Bash 命令后,Hello, World! 将不会在终端显示,而是会被追加到 ./result/${benchmarks[$1-1]}/GAN-adjlvxm/igd.txt 文件的末尾。

准确地说,run_APG-SMOEA.py 脚本中的 print() 函数产生的输出(也就是标准输出,或 stdout)将被重定向并追加到 igd.txt 文件中,而不会出现在终端窗口。这是 >> 符号在 Bash 脚本中的作用。

py文件的命名带有-

上面的python run_APG-SMOEA.py 这里面也有-符号啊,也可以正常运行啊?为什么之前说python的文件名只能是字母和下划线的组合呢?

Python 脚本文件名(比如 .py 文件)确实可以包含短横线(-),并且你可以正常地运行这样命名的文件。比如,通过命令行 python run_APG-SMOEA.py 这样是完全可以的。

然而,问题出现在当你尝试导入这样一个带有短横线命名的 Python 文件作为模块时。Python 的模块名必须是有效的 Python 标识符,而有效的 Python 标识符不能包含短横线。这就是为什么在 import 语句中你不能直接导入带有短横线的 Python 文件。

总结一下:

可以使用 python run_APG-SMOEA.py 来运行这样命名的脚本。
不能使用 import run_APG-SMOEA 来导入这样命名的文件作为一个模块。

.format

benchmarks = ["hangseng", "dax", "ftse", "sp", "nikkei"]
size = [31, 85, 89, 98, 225]
savedir = "result/{}/GAN-adjlvxm/".format(benchmarks[instance-1])  # instance=1

在Python中,字符串的.format()方法用于格式化字符串。它会替换字符串中的大括号({})为提供的变量或值。

在这个例子中:

savedir = "result/{}/GAN-adjlvxm/".format(benchmarks[instance-1])
  • result/{}/GAN-adjlvxm/ 是一个字符串,其中的 {} 是一个占位符。
  • .format(benchmarks[instance-1]) 会将 {} 替换为 benchmarks[instance-1] 的值。
    benchmarks 是一个包含多个股市名称(如 “hangseng”, “dax”, “ftse”, “sp”, “nikkei”)的列表。
  • instance 是一个变量(假设它是整数),instance-1 是为了将其转换为0-based索引(Python列表的索引从0开始)。

举个例子,如果 instance = 1,那么 benchmarks[instance-1] 就会是 “hangseng”。所以,savedir 就会被设置为 “result/hangseng/GAN-adjlvxm/”。

这样,savedir 就可以作为保存结果的目录路径,并且这个路径会根据不同的 instance 值而改变,从而适应不同的股市名称。

你可能感兴趣的:(前端,服务器,运维)