我想要用并行計算求all_fitness,串行時能正常運行,但并行時出現報錯如下:
Traceback (most recent call last):
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 44, in mapstar
return list(map(*args))
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\defs.py", line 8, in all_fitness
allF[i]=([function1(P[i]),function2ce(P[i])[0],function3(P[i])])
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\defs.py", line 13, in function1
return sum(y)
TypeError: 'int' object is not iterable
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 266, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:\Users\lq\AppData\Local\Programs\Python\Python36\lib\multiprocessing\pool.py", line 644, in get
raise self._value
TypeError: 'int' object is not iterable
問題代碼如下:
def all_fitness(P):
allF=[[]for i in range(len(P))]
for i in range(len(P)):
allF[i]=([function1(P[i]),function2ce(P[i])[0],function3(P[i])])
return allF
def function1(y):
return sum(y)
# Second function to optimize
def function2ce(y):
Rr=[0 for a in range(N)] #Rr為01變數,
Ere=[0 for a in range(N)]
Z=[[0 for a in range(M)]for a in range(N)]#01變數,
Ece=[0 for a in range(N)]
z=[[]for i in range(N)]
d=[]
ce=0
md=35
for trip in range(N):
if tag[trip-1]!=tag[trip]:re=md
tre=max(re,0) #實際余電
if tre<=0.3*md:Rr[trip]=1
Ere[trip]=tre
for i in range(M):
Z[trip][i]=y[i]*Rr[trip]*D[trip][i]
if sum(Z[trip-1])!=0:
for v in range(len(Z[trip-1])):
if Z[trip-1][v]==1:z[trip-1].append(v)
d=kidis.cell(trip-1,choice(z[trip-1])).value
Ejk=md-Ere[trip]+d*Qa
re=tre+Ece[trip-1]-2*d*Qa-djk[trip]*Qa
if d<=Ere[trip]/Qa:
Cijk=2*A*Qa*d
else:
Cijk=A*(Ere[trip]+d*Qa)+B*Qb*(d-Ere[trip]/Qa)
else:
Ejk=0
re=tre-djk[trip]*Qa
Cijk=0
Ece[trip]=Ejk
ce+=A*(Ere[trip-1]+Ece[trip-1]-Ere[trip])+B*Qb/Qa*(Ere[trip]-re)+Cijk
return ce,Z,Ece,z
#Third function to optimize
from datetime import datetime
from xlrd import xldate_as_tuple
from datetime import datetime,timedelta
def function3(y):
SPD=[[]for i in range(M)]
lt=[[]for i in range(N)]
dt=[[]for i in range(N)]
PD=[[]for i in range(M)]
ece=[[]for i in range(M)]#Ece
T=[[]for i in range(M)]
q=[[]for i in range(M)]
Z3=function2ce(y)[1]
z3=function2ce(y)[3]
Ece3=function2ce(y)[2]
nPD=0
for trip in range(N):
dt[trip]=datetime(*xldate_as_tuple(at[trip],0))
if len(z3[trip])!=0:
PD[z3[trip][0]].append(dt[trip])
nPD+=1
ece[z3[trip][0]].append(Ece3[trip])
for i in range(M):
T[i]=[0 for i in range(len(PD[i]))]
q[i]=[0 for i in range(len(PD[i]))]
for i in range(M):
SPD[i]=sorted(PD[i])
for r in range(len(PD[i])):
for x in range(len(lt[i])):
if SPD[i][r]<lt[i][x]:q[i][r]+=1
if q[i][r]>=s:T[i][r]=t0*(0.5+math.floor((q[i][r]-s)/s))
lt[i].append(SPD[i][r]+timedelta(hours=T[i][r])+timedelta(hours=ece[i][r]/R))
return sum(sum(T))/nPD #小時
if __name__ == '__main__':
with Pool(5) as p:
f=p.map(defs.all_fitness, pos)
我的代碼哪里出錯了呢?困擾我很長時間的問題,如果有人能幫忙解答真的萬分感謝!!!
uj5u.com熱心網友回復:
寫得什么亂七八糟的.最后一后最右邊那個pos是什么鬼, 哪步賦值了?
uj5u.com熱心網友回復:
把程式用代碼塊括起來好嗎。。。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38592.html
上一篇:爬蟲無法正常爬取,求大神指示
