Doğrusal olmayan kısıtlı minimizasyon için C ++ kütüphanesi


9

Şu anda matlab "fmincon" fonksiyonunda uygulandığı gibi doğrusal olmayan kısıtlı minimizasyon problemini çözmeye çalışıyorum. Beklentilerim, minimize etmek (fun1, x0, uB, lB, fun2), burada x0 başlangıç ​​durumudur, fun1 en aza indirilmesi gereken işlevdir, uB üst sınırlardır, lB daha düşük sınırlardır ve fun2, doğrusal olmayan eşitliklerin vektörlerini sağlayan işlevdir / http://www.mathworks.com/help/optim/ug/fmincon.html adresinde açıklanan eşitsizliklernonlcon işlevi olarak. Bu vektörler de yinelemeler yoluyla değişmektedir (bunlar, çözelti vektörünün x_n, n. Yinelemesine doğrusal olarak bağımlı değildir). Matlab uygulamasında c (x) <= 0 biçimindedirler. Bu, matlab'dan c ++ 'a taşınması gereken kodun son parçası ve bu algoritmayı içeren uygun c ++ kütüphanesini bulmaya çalışırken çok uğraşıyorum. Bu yüzden burada yardım arıyorum ve uzmanlığınızı sunabilirseniz çok memnun olurum.

Ne yapmak istediğime iyi bir örnek bu sayfada ilk olanı http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b Tek fark şu ki sınırlara da ihtiyacım var ...

Şimdiden teşekkürler.

Peter


NLOPT ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference kullanma olasılığı vardır, ancak objektif işlevden "minimize" işlev değerlendirmesine birden çok çağrı kullanarak sonlu farkları hesaplamak gerekir ve naziktim performansın iyileştirilmesi için algoritmanın kendisi tarafından halledileceğini umuyor. Minimize edilmiş fonksiyonumun hesaplanması gerçekten pahalı. Sadece açıklığa kavuşturmak için, minimize edilmiş fonksiyon, zaman serisi markov-anahtarlamalı model tahmininde orijinal verilerle tahmini modelin log-olasılıktır.
Peter Kottas

1
Bu sorunun cevaplarına baktınız mı ? Gereksinimleriniz orada yeterince ele alınmıyorsa, yararlı öneriler almak için sorunuzu belirtmek üzere düzenlemeniz gerekir.
Christian Clason

Teşekkürler, orada bazı yararlı bilgiler var. Şu anda NLOPT kütüphanesindeki dirseklerimin peşindeyim, çünkü bunun da sorunuma uygun olabileceğini keşfettim. Bu konuyu haberdar edeceğim ve bir tane bulduğumda çözüm sağlayacağım. Süreci daha hızlı hale getirebilecek herhangi bir yardım hala takdir edilmektedir. Örneğin fiili uygulama, vb.
Peter Kottas

1
Birkaç soru: 1. Sorununuz dışbükey mi? 2. Amaç ve kısıtlamalar farklı mıdır? Eğer öyleyse, kaç kez? Bir Zamanlar? İki defa? 3. Varsa, bu türevleri kolayca hesaplayabilir misiniz? Eğer bu türevleri kolayca bulamazsanız, sonlu fark yaklaşımlarının hesaplanması kolay olur mu? 4. Kaç karar değişkeniniz var? (yani, kaç değişkeni en aza indirmeye çalışıyorsunuz?) Kaba bir tahmin yeterli olacaktır. 5. İşlev değerlendirmeleri pahalı mı? Size daha iyi bir cevap verebilmek için tüm bu bilgilere sahip olmak faydalı olacaktır.
Geoff Oxberry

Selam! Her şeyden önce, cevap için teşekkürler. 1. Söylemesi zor ama büyük olasılıkla hayır, çünkü minimize edilmiş fonksiyon, finansal uygulamadaki zamanlamaların markov anahtarlama modeli tahmini ile doğası gereği bir çeşit gürültülü çıktı varsayıyorum. 2.no 3. sadece sonlu farklar kullanma 4. çözüm vektörü n değişkenlerinin istenen model parametrelerine bağlı olduğu n değişkenlerden oluşur, genel olarak 12 ila 30 diyelim 5. model ve orijinal veriler arasındaki log-olasılık pahalı, ek doğrusal olmayan eşitsizlikler hesaplamak için
cıvıldamak

Yanıtlar:


2

İşleviniz farklı değilse, sonlu farkları nasıl kullandığınız konusunda dikkatli olmalısınız. Türev bilgilerini kullanmak istiyorsanız, en iyi bahsiniz muhtemelen bir çeşit yarı-yarı Newton tipi yöntemdir. Bu yöntemleri açıklayan bir dizi not burada bulunabilir .

On iki ila otuz değişken büyük olasılıkla kalıp arama (doğrudan arama da denir) yöntemleriyle yapılabileceklerin üst ucundadır. Türevsiz optimizasyon yöntemleri (kalıp arama yöntemleri gibi) hakkında Rios ve Sahinidis tarafından yayınlanan yeni bir derleme makalesi burada eşlik eden bir web sayfasıyla birlikte bulunabilir . SIAM Review'da Kolda, Lewis ve Torczon'un bu yöntemlerle ilgili daha yeni bir inceleme makalesi burada bulunabilir . Bu yöntemler pahalı fonksiyon değerlendirmeleri ile oldukça iyi çalışır ve mutlaka farklılaşma veya türev bilgisi gerektirmez.

Bu yöntemlerin birçoğu, küresel optimum seviyeye yakınsamayı garanti etmek için bir tür dışbükeylik gerektirir, bu nedenle sorununuzu titizlikle çözecek olursanız, bu yöntemleri yukarıdaki bir şubeye bağlı stratejiyle birleştirmeniz gerekebilir. Ancak, titizliği umursamıyorsanız, MATLAB'lar gibi bir yaklaşım fminconyeterince işe yarayabilir (artık garanti yoktur). Sonlu farklar büyük olasılıkla size ayırt edilemeyen fonksiyonunuzun alt farkının bir üyesini verecektir, bu da sizin problem örneğiniz ve belirli girdi verilerinizin amaçlarınız için yeterince doğru bir sonuç vermesi için yeterli olabilir. Bu durumda, muhtemelen Hıristiyan'ın yorumunda bağladığı sorunun cevaplarında belirtilen kütüphanelere bakmalısınız.


2

İhtiyacınız olan tek şey doğrusal olmayan optimizasyon sorunlarını çözmek için bir C ++ kütüphanesi ise, RobOptim'i kullanabilirsiniz . RobOptim başlangıçta robot optimizasyonu problemleri göz önünde bulundurularak geliştirilmiş olsa da, doğrusal olmayan optimizasyon problemleri için uygundur. Çoklu doğrusal olmayan çözücüler ( Ipopt , NAG , vb.) İçin eklentileri olan basit bir C ++ arayüzü sağlar . Bu tür ambalajların kullanılması başka bir NLP çözücüsünün kullanılmasını kolaylaştırır. Degradeleri sağlayamazsanız, sonlu fark hesaplaması otomatik olarak yapılabilir.

GitHub'daki kaynak kodunu kontrol edebilmeniz için açık kaynak: https://github.com/roboptim/

@ Geoff Oxberry tarafından yapılan analiz, RobOptim tarafından çağrılacak olan doğrusal olmayan çözücünün seçimi için gereklidir. Bu tür çözücülerle uğraşırken, parametre ayarlamasının performans üzerinde büyük bir etkisi olabileceğini ve yine de yerel minimaslara sıkışabileceğinizi unutmayın (gerçekten uğraştığınız sorunun türüne bağlıdır).

Not: Bu projenin geliştiricilerinden biriyim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.