2014-10-10 83 views
0

我正在使用蠻力策略來找到我的問題的答案解決方案。我的想法是循環通過3個不同的範圍,例如,一個嵌套循環,以10爲增量顯着減少組合數量。從一個函數傳遞操作變量以用於另一個函數

然後我在我的第一個函數中給出了三個解決方案,爲我的函數重新定義了循環範圍參數,這將產生更精確的解決方案。

這是我的代碼:

# first broad looping function to zone down to the relevant area of my solution 
def t1_solve(cgoal): 
    max_value = None 
    nc_f = None 
    c_f = None 
    cd_f = None 
    for i, j, k in [(i,j,k) for i in range(nc_rev.idxmax(),int((cgoal*100)+200),5) for 
    j in range(c_rev.idxmax(),int((cgoal*100)+200),5) for k in range(cd_rev.idxmax(), 
    int((cgoal*100)+200),5)]: 
     if (t1rev(i,j,k) > max_value and t1c(i,j,k) > cgoal): 

      #storing the optimal value result, and my three solution in nc_f, c_f, cd_f 

      max_value = t1rev(i,j,k) 
      nc_f = i 
      c_f = j 
      cd_f = k 

    print max_value 
    print nc_f, c_f, cd_f 
    return nc_f 
    return c_f 
    return cd_f 

# second reduced looping problem to fine-tune my answer 

def t1_finetune(): 

# run the broad looping function 

    t1_solve(3.61) 

# this is where I have trouble with passing my solutions stored in the 
# previous function's nc_f, c_f, cd_f 

#ERROR OCCURS HERE!!!!! 
    if nc_f - 20 > 0: 
     nc_lowerbound = nc_f - 20 
    else: 
     nc_lowerbound = 1 

    if nc_f + 20 < 1499: 
     nc_upperbound = nc_f + 20 
    else: 
     nc_upperbound = 1499 

    if c_f - 20 > 0: 
     c_lowerbound = c_f - 20 
    else: 
     c_lowerbound = 1 

    if c_f + 20 < 1499: 
     c_upperbound = c_f + 20 
    else: 
     c_upperbound = 1499 

    if cd_f - 20 > 0: 
     cd_lowerbound = cd_f - 20 
    else: 
     cd_lowerbound = 1 

    if cd_f + 20 < 1499: 
     cd_upperbound = cd_f + 20 
    else: 
     cd_upperbound = 1499  

    for i, j, k in [(i,j,k) for i in range(nc_lowerbound, nc_upperbound) for 
    j in range(c_lowerbound, c_upperbound) for k in range(cd_lowerbound, cd_upperbound)]: 
     if (t1rev(i,j,k) > max_value and t1c(i,j,k) > cgoal): 
      max_value = t1rev(i,j,k) 
      nc_f = i 
      c_f = j 
      cd_f = k 
    print max_value 
    print nc_f, c_f, cd_f 
    return nc_f, c_f, cd_f 


t=time.time() 
t1_finetune() 
print time.time() - t 

該錯誤消息我得到的是:

UnboundLocalError: local variable 'nc_f' referenced before assignment 

從本質上講,我只需要nc_f通過,C_F和cd_f從我t1_solve()在我t1_finetune()。自己運行t1_solve()可以正常工作,並且在t1_finetune()中調用t1_solve()時,它仍然可以運行,直到發生錯誤發生的代碼的其餘部分。

我希望這是明確的,請讓我知道,如果有什麼我可以澄清。

在此先感謝!

+0

@Apero:我第一次在手機上讀到這個問題,不知道問題是什麼,所以我覺得你的痛苦。 :) – abarnert 2014-10-10 19:15:32

回答

2

首先,您的t1_solve函數有三個return而不是一個。一旦到達第一個,功能就結束了,其他的都不會發生。所以,你需要這樣的:

return nc_f, c_f, cd_f 

接下來,當你調用t1_solve並返回這些值給你,你只是忽略的結果。你需要將它們存儲在某個地方。例如:

nc_f, c_f, cd_f = t1_solve(3.61) 

對於一個直觀的瞭解,你在做什麼這裏返回三個值,而不是一個,以及三個變量分配這三個返回值。

如果你想知道什麼是實際上發生:第一個nc_f, c_f, cd_f創建一個單一的3元組元組並返回一個元組。然後,後面的nc_f, c_f, cd_f =使用迭代分配解包。請參閱教程部分Tuples and Sequences以獲得很好的介紹。

+0

感謝您的回答@abarnet,我是Python新手,不太瞭解這些返回的值如何再次使用。存儲它們是這裏的關鍵。再次感謝! – ploo 2014-10-10 18:48:25

相關問題