我必须使用启发式算法(例如蚂蚁算法)来解决复杂的网络优化问题。该算法分两步进行分解:1。)使用随机分量计算新的解决方案,2。)评估新的解决方案。这两个部分非常耗时,并解决了在子程序中使用多处理并行的问题。随着迭代次数的增加,步骤的持续时间增加得非常快。我定位了并行进程初始化(标签timeMainCalculate
和timeMainEvaluate
)与第一个子程序开始(标签timeSubCalculate
和timeSubEvaluate
)之间的时间延迟。在第一次迭代中,时间差timeMainCalculate-timeSubCalculate
分别为timeMainEvaluate-timeSubEvaluate
接近0,经过100次迭代后,两个步骤约为10秒,200步后时间差约为20.时间差为线性增加。子程序中计算和评估的持续时间是恒定的。因此,使用multiprocessing. Pool
主程序和子程序之间的通信可能存在问题。
您的信息:我在八核计算机上使用Python 3.3。
opt_heuristic.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)
calculate.py:
import datetime
def main(x,y,z):
timeSubCalculate = datetime.datetime.now()
Do some random calculation using x,y,z
return result
evaluate.py
import datetime
def main(x,y):
timeSubEvaluate = datetime.datetime.now()
Do some evaluation using x,y
return result
在我看来,主程序存储了并行进程的一些信息。我尝试了一些删除池变量但没有成功的事情。
有人知道技术问题是什么以及如何解决?感谢。