파이썬 3.x 및 PyCharm을 사용하여 그라디언트 디센트를 만들려고합니다. 코드는 우아하지 않지만 작동했습니다. 하지만 여러 번 실행하면 "for"루프가 작동을 멈 춥니 다. 메모리 문제 또는 이와 비슷한 문제 일 수 있다고 생각하지만 문제가 있다면 해결 방법을 잘 모르겠습니다.루프가 매번 실행되지 않음 (파이썬)
thrust_forward()
thrust = neu['d']
thrust_new = 0
def back_and_forward():
randomize_steps_effect()
thrust_backward()
thrust_forward()
global thrust_new
thrust_new = neu['d']
iterations = 5000000
def start_process():
print('')
print('Progress:')
for i in range (0,iterations):
global thrust_new
global thrust
while thrust_new < thrust:
back_and_forward()
thrust = thrust_new
if i%(iterations/100) == 0:
print('|', sep = '', end='', flush=True)
print('')
print('Final: P = ' +str(thrust/9.8) + str(prm))
start_process()
주요 매개 변수는 사전에 저장됩니다
#Randomize steps
def randomize_steps_effect():
for key, values in stp.items():
r = random.randint(0,3)
if r != 0 and (key != 'm' or key != 'w'):
stp[key] *= -1
앞뒤로 기능 :
#Parametres
prm = {
'm':3, #kg/s
...
'ph':-50000 #Pa
}
#Parameters steps
stp = {
'a':0.01,
...
'ph':50 #Pa
}
#Additional vars
neu = {
'a':0,
...
'd':0
}
이 단계에 대한 기능을 무작위, 그래서 "추력"결국이 증가하고 루프 휴식 시간 동안 :
def thrust_forward():
neu['a'] = forward_multiply(prm['m'],prm['w'])
neu['c'] = forward_add(prm['pa'],prm['ph'])
neu['b'] = forward_multiply(neu['c'],prm['Fa'])
neu['d'] = forward_add(neu['a'],neu['b'])
def thrust_backward():
global max_w
neu['a'] += stp['a'] * backward_add()
neu['b'] += stp['b'] * backward_add()
prm['Fa'] += stp['Fa'] * backward_multiply_F_wrt_b(prm['Fa'],neu['c'])
neu['c'] += stp['c'] * backward_multiply_F_wrt_b(neu['c'],prm['Fa'])
prm['pa'] += stp['pa'] * backward_add()
prm['ph'] += stp['ph'] * backward_add()
prm['m'] += stp['m'] * backward_multiply_F_wrt_b(prm['m'],prm['w'])
if prm['w'] >= max_w:
stp['w'] = 0
prm['w'] += stp['w'] * backward_multiply_F_wrt_b(prm['w'],prm['m'])
다른 변수 값에 문제처럼 보이는 전역 변수를 사용하지 않아야합니다, 당신에게
제레미가 말한대로
을 도울 수 있습니다 prm, P, P_new가 어디에서 왔는지 보여줄 수 있습니다. 현재이 변수에 오류가 있습니다. 또한 함수에서 외부/전역 변수에 액세스하고있는 것으로 나타났습니다. 이 솔루션을 권장하지 않으며 최후의 수단으로 만 수행하므로이 연습을 최소화하고 매개 변수를 사용하고자 할 수 있습니다. –모든 전역 변수 대신 함수 인수 및 반환 값을 사용하면 코드를 훨씬 읽고 읽고 유지 보수 할 수 있습니다. –