我必须用启发式算法(例如蚂蚁算法)来解决一个复杂的网络优化问题。该算法分为两个步骤:1)使用随机分量计算新解,2)评估新解。这两个部分非常耗时,并且在子程序中使用多个处理来并行解决问题。随着迭代次数的增加,步骤的持续时间增加得非常快。我将并行进程(标签timeMainCalculate
和timeMainEvaluate
)初始化与第一个子程序(标签timeSubCalculate
和timeSubEvaluate
)开始之间的时间延迟进行了本地化。在第一次迭代中,时间差timeMainCalculate-timeSubCalculate
分别为timeMainEvaluate-timeSubEvaluate
接近0,100次迭代后两步的时间差约为10秒,200步后的时间差约为20。时间差呈线性增加。子程序中计算和计算的持续时间是恒定的。因此,使用multiprocessing. Pool
在主程序和子程序之间的通信中可能出现问题。在
供您参考:我在一台8核计算机上使用Python3.3。在
选择_启发式.py:
import multiprocessing.Pool
import datetime
import calculate, evaluate
epsilon = 1e-10
nbOfCpusForParallel = 6
nbCalculation = 6
def calculate_bound_update_information(result):
Do_some_calculation using result
return [bound,x,y,z]
if __name__ == '__main__':
Inititalize x,y,z
while bound > epsilon:
# Calculate new Solution
pool = multiprocessing.Pool(processes=nbOfCpusForParallel)
result_parallel = list()
for i in range(nbCalculation):
result_parallel.append(pool.apply_async(calculate.main,[x,y,z]))
timeMainCalculate = datetime.datetime.now()
pool.close()
pool.join()
resultCalculation = [result_parallel[i].get() for i in range(nbCalculation)]
# Evaluate Solutions
pool = multiprocessing.Pool(processes=nbOfCpusForParallel)
argsEvalute = [[resultCalculation[i][0],resultCalculation[i][1]] for i in range(len(resultCalculation))]
result_evaluate = list()
for i in range(len(resultCalculation)):
result_evaluate.append(pool.apply_async(evaluate.main,argsEvalute[i]))
timeMainEvaluate = datetime.datetime.now()
pool.close()
pool.join()
resultEvaluation = [result_evaluate[i].get() for i in range(len(resultCalculation))]
[bound,x,y,z] = calculate_bound_update_information(resultEvaluation)
计算.py:
^{pr2}$求值.py
import datetime
def main(x,y):
timeSubEvaluate = datetime.datetime.now()
Do some evaluation using x,y
return result
在我看来,主程序存储了一些并行进程的信息。我尝试过删除pool变量,但没有成功。在
有人知道什么是技术问题,如何解决?谢谢。在
目前没有回答
相关问题 更多 >
编程相关推荐