2015-04-01 98 views
1

我是從這裏給出的模板程序工作:GNU模擬退火

https://www.gnu.org/software/gsl/manual/html_node/Trivial-example.html

,因爲他們給它編譯和運行完美的程序,這是很好的。我想要做的就是推廣這種方法,以找到具有任意數量參數的函數的最小值。

一些粗略閱讀表明度量函數(M1)僅用於某些診斷和打印情況,因此可以或多或少地被忽略。剩下的就是適當地定義E1和S1。不幸的是,我對使用指針和void的知識並不完整,所以我試圖將配置'xp'升級爲參數數組,而不是單個double。

在我的天真嘗試從

double x = *((double *) xp); 

移動到

double x = (*((double *) xp))[0]; 

在適當情況下,但顯然沒有奏效。我確定我錯過了一些愚蠢的東西,所以任何提示都會很好!我顯然會定義自己的E1輸出功能,它將採用這N個參數並返回一個數字。

回答

0

來自所提供的鏈接的底層算法gsl_siman_solve()被推廣以適用於任何數據類型。這就是爲什麼無處不在的xp參數總是在使用前被轉換爲雙指針。如果所有的回調都被正確編碼,那麼使用任何結構體,數組或數組數組應該很簡單,而不是簡單的雙精度。

問題是gsl_siman_solve()似乎只支持標量雙步大小,初始猜測和「統一」值(從gsl_rng_uniform()),所以您需要將標量double值映射到自然多維數量。這可以完成,但它很混亂,不夠靈活。在你的情況下,映射將在S1()中完成。

這類似於將十進制數的數字映射到多維空間:例如,個位代表X軸,十位代表Y軸,百位代表Z軸。通過遞增整數,可以將整個3D空間從(0,0,0)移動到(9,9,9)。您不必使用整數和10的冪,並且組件甚至不必具有相同的範圍,但是在每個組件的值範圍內存在固有的限制。您實際上會做相反的事情:取一個標量double並將其解包爲多個數量。

最後,您的代碼double x = (*((double *) xp))[0];將不起作用,因爲您試圖將double重新引用爲數組,而不是指向double的指針,這可以。換句話說,就是第一個*就是這個問題。

+0

感謝蘭德爾。就像你說的那樣,它是混亂的,而且不是非常靈活,你能推薦任何使它更容易搜索更高維參數空間的庫嗎? – zylatis 2015-04-15 11:41:43

+0

確認,無法編輯評論。我發現這裏給出的ADA快速教程非常有用。大量的小提琴選項,但也有能力在自己的功能和界限中運用它,非常酷! http://www.quantcode.com/modules/mydownloads/singlefile.php?lid=504 – zylatis 2015-04-15 13:19:30

+0

@zylatis,很高興你發現有用的東西。我認爲你是一個更靈活的圖書館是正確的。畢竟,它是您想要的模擬退火算法,而不是它所包裝的庫。作爲參考,您可以在Stack Exchange上編輯註釋,但只能在短時間內處理,例如5分鐘。 – 2015-04-15 18:45:46