PyMOSO公司
PyMOSO是用于解决多目标仿真优化(MOSO)问题以及创建、比较和测试MOSO算法的软件。
参考
如果您在出版前的工作中使用PyMOSO,请引用介绍PyMOSO的论文。
库珀,K.,亨特,S.R.2019。PyMOSO:使用R-PERLE和R-MinRLE进行多目标仿真优化的软件。信息计算杂志,以显示。预打印:http://www.optimization-online.org/DB_HTML/2018/10/6876.HTML.
附加读数
PyMOSO的初始版本包含按字母顺序实现四个总算法的解算器:R-MinRLE、R-PE、R-PERLE和R-SPLINE。下面介绍了算法R-MinRLE、R-PE、R-PERLE:
Cooper,K.、Hunter,S.R.和Nagaraj,K.2019。在回溯近似框架下,使用ε约束方法在整数格子上进行双目标仿真优化。信息计算杂志,以显示。预打印:http://www.optimization-online.org/DB_HTML/2018/06/6649.HTML.
下面介绍了算法R-SPLINE:
Wang,H.、Pasupathy,R.和Schmeiser,B.W.,2013年。使用R-SPLINE的整数阶模拟优化:使用分段线性插值和邻域枚举的回溯搜索。美国计算机学会模型和计算机仿真汇刊,第23卷,第3期,第17条(2013年7月),24页。http://dx.doi.org/10.1145/2499913.2499916
我们建议阅读这些论文,以了解算法、它们返回的内容以及我们在用户手册中描述的算法参数选项。
目录
安装
由于PyMOSO是用Python编程的,所以每个PyMOSO用户都必须首先安装Pythons,可以从https://www.python.org/下载/.PyMOSO与Python 3.6及更高版本兼容。在本节的其余部分中,我们假设安装了适当的Python版本。我们讨论了安装PyMOSO的三种不同方法:首先,来自Python打包索引;其次,直接从我们的源代码使用git;第三,从源代码中手动安装PyMOSO。
使用从Python打包索引安装PyMOSOpip(点阵)
为了便于发布,我们在Python打包索引(PyPI)上保留了PyMOSO的最新稳定版本。自从计划以来pip(点阵)
包含在Python 3.6及更高版本中,我们建议使用pip(点阵)
安装PyMOSO。要执行此操作,请打开一个端子,键入以下命令,然后按enter键。
pip安装pymoso
根据用户配置Python安装的方式以及安装的Python版本,他们可能需要更换pip(点阵)
具有管道3
,或的其他变体pip(点阵)
.
使用从存储库安装PyMOSOpip(点阵)
具有的用户吉特
已安装可以使用pip(点阵)
要直接从源代码安装PyMOSO的最新版本,请执行以下操作:
pip安装git+https://github.com/pymoso/pymoso.git
我们认为最新的源代码不如上传到PyPI的固定版本稳定,因此建议大多数用户从PyPI安装PyMOSO。
从源代码安装PyMOSO
用户可以按照以下步骤从任何版本的源代码手动安装PyMOSO。
- 例如,通过从存储库下载PyMOSO源代码来获取它https://github.com/HunterResearch/PyMOSO.
- 安装
轮
包,例如使用pip安装轮
命令。
- 打开终端并导航到包含该文件的主项目目录
设置.py
.
- 使用以下命令构建可安装的PyMOSO包,称为wheel
python设置.py bdist_wheel
。与pip(点阵)
,一些用户可能需要更换蟒蛇
具有蟒蛇3
或类似的东西。该命令应创建一个名为距离
包含PyMOSO轮子。
- 使用pip安装安装PyMOSO轮子
dist/pymoso-x.x.x-py3-none-any.whl
,其中用户替换x.x.x公司
使用适当的PyMOSO版本。
命令行界面(CLI)
PyMOSO用户可以使用命令行界面解决MOSO问题并测试MOSO算法。首先,我们展示了如何访问包含的帮助文件。然后,我们展示了如何查看PyMOSO默认安装的解算器、测试器和预言器列表。最后,我们讨论解决
和测试解决方案
命令。
CLI帮助
PyMOSO包含一个命令行帮助文件。帮助文件显示了每个PyMOSO命令的语法模板、可用选项和一系列示例调用。这个pymoso--帮助
调用将文件打印到终端。当PyMOSO无法解析以开头的调用时,也会打印该文件脓毒症
。我们在下面显示当前的帮助文件。
用法:脓毒症清单项目pymoso解算[--budget=B][--odir=D][--crn][--simpar=P][(--seed<s><s><s><s><s>)][(--param<param><val>)]。。。<问题><求解器><x>。。。pymoso测试解决方案[--budget=B][--odir=D][--crn][--isp=T][--proc=Q][--度量][(--seed<s><s><s><s><s>)][(--param<param><val>)]。。。<测试仪><求解器>[<x>…]pymoso-h|--帮助pymoso-v |--版本选项:--预算=B设置模拟预算[默认值:200]--odir=D设置输出文件目录名。[默认:测试运行]--crn如果需要常见的随机数,则进行设置。--seed用6个间隔整数设置随机数种子。--simpar=P设置模拟复制的并行进程数。[默认值:1]--isp=T设置要求解的算法实例数。[默认值:1]--proc=Q设置算法实例的并行进程数。[默认值:1]--公制如果需要公制计算,则设置。--param指定特定于解算器的参数<param><val>。-h--help显示此屏幕。-v--version显示版本。示例:脓毒症清单项目pymoso solve ProbTPA RPERLE 4 14型pymoso解决方案--预算=100000--odir=测试1 ProbTPB RMINRLE 3 12化脓溶液--种子12345 32123 5322 2 9543 666666666 ProbTPC RPERLE 31 21 11pymoso solve--simpar=4--param betaeps 0.4 ProbTPA RPERLE 30 30化脓解pymoso solve--参数半径3 ProbTPA RPERLE 45 45pymoso testsolve--isp=16--proc=4 TPAT酯类RPERLEpymoso testsolve--isp=20--proc=10-公制--crn TPBTester RMINRLE 9 9
目前,PyMOSO有三个命令:列表项
,解决
、和测试解决方案
,我们将在下面进行解释。
这个列表项
用于查看PyMOSO中包含的解算器、测试程序和预言机的命令
PyMOSO的默认安装包括一系列求解器、测试器和预言器。用户可以使用脓毒症清单项目
命令。我们在下面显示了当前列表。测试问题A、B和C参考Cooper等人(2018年)的测试问题。
解算器描述************************ ************************RMINRLE使用R-MinRLE求解整数阶MOSO的解算器。RPE使用R-Pe求解整数阶双目标MOSO的解算器。RPERLE一种使用RPERLE的整数阶双目标MOSO解算器。RSPLINE使用R-SPLINE求解单目标SO的解算器。问题描述测试名称(如果可用)************************ ************************ ************************ProbSimpleSO x ^2+噪声。简单运动鞋ProbTPA测试问题A TPATesterProbTPB测试问题B TPBTesterProbTPC测试问题C TPCTester
这个解决
命令
PyMOSO解决
该命令用于解决MOSO问题。用户可以解决内置问题(使用列表项
命令查看内置问题),但是,PyMOSO解决
用户通常会有自己想要解决的MOSO问题。因此,我们假设用户已经实现了一个名为我的问题
在里面我的问题.py
。在下面的示例中,我们假设我的问题
下面的实现,这是一个具有一维可行点的双对象oracle。请参见实施PyMOSO Oracle有关将MOSO问题实现为PyMOSO预言器的说明。
Oracle示例
#导入Oracle基类
从 pymoso.chnbase公司 进口 甲骨文公司
班 我的问题(甲骨文公司):
“”用户定义的MOSO问题的示例实现。“”
定义 __初始化__(自己, 天然气):
“”指定目标数量和点的维度。“”
自己.对象数(_O) = 2
自己.昏暗的 = 1
超级的().__初始化__(天然气)
定义 克(自己, x个, 天然气):
“检查可行性并模拟目标值。”
#本例中x的可行值
有限元_范围 = 范围(-100, 101)
#将obj初始化为空,将is_feas初始化为False
对象 = []
是(_F) = False(错误)
#检查x的尺寸是否匹配self.dim
如果 伦恩(x个) == 自己.昏暗的:
是(_F) = 真的
#然后检查x的每个分量是否在上述范围内
对于 我 在里面 x个:
如果 不 我 在里面 有限元_范围:
是(_F) = False(错误)
#如果x可行,模拟目标
如果 是(_F):
#使用rng生成随机数
z0(零) = 天然气.正态变量(0, 1)
z1(零) = 天然气.正态变量(0, 1)
对象1 = x个[0]**2 + z0(零)
对象2 = (x个[0] - 2)**2 + z1(零)
对象 = (对象1, 对象2)
返回 是(_F), 对象
模板解决
命令是pymoso求解oracle解算器x0
,其中神谕
是内置或用户定义的oracle,解算器
是内置或用户定义的算法,并且x0个
是求解器的可行起点,每个组件之间有一个空格。作为第一个示例,我们解决了用户定义的我的问题
使用从可行点97开始的内置R-PERLE。
pymoso解决我的问题.py RPERLE 97
同样,我们可以解决内置问题,例如问题TPA
具有二维可行点。
pymoso-solve ProbTPA RPERLE 40 40型
从今往后,我们解决
示例仅用于求解我的问题
.自我的问题
是双向的,我们建议使用R-佩雷
解算器。然而,对于两个或多个目标,PyMOSO实现了R-MinRLE公司
.
pymoso解决我的问题.py RMINRLE 97
对于单目标问题,PyMOSO实现R样条
我们注意到,如果给定一个多目标问题,R样条
只会最小化第一个目标。我们不一定禁止这样的使用,但敦促用户在使用R-SPLINE时要小心,以最小化多目标问题的一个目标。
pymoso解决我的问题.py RSPLNE 97
无论选择哪种解算器,PyMOSO都会创建包含输出的工作目录的新子目录。将有一个元数据文件,指示日期、时间、求解器、问题和任何其他指定选项。此外,PyMOSO创建了一个包含解算器生成的解决方案的文件。PyMOSO为用户解决MOSO问题提供了额外的选项。我们在下面给出了每个选项的示例。首先,用户可以指定输出目录的名称。
pymoso-solve--odir=OutDirectory myproblem.py RPERLE 45
用户可以指定模拟预算,该预算当前设置为默认值200。
pymoso solve--预算=100000 myproblem.py RPERLE 12
用户可以指定并行进行模拟复制。只有当用户考虑过适当的伪随机数流控制问题时,我们才建议这样做(请参阅实施PyMOSO Oracle). 此外,由于并行化的开销,我们只建议在计算观测值时使用并行模拟复制功能,例如,模拟需要半秒或更长时间才能生成单个观测值。我们注意到,模拟预言机的运行时复杂性可能无法完全表明何时适合使用并行化;其他因素包括,例如,总模拟预算。
pymoso解--simpar=4 myproblem.py RPERLE 44
目前,所有PyMOSO解算器都支持使用常见的随机数。用户可以使用--crn公司
选项。
pymoso解决方案--crn myproblem.py RMINRLE 62
除非实现oracle兼容,否则我们不建议使用此选项,即oracle使用PyMOSO的伪随机数生成器生成伪随机数或向外部mrg32k3a型
发电机(参见实施PyMOSO Oracle).
用户可以向PyMOSO指定初始种子mrg32k3a型
伪随机数发生器。种子必须是6个带空格的正整数。6个组件中的每个组件的默认值为12345。
pymoso solve--种子1111 2222 3333 4444 5555 6666 myproblem.py RPERLE 23
用户可以指定特定于算法的参数(有关参数的详细说明,请参阅介绍算法的论文。)所有参数都在表格中指定--参数名称值
例如,RLE松弛参数可以指定并设置为贝塔德尔
到实数。我们建议读者参考桌子获取当前可用算法特定参数的完整列表。
pymoso solve--参数betadel 0.2 myproblem.py RPERLE 34
最后,用户可以在一次调用中指定任意数量的选项。但是,所有选项都必须在解决
命令和之前我的问题.py
参数。此外,任何--参数
选项必须是最后一个选项。(请注意\
在第一行末尾,将命令继续执行到第二行。)
pymoso solve--crn--simpar=4--budget=10000--种子1 2 3 4 5 6\
--odir=实验1--参数mconst 4--参数betadel 0.7 myproblem.py RPERLE 97
算法特定参数表
参数名称 |
默认值 |
受影响的解算器 |
描述 |
mconst公司 |
2 |
RPERLE公司 ,终端 ,RPE公司 ,RSPLINE公司 |
初始化样本大小和后续样本大小计划。 |
bconst公司 |
8 |
RPERLE公司 ,RMINRLE公司 ,零售物价指数 ,RSPLINE公司 |
初始化搜索采样限制和限制的后续计划。 |
半径 |
1 |
RPERLE公司 ,RMINRLE公司 ,零售物价指数 ,RSPLINE公司 |
设置确定点邻域的半径。 |
贝塔德尔 |
0.5 |
RPERLE公司 ,RMINRLE公司 |
大致上,会影响RLE保持其给定解的可能性。 |
甜菜 |
0.5 |
RPERLE公司 ,零售物价指数 |
大致上,这会影响PE从某一点执行搜索的可能性。 |
这个测试解决方案
命令
PyMOSO测试解决方案
该命令使用PyMOSO测试仪测试问题上的算法。用户可以使用内置或用户定义的测试仪测试内置或用户自定义的解算器。在下面的示例中,我们假设用户已经实现了我的问题
如中所示Oracle示例和相应的测试人员我的测试人员
在里面我的测试者.py
,如所示示例测试仪。请参阅实现PyMOSO测试程序有关在PyMOSO中实现用户定义测试仪的说明,包括用于比较算法的度量。
示例测试仪
进口 系统, 操作系统
系统.路径.插入(0,操作系统.路径.目录名(__文件__))
#使用hausdorff距离(dh)作为示例度量
从 蟒蛇属 进口 dh公司
#导入MyProblem oracle
从 我的问题 进口 我的问题
#或者,定义一个函数来随机选择一个MyProblem可行的x0
定义 获取ranx0(天然气):
val值 = 天然气.选择(范围(-100, 101))
x0个 = (val值, )
返回 x0个
#计算x的真值,用于计算度量
定义 正确_g(x个):
计算目标值
对象1 = x个[0]**2
对象2 = (x个[0] - 2)**2
返回 对象1, 对象2
#为度量定义合适的答案
我的答案 = {(0, 4), (4, 0), (1, 1)}
班 我的测试人员(对象):
“MyProblem的测试程序实现示例。”
定义 __初始化__(自己):
自己.拉诺克人 = 我的问题
自己.回答 = 我的答案
自己.正确_g = 正确_g
自己.获取ranx0 = 获取ranx0
定义 米制的(自己, 埃勒斯):
“每个回顾性迭代要计算的指标。”
埃帕雷托 = [自己.正确_g(指向) 对于 指向 在里面 埃勒斯]
豪斯 = dh公司(埃帕雷托, 自己.回答)
返回 豪斯
模板测试解决方案
命令是pymoso-testsolve测试求解器
哪里测试器
是内置或用户定义的测试仪,并且解算器
是内置或用户定义的解算器。用户还可以指定x0个
,如解决
命令,如果测试器
没有实现生成可行点的功能。作为第一个示例,我们测试RPERLE公司
在我的问题
使用我的测试人员
。由于某些选项与两者都兼容解决
和测试解决方案
,我们在此示例中包括这些选项。
pymoso testsolve--预算=999--odir=exp1\
--crn—种子1 2 3 4 5 6 mytester.py RPERLE
用户可能希望计算算法生成的解决方案的一些指标。如果将度量定义为测试仪的一部分,例如我的测试人员
,的测试解决方案
命令可以使用--公制
选项。
pymoso testsolve--公制mytester.py RPERLE
这个测试解决方案
命令无法并行执行模拟复制。然而,测试人员可以将解算器应用于问题的独立样本路径。例如,要测试RPERLE公司
关于100个独立的样本路径我的问题
,计算每个采样路径的度量,并在每个采样路径中使用公共随机数,使用以下命令。
pymoso testsolve--crn--公制--isp=100 mytester.py RPERLE
PyMOSO可以并行执行独立的算法。使用--程序
选项,以指定PyMOSO可用的进程数。
pymoso testsolve--crn--度量--isp=100--proc=20 mytester.py RPERLE
我们在这里注意到,为了确保算法运行保持独立,使用PyMOSO的伪随机数生成器(请参见实施PyMOSO Oracle)研究人员应设定总模拟预算,以使所包含的算法不超过200次回溯近似(RA)迭代。作为参考,使用默认设置,第200次RA迭代中每个点的样本大小几乎为3.8亿。
这个测试解决方案
命令为每个独立的样本路径创建一个结果文件。该文件包含每次算法迭代时生成的解,这样迭代2的解在第2行,迭代10在第10行,依此类推。如果--公制
指定时,PyMOSO为每个独立的样本路径生成第二个文件,其中包含三元组集合(迭代次数、迭代结束时使用的模拟、度量)。
在PyMOSO中实现问题、测试程序和算法
要使用PyMOSO,解决MOSO问题的用户必须实现PyMOSOoracle,测试MOSO算法的用户至少应该实现PyMOSOoracle和tester。在本节中,我们提供了模板Python代码,以帮助用户在PyMOSO中快速实现预言器、测试人员,也许还有解算器。
实施PyMOSO Oracle
通常,实现PyMOSO预言机意味着在遵循本节提出的PyMOSO规则的同时,将Monte Carlo模拟预言机作为黑盒函数实现。作为参考,我们讨论了PyMOSO oracle示例我的问题
在里面Oracle示例。用户可以将代码复制到Oracle示例并重新实现该功能克
根据需要。我们现在列出每个克
实施。
- 功能
克
必须是的实例方法甲骨文公司
子类,因此自己
作为其第一个参数。
- 功能
克
必须采用任意命名的第二个参数,该参数是一个长度为的元组自我.dim
表示一个点。从风格上讲,PyMOSO始终为该参数命名x个
.
- 功能
克
必须采用任意命名的第三个参数,该参数是修改过的Python随机。随机
对象。从风格上讲,PyMOSO始终为该参数命名天然气
.
- 功能
克
必须首先返回布尔值和长度为的元组自我编号_obj
第二。
- 布尔值为
真的
如果x个
是可行的,并且False(错误)
否则。
- 如果
x个
是可行的,元组包含对每个目标的单个观察。如果x个
不可行,元组中的每个元素无
.
如果用户已经实现了模拟预言,他们可能会发现实现起来很方便克
作为从Python调用该模拟的包装器。举个例子,假设一个用户已经用C语言实现了一个模拟,该模拟被编译到一个名为我的儿子
并放置在工作目录中。进一步假设模拟函数采用以下参数:一个整数数组表示一个点,一个无符号整数表示在x个
功能输出定义为结构Simout
与成员一起有限元分析
设置为0或1,对象
设置为观测目标值平均值的双数组,以及无功功率,无功功率
设置为观测目标值的样本方差的双数组。然后用户可以修改模板来包装C函数结构Simout c_func(int x,int n)
如中所示这个例子.
包装C仿真的Oracle示例
从 C型 进口 CDLL公司, c_double(双精度), 集(_U), _整数, 结构
进口 操作系统路径
库名称 = “我很高兴”
libabspath(libabspath) = 操作系统.路径.目录名(操作系统.路径.吸收路径(__文件__)) + 操作系统.路径.九月 + dll名称
利比亚银行 = CDLL公司(libabspath(libabspath))
班 西蒙(结构):
_字段_ = [(“宴会”, _整数), (“对象”, c_double(双精度)*2), (“变量”, c_double(双精度)*2)]
csimout公司 = libobj语言.c函数
csimout公司.重新键入 = 西蒙
从 绿脓杆菌chnbase 进口 甲骨文公司
班 我的问题(甲骨文公司):
用户定义的MOSO问题的示例实现
定义 __初始化__(自己, 天然气):
指定目标数量和维度
自己.对象数(_O) = 2
自己.昏暗的 = 1
超级的().__初始化__(天然气)
定义 克(自己, x个, 天然气):
“检查可行性并模拟目标值。”
是否可行 = 真的
目标值 = (无, 无)
#g只接受一个观察值,因此将cfunc参数设置为1
cn(立方厘米) = 集(_U)(1)
#c_func要求是一个整数,因此请转换它——这是一个1D示例
cx(cx) = _整数(x个[0])
#调用C函数
mysimout公司 = csimout公司(cx(cx), cn(立方厘米))
如果 不 mysimout公司.有限元分析:
是否可行 = False(错误)
其他的:
是否可行 = 真的
如果 是否可行:
目标值 = 元组(mysimout公司.对象)
返回 是否可行, 目标值
C包装器示例是包装C函数的有效PyMOSO oracle。然而,PyMOSO算法无法在此预言机上启用常见随机数。此外,PyMOSO不能保证并行观测时的独立性。要启用这些属性,外部模拟必须使用mrg32k3a型
作为生成器,并且必须接受用户指定的种子。
假设图书馆我的儿子
还实现了函数设置simseed
它接受表示mrg32k3a型
种子。我们修改了包装器与常见随机数兼容,并保证并行观测的独立性。新包装器演示使用rng.get_seed()
返回电流mrg32k3a型
种子。
PyMOSO随机数包装器示例
从 C型 进口 CDLL公司, c_double(双精度), 集(_U), _整数, 结构, c_long(长)
进口 操作系统路径
库名称 = “我很高兴”
libabspath(libabspath) = 操作系统.路径.目录名(操作系统.路径.吸收路径(__文件__)) + 操作系统.路径.九月 + dll名称
利比亚银行 = CDLL公司(libabspath(libabspath))
班 西蒙(结构):
_字段_ = [(“宴会”, _整数), (“对象”, 双重(c_)*2), (“var”(变量), 双重(c_)*2)]
csimout公司 = 利比亚银行.c函数
cset种子 = 利比亚银行.设置simseed
csimout公司.重新键入 = 西蒙
从 绿脓杆菌chnbase 进口 甲骨文公司
班 我的问题(甲骨文公司):
用户定义的MOSO问题的示例实现
定义 __初始化__(自己, 天然气):
指定目标数量和维度
自己.对象数(_O) = 2
自己.昏暗的 = 1
超级的().__初始化__(天然气)
定义 克(自己, x个, 天然气):
“检查可行性并模拟目标值。”
是否可行 = 真的
目标值 = (无, 无)
#从rng获取PyMOSO种子
种子 = 天然气.获取种子(_S)()
#将种子转换为clong数组
c_longarr公司 = c_long(长)*6
c_seed(种子) = c_longarr公司(种子[0], 种子[1], 种子[2], 种子[三], 种子[4], 种子[5])
#使用库函数设置sim种子
cset种子(c_seed(种子))
#g只接受一个观察值,因此将cfunc参数设置为1
cn(立方厘米) = 集(_U)(1)
#c_func要求是一个整数,因此请转换它——这是一个1D示例
cx(cx) = _整数(x个[0])
#调用C函数
mysimout公司 = csimout公司(c_x(c_x), cn(立方厘米))
如果 不 mysimout公司.可行性研究:
容易(_F) = False(错误)
其他的:
是否可行 = 真的
如果 是否可行:
目标值 = 元组(mysimout公司.对象)
返回 是否可行, 目标值
或者,如果所需伪随机数的数量已知,则用户可以使用rng.random()
生成伪随机数,然后将其传递给外部模拟(如果支持此类功能)。
这个天然气
对象被实现为Python的子类随机。随机
类,因此正式的Python文档随机的,随机的
适用于天然气
发现于https://docs.python.org/3/library/random.html。除此之外天然气
使用mrg32k3a型
作为它的生成器,我们还实现rng.正态变量
因此,它使用Beasley-Springer-Mro算法(Law 2015,p.458)来近似标准正态累积分布函数的逆函数。
使用时天然气
为了确保观测值的独立采样,PyMOSO在获得每个模拟复制后,在伪随机数流中向前“跳跃”。每个跳转都有固定大小的2^76个伪随机数。因此,我们要求每次模拟复制使用少于2^76个伪随机数。我们通过“给”每个处理器一个流(一个天然气
),每个距离为2^127个伪随机数。当使用依赖RA的当前PyMOSO算法时,每个RA迭代开始下一个可用的独立流2^127,其中PyMOSO说明了RA迭代中并行计算的可能性。因此,在给定的RA迭代中,用户可以模拟100万个样本大小的1亿个点,没有常见的随机数,并且很容易达到极限。
实现PyMOSO测试程序
再次考虑示例测试仪。作为最小有效的PyMOSO测试程序,用户除了分配我的测试人员
成员自我反常
PyMOSO预言家,例如我的问题
,第27行。然而,我们希望大多数用户通过实现度量和可行的点生成器来利用PyMOSO功能。功能获取rank0
允许测试人员生成可行的点我的问题
和米制的
允许测试人员对解算器返回的集合计算度量。研究人员可以实现任何数量的附加支持功能,包括测试人员类的成员和方法。这个正确_g
函数是这样一个支持函数的示例,用于计算示例度量。
首先,我们列出了实现可行点生成器的规则。
- 函数的名称是任意的,但必须设置为
自拍集
测试人员的成员。
- 函数必须采用一个参数,一个任意命名的
随机。随机
我们建议命名的对象天然气
.
- 函数必须返回长度与
自我.dim
的成员自我反常
测试人员的成员。
由于研究人员所需的度量取决于算法能力和问题复杂性,PyMOSO允许研究人员实现他们选择的任何度量。我们提供了三个示例指标,但首先,我们列出了米制的
功能。
- \inline{metric}函数必须是测试程序的实例方法,因此将\inline}self}作为其第一个参数。
- \inline{metric}的第二个参数是任意命名的,是一组Python元组。
- PyMOSO不强制使用\inline{metric}的返回值,但我们建议使用标量实数。
中实现的度量示例测试仪是从(a)算法返回的估计解的真实图像到(b)硬编码为的真实解的Hausdorff距离我的答案
.
对于不同度量的示例,考虑一个具有多个局部有效集(LES)的MOSO问题,并且每个LES都不包含另一个LES的成员。由于收敛到LES的算法可能只找到一个LES,因此我们可以定义度量来计算估计解的真实图像与“最接近”的真实LES之间的Hausdorff距离,如下所示。让自我应答
实现为集合列表,并假设自我真实
实施。然后以下示例实现所描述的度量。
示例指标1
定义 米制的(自己, 埃勒斯):
#使用到最近集合的距离。
埃帕雷托 = [自己.正确_g(指向) 对于 指向 在里面 埃勒斯]
#self.soln是集合列表
列表(_L) = [dh公司(埃佩托, 女同性恋) 对于 女同性恋 在里面 自己.回答]
返回 最小值(dist_list(分发列表))
对于只有一个正确解决方案的单目标问题x个*
,一个采用估计解的简单度量X(X)
是|克(X)-克(X*)|
,我们在第二示例度量假设适当实现自我应答
和自我真实
.
示例度量2
定义 米制的(自己, 单个集):
#单目标算法仍然返回一个集合
指向, = 单个集
#让self.soln成为实数
距离 = 防抱死制动系统(自己.正确_g(指向) - 自己.回答)
返回 距离
实现PyMOSO算法
研究人员可以在PyMOSO框架中实现仿真优化算法。PyMOSO支持三类算法:
- PyMOSO为在RA框架中实现依赖RLE的新MOSO算法提供了强大的支持。
- PyMOSO为实现通用RA算法提供了强大的支持。
- PyMOSO为实现其他仿真优化算法提供了基本支持,如伪随机数控制。我们提供了这三类中每一类中实现的算法的模板,以及示例代码片段。
在第一类中,程序员可以使用PyMOSO创建使用RLE进行收敛的新RA算法。这些算法中由用户创建的新部分是加速
该功能应收集点,以发送给RLE进行认证。这里,我们列出了以下规则加速
.
- 这个
加速
函数必须是RLE解决程序
对象,因此其第一个参数必须是自己
.
- 第二个参数是任意命名的,是一组元组。我们建议命名参数
warm_start(暖启动)
,因为它表示前一个RA迭代的样本路径解决方案。
- 返回值必须是一组表示可行点的元组;我们不推荐任何特定的名称。在每次RA迭代中,PyMOSO将首先调用
加速(self,warm_start)
并将返回的集合发送到rle(自我,候选人)
。返回值必须是一组元组。实现者不需要实现或调用RLE,如模板加速器.
模板加速器
从 绿脓杆菌chnbase 进口 RLE解决程序
#创建RLESolver的子类
班 MyAccel公司(RLE解决程序):
RLE加速器的示例实现
定义 加速(自己, warm_start(暖启动)):
“”“返回要发送给RLE的点集合。”“”
#在此实现算法逻辑并返回集合
返回 warm_start(暖启动)
在第二类中,算法设计者可以通过子分类快速实现任何RA算法RASolver公司
并实施spsolve公司
功能,如RA求解器模板。该算法可以是单目标算法。PyMOSO不能保证这些算法的收敛性。该模板在PyMOSO中技术上有效,但可能无效。
RA求解器模板
从 绿脓杆菌chnbase 进口 RASolver公司
班 MyRAAlg公司(RASolver公司):
“RA求解器的模板实现。”
定义 spsolve公司(自己, warm_start(暖启动)):
“”返回示例路径解决方案。“”
#在此实现算法逻辑并返回集合
返回 warm_start(暖启动)
尽管类似于RLE解决方案.加速
方法,为了完整性,我们列出了R溶剂.ssolve
方法。
- 这个
spsolve公司
函数必须是RASolver公司
对象,因此其第一个参数必须是自己
.
- 第二个参数是任意命名的,是一组元组。我们建议命名参数
warm_start(暖启动)
因为它表示上一次RA迭代的样本路径解。
- 返回值必须是一组表示可行点的元组;我们不推荐任何特定名称。
在第三类中,PyMOSO可以通过实现解决
a的函数MOSO溶剂
子类如图所示。它不一定是多目标算法。PyMOSO将要求用户发送初始可行点x0个
算法是否需要初始可行点x0个
通过访问自我x0
这是一个元组。我们现在列出了实现任何MOSO溶剂.溶剂
功能。
- 这个
解决
函数必须是的实例方法MOSO溶剂
,因此采取自己
作为其第一个参数。
- 第二个参数是模拟预算,这是一个自然数。
- 这个
解决
函数必须返回字典(我们将其命名为结果
在我们的示例中)至少有3个键:“itersoln”
,“模拟通话”
,“endseed”
。研究人员可能会跟踪其他数据并将其添加到结果
根据需要。
- 这个
'迭代解决方案'
关键字本身对应于一个字典,其中每个算法迭代的关键字标记为{0,1,…}。每次迭代的值是一个集合,其中包含迭代结束时的估计解。
- 这个
“模拟通话”
键本身对应于一个字典,每个算法迭代都有一个标记为{0,1,…}的键。每次迭代的值是一个自然数,包含迭代结束时进行的模拟复制的累计次数。
- 这个
“endseed”
键对应于长度为6的元组,表示mrg32k3a型
种子。算法程序员应确保结果['endseed']
独立于算法使用的所有流。
研究人员可以使用MOSO模板实现新的仿真优化算法。
模板MOSO解算器
从 绿脓杆菌chnbase 进口 MOSO溶剂
班 MyMOSOAlg公司(MOSO溶剂):
“MOSO求解器的模板实现。”
定义 解决(自己, 预算):
虽然 自己.调用次数(_C) <= 预算:
#实现算法逻辑并返回结果
返回 结果
为了方便起见,在下面的小部分中,我们还提供了一些示例代码片段,这些代码片段在PyMOSO中实现算法时非常有用。当使用上面继承\inline{RLESolver}或\inline}RASolver}的模板时,它们无需修改即可工作,但在MOSO溶剂
。供参考,这个部分包含PyMOSO程序员可以访问的大多数对象的列表。
在某一点进行模拟复制
从 绿脓杆菌 进口 获取_个
#在这个RA迭代中,假设x尚未被访问,并且是可行的
x个 = (1, 1, 1)
#m是当前RA迭代的样本大小
米 = 自己.米
#self.num_calls是到目前为止使用的累计模拟数
开始num_call = 自己.调用次数(_C)
#使用估计对x进行采样,并将结果放入self.gbar和self.sehat中
国际服务业协会, 外汇, 东南方 = 自己.估计(x个)
调用已使用 = 自己.调用次数(_C) - 开始num_call
打印(米 == 调用_已用) #真的
打印(外汇 == 自己.gbar标准[x个]) #真的
打印(东南方 == 自己.赛哈特[x个]) #真的
#在随后访问某个点时,估计不会再次模拟
开始num_call = 自己.调用次数(_C)
国际服务业协会, 外汇, 东南方 = 自己.估计(x个)
调用_已用 = 自己.调用次数(_C) - 开始num_call
打印(调用_已用 == 0) #真的
查找邻居并进行模拟复制
#邻域半径
第页 = 自己.n或rad
nbors公司 = 获取_个(x0个, 第页)
自己.向上取样(nbors公司)
对于 n个 在里面 nbors公司:
打印(n个 在里面 自己.gbar标准) #如果n可行则为True,否则为False
#上采样还返回可行子集
nbors公司 = 自己.向上取样(nbors公司)
对点字典进行Argsort排序
#第一个目标的0索引
排序_可行性 = 已排序(国家广播公司 | {x个}, 钥匙=λ t吨: 自己.gbar标准[t吨][0])
选择最小值及其值
克敏 = 排序区域[0]
fx最小值 = 自己.gbar标准[x个]
使用样条线提取局部极小值
#无约束,最小化第二个目标
x0个 = (2, 2, 2)
国际服务业协会, 外汇, 性 = 自己.估计(x0个)
#抑制值是沿样条曲线轨迹访问的集
_, 克敏, fx最小值, 六分体 = 自己.花键(x0个, 浮动(“inf”), 1, 0)
打印(自己.gbar标准[克敏] == fx最小值) #真的
在字典中查找非支配点
从 chnutils公司 进口 获取_朗多姆
非omon = 获取_朗多姆(自己.gbar标准)
随机选择集合中的点
解算器(_R) = 自己.sprn公司
#pick 5点--返回列表,而不是集合。
ran_pts系列 = 解算器(_R).样品(列表(非omon), 5)
一个实例(_F) = 解算器(_R).选择(等级(_T))
使用解决
和测试解决方案
在Python程序中
用户可以解决
和测试解决方案
Python程序中的函数。
最小解决
例子
#导入求解函数
从 绿脓杆菌 进口 解决
#导入包含RPERLE实现的模块
进口 pymoso.solvers.rperle公司 作为 rp公司
#import MyProblem-MyProblem.py通常应位于脚本目录中
进口 我的问题 作为 mp(最大功率)
#指定x0。在MyProblem中,它是一个长度为1的元组
x0个 = (97,)
土壤 = 解决(mp(最大功率).我的问题, rp公司.RPERLE公司, x0个)
打印(土壤)
一些解决
选项示例
#指定预算和种子的示例
预算=10000
种子 = (111, 222, 333, 444, 555, 666)
土壤1 = 解决(mp(最大功率).我的问题, rp公司.RPERLE公司, x0个, 预算=预算, 种子=种子)
#指定crn和simpar
溶液2 = 解决(mp(最大功率).我的问题, rp公司.RPERLE公司, x0个, 阴极射线管=真的, simpar公司=4)
#指定特定于算法的参数
溶液3 = 解决(mp(最大功率).我的问题, rp公司.RPERLE公司, x0个, 半径=2, 倍他普=0.3, 贝塔德尔=0.4)
#把它们混合起来
溶液4 = 解决(mp(最大功率).我的问题, rp公司.RPERLE公司, x0个, 阴极射线管=真的, 种子=种子, 半径=5)
A类测试解决方案
例子
#导入testsolve函数
从 绿脓杆菌 进口 测试解决方案
#导入包含RPERLE的模块
进口 pymoso.solvers.rperle公司 作为 rp公司
#导入MyTester类
从 我的测试仪 进口 我的测试人员
#testsolve需要一个“虚拟”x0,即使MyTester会生成它们
x0个 = (1, )
运行数据(_D) = 测试解决方案(我的测试人员, rp公司.RPERLE公司, x0个, 互联网服务提供商=100, 阴极射线管=真的, 半径=2)
计算上的度量测试解决方案
输出
程序员必须计算他们的度量。在这里,运行数据(_D)
是所描述形式的字典吗在这里我们计算了第12个独立算法实例的第5次迭代的度量。
iter5_溶液 = 运行数据(_D)[11][“itersoln”][4]
isp12_iter5_度量 = 我的测试人员.米制的(迭代5解决方案)
PyMOSO对象引用
这个绿脓杆菌.prng.mrg32k3a
模块
这个绿脓杆菌.prng.mrg32k3a
模块公开了伪随机数生成器,并使用函数对其进行操作。
对象 |
描述 |
MRG32k3a型 |
随机的子类。随机,定义所有天然气 物体。 |
get_next_prnstream(种子) |
返回天然气 对象种子距输入种子2^127步。 |
跳转子流(rng) |
为输入设定种子天然气 物体2^76向前走。 |
这个绿脓杆菌chnbase
模块
这个绿脓杆菌chnbase
模块实现了预言器和解算器的基类。程序员在创建新的PyMOSO实现时应该对这些进行子类化。
等级 |
描述 |
甲骨文公司 |
用于实现oracles的基类。 |
RLE解决程序 |
用于使用RLE实现解算器的基类。 |
RASolver公司 |
用于实现RA解算器的基类。 |
MOSO溶剂 |
所有解算器的基类。 |
这个绿脓杆菌
模块
这个绿脓杆菌
包含用于实现和测试算法的有用函数。
功能 |
描述 |
求解(oracle、solver、x0、**kwargs) |
请参见此处以获取说明。 |
testsolve(测试器、解算器、x0、**kwargs) |
请参见此处以获取说明。 |
does_weak_dominate(g,h,relg,relh) |
所有输入都是长度相等的元组。退换商品真的 如果克 弱主导小时 放松一下。 |
不支配(g,h,relg,relh) |
退换商品真的 如果克 占主导地位小时 随着放松。 |
does_strict_dominate(g,h,relg,relh) |
退换商品真的 如果克 严格控制小时 放松一下。 |
get_nondom(obj_dict) |
Input:包含键和值元组的字典。关键是可行点;价值观是他们的客观价值观。返回:表示非支配点的元组集。 |
get_nbors(x,r) |
输入:元组x个 ,正实标量第页 表示邻域半径。返回:相邻元组的集合。 |
获取设置(S,r) |
输入:一组元组和邻域半径。回归:获取nbors(s,r) 对于每个秒 在里面S公司 . |
dh(A、B) |
返回集合之间的Hausdorff距离A类 并设置B类 . |
编辑(x1,x2) |
返回欧几里得距离x1个 到2个 . |
get_metric(结果,测试人员) |
输入:结果 是一个字典,每个示例路径的输出测试解决方案 .测试器 必须实现米制的 返回:算法运行的三元组集(迭代、模拟计数、度量)。 |
这个甲骨文公司
等级
实施时RASolver公司
算法,程序员可能不需要访问甲骨文公司
对象。实施时MOSO溶剂
算法,程序员将使用(或包装)打
和crn_advance()
.
成员/方法 |
描述 |
对象数(_O) |
一个正整数,目标的数量。 |
昏暗的 |
一个正整数,可行点的维数。 |
天然气 |
的实例MRG32k3a型 . |
命中(x,n) |
采取n个 观察x个 .返回:真的 ,一个元组包含每个目标的观测值平均值,一个包含每个目标标准误差的元组,如果x个 是可行的。该函数在内部处理CRN。 |
set_crnflag(布尔) |
打开CRN(真的 )或关闭。 |
set_crnold(状态) |
保存天然气 状态为CRN基线,例如用于算法迭代。使用获取状态rng.getstate() . |
crn_reset() |
支持预言天然气 CRN基线。 |
crn_advance() |
如果CRN处于打开状态,则重置,然后跳转到下一个独立的伪随机流并保存新基线,例如在开始新算法迭代之前。 |
crn_setobs() |
为单个oracle观察设置中间CRN。 |
crn_nextobs() |
跳过天然气 向前,例如在进行观察之后,以及crn设置对象 种子。 |
crn_check() |
如果CRN开启,则返回基线。否则,使用crn下一个obs 在进行下一次观察之前。 |
这个MOSO溶剂
等级
该类为在PyMOSO中实现新的MOSO算法提供了基本结构。
成员/方法 |
描述 |
兽人 |
解算器要求解的oracle对象。 |
昏暗的 |
可行集中点的维数。应该匹配自拍 |
对象数(_O) |
同样自我兽人 . |
调用次数(_C) |
执行的模拟复制数的运行计数自我兽人 . |
x0个 |
一个可行的起点。这一点还提供给不需要的算法。 |
这个RASolver公司
等级
该类实现了所有RA算法的通用结构,包括:模拟复制的缓存、样本大小和限制的调度和更新,以及Oracle.hit公司
.
成员/方法 |
描述 |
sprn公司 |
的实例MRG32k3a型 供解算器使用。 |
n或rad |
求解器用于寻求局部最优的邻域半径。 |
gbar标准 |
每个键和值都是元组的字典。关键是可行点,价值是其目标价值。gbar标准 在每个回顾性迭代中都被“擦除”。 |
赛哈特 |
完全一样gbar标准 但这些值是标准误差。 |
米 |
当前迭代的样本大小。 |
calc_m(nu) |
计算当前迭代的样本大小。RA算法会在每次迭代时自动执行此操作,并将值分配给“m”。 |
b条 |
当前迭代的搜索样本限制。 |
钙硼(nu) |
完全一样计算_m 但由于搜索样本的限制。 |
估计(x,c,obj) |
这个估计 函数本质上是自我或打击 .输入:元组x个 取样,c(c) 可行性约束,对象 约束的目标。返回:与Oracle.hit公司 。从/到检索或保存结果gbar标准 和赛哈特 视情况而定。如果可行结果不小于约束,则返回不可行。 |
上采样(S) |
的一个版本估计 用于集合。返回的可行子集S公司 . |
样条曲线(x、c、obmin、obcon) |
返回样本路径局部极小值。输入:可行的开始,约束,最小化的目标,约束的目标。返回:轨迹的一组元组、最小元组、最低元组和标准错误元组。 |
这个RLE解决程序
等级
inlinetwo{RASolver}的子类添加了RLE及其松弛。
成员/方法 |
描述 |
贝塔德尔 |
影响RLE中计算的松弛值。 |
钙δ(se) |
计算给定标准误差的RLE松弛,使用自我。米 和自拍贝塔德尔 . |
rle(候选人) |
输入:元组集合,返回:元组集。按样本大小查找LES自我。米 . |