2016-04-19 53 views
1

我在OpenMDAO中運行非線性優化問題,我知道最佳解決方案(我只是想驗證解決方案)。我使用SLSQP驅動程序配置ScipyOptimizeropenmdao.apiScipyOptimizer給出不正確的優化結果

我有3個設計變量A,B和C,它們各自的設計空間(A 分鐘至A 最大爲A等)和單個目標函數Z.正如我說,我知道的對於所有三個設計變量的最優值(讓我們稱之爲甲溶膠,B 溶膠和C 溶膠)其產生Z的最小值(稱之爲ž溶膠)。

當我運行這個問題時,我得到一個大於Z的值,它表示它不是最優的解決方案。當我將C sol分配給C並且僅以A和B作爲設計變量運行該問題時,我得到的Z值更接近於Z,這比我之前得到的(在3設計變量場景)。

我爲什麼要觀察這種行爲?在兩種情況下,都不應該提供相同的解決方案嗎?

編輯:添加一些代碼..

from openmdao.api import IndepVarComp, Group, Problem 
from openmdao.api import ScipyOptimizer 

class RootGroup(Group): 
    def __init__(self): 
     super(RootGroup, self).__init__() 

     self.add('desvar_f', IndepVarComp('f', 0.08)) 
     self.add('desvar_twc', IndepVarComp('tool_wear_compensation', 0.06)) 
     self.add('desvar_V', IndepVarComp('V', 32.0)) 
     # Some more config (adding components, connections etc.) 

class TurningProblem_singlepart(Problem): 
    def __init__(self): 
     super(TurningProblem_singlepart, self).__init__() 

     self.root = RootGroup() 

     self.driver = ScipyOptimizer() 
     self.driver.options['optimizer'] = 'SLSQP' 

     self.driver.add_desvar('desvar_f.f', lower=0.08, upper=0.28) 
     self.driver.add_desvar('desvar_twc.tool_wear_compensation', lower=0.0, upper=0.5) 
     self.driver.add_desvar('desvar_V.V', lower=32.0, upper=70.0) 
     self.driver.add_objective('Inverse_inst.comp_output') 
     # Other config 

此代碼給了我不正確的結果。當我從兩個類中刪除desvar_twc,併爲其指定最佳值(來自我的解決方案)時,我得到相當正確的結果,即目標函數的答案比先前的方案更小。

+0

你能告訴我們任何代碼嗎? –

+1

是的,我將代碼片段放在一起,使其更加清晰。實際的代碼更大,這就是爲什麼我沒有把它放在帖子裏。我將很快編輯這篇文章。 –

+1

太棒了!這總是很長的路:) –

回答

0

沒有看到您的實際模型,我們無法確定任何事情。但是,本地優化器的解決方案通常與起始條件無關,這是而不是。如果問題是凸的,那只是情況。所以我猜想你的問題不是凸的,你會遇到局部最優。

你可以嘗試使用COBYLA優化器代替SLSQP來解決這個問題,在我的經驗中,它可以更好地跳過某些本地最優解。但如果你的問題真的很顛簸,那麼我建議你從pyopt-sparse library切換到NSGA-II或ALPSO。這些都是基於啓發式的優化器,它們在找到「最大的山丘」方面做得很好,儘管它們並不總是一路攀升到頂峯(它們不會緊密聚合)。啓發式算法通常比基於梯度的方法更昂貴。

+0

謝謝指點。我現在試圖與COBYLA一起運行這個問題,並且會將結果更新到帖子中。我唯一困惑的是'desvar_twc = 0.05'是最佳解決方案,即使我用0.06初始化,優化器也給了我0.00的最佳值。我在這裏錯過了什麼? –