我正在尝试使用Python脚本为我的研究小组解决问题。我们的实验室代码是用Fortran 77编写的。代码本质上是一个黑盒子。我们提供5个输入值,它吐出5个输出值。将这些输出值与基本事实进行比较。我们调整5个输入值,直到我们收到大约等于我们的基本事实的输出值。
此过程的工作方式如下:我们将5个输入值写入.txt文件。我们为代码执行.exe,它读取输入.txt。代码吐出了大量信息,包括我们与基础事实相比较的值,以判断这些输入值有多好。我们调整输入值并重新运行.exe。等等。
此任务通常需要数小时,因为此黑盒程序中隐藏了一个高度非线性的方程式。还有对数和sqrts可能导致程序崩溃,即输入值的5维空间包括可能导致程序崩溃的区域。
正常的SciPy优化算法似乎无法处理程序的崩溃并且永远不会收敛。所以,我写了一个基本上暴力破坏大约的脚本。解决方案,然后在大约上运行内置的优化脚本。解决方案,因为我知道/希望大约。解决方案不在将导致程序崩溃的区域附近。
这也需要几个小时,因为代码每次都必须运行.exe,而且它是从单个.txt中读取的,所以我无法想象能够以传统方式并行化这个任务。我使用pOpen在脚本中打开exe,并使用典型的open(“balance.txt”,“w”)命令打开文件进行写入等。
是否存在针对此类问题的任何解决方案,即,如果每次运行时都必须提取.txt文件的.exe,请加快搜索速度?除了手动制作我的代码的4份副本之外,将.py脚本的搜索空间分成1/4,并让它们全部独立运行(假设是4核系统)?
编辑:这里基本上是代码:
def writeInput(Input):
f=open("input.txt","w")
f.write(Input)
f.close()
def grabOutput():
ps=Popen("code.exe",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
for line in iter(ps.stdout.readline,''):
**Iterate through .exe output finding 5 output values**
result = np.array(5 values read by above)
return result
def mainFunc(Input):
# f(x) -> f required by optimization algorithms for minimization
global criteria
writeInput(Input)
result=grabOutput()
###################################
# Omitted optimization function related stuff
####################################
residual = result - criteria
return residual
################################################
# Main code
################################################
bounds=[(0.1,4.),(0.1,4.),(-4.,4.),(-.4,4.),(0.1,1.)]
x0=np.array([1.,1.,1.,0.5,0.5])
criteria=np.array([0.26,5.49e19,1.0e20,1870.,587.])
flag=False
while flag==False:
try:
# Optimization routine that uses just an initial guess
answer=broyden1(mainFunc,x0)
# Could also use
# answer=differential_evolution(mainFunc,bounds)
# if I wanted to specify the bounds of the input space
# which is why I also specify bounds=[...] above.
print "answer = ",answer
flag=True
except:
continue