Dal ve kesim - Branch and cut

Dal ve kesim[1] bir yöntemdir kombinatoryal optimizasyon çözmek için tamsayı doğrusal programlar (ILP'ler), yani doğrusal programlama (LP) bilinmeyenlerin bir kısmının veya tümünün sınırlı olduğu sorunlar tamsayı değerler.[2] Dal ve kesim, bir dal ve sınır algoritma ve kullanma uçakları kesmek doğrusal programlama gevşemelerini sıkılaştırmak için. Kesmeler yalnızca ilk LP gevşemesini sıkılaştırmak için kullanılıyorsa, algoritmaya kes ve dal.

Algoritma

Bu açıklama, ILP'nin bir maksimizasyon sorun.

Yöntem çözer tamsayı kısıtlaması olmayan doğrusal program normal kullanarak simpleks algoritması. Optimal bir çözüm elde edildiğinde ve bu çözüm, tamsayı olması beklenen bir değişken için tamsayı olmayan bir değere sahip olduğunda, kesme düzlemi algoritması herkesin karşıladığı başka doğrusal kısıtlamaları bulmak için kullanılabilir. mümkün tamsayı noktaları, ancak mevcut kesirli çözüm tarafından ihlal ediliyor. Bu eşitsizlikler doğrusal programa eklenebilir, öyle ki çözüldüğünde "daha az kesirli" olan farklı bir çözüm elde edilir.

Bu noktada, dal ve sınır algoritmanın bir parçası başlatılır. Sorun birden çok (genellikle iki) versiyona bölünmüştür. Yeni doğrusal programlar daha sonra simpleks yöntemi kullanılarak çözülür ve süreç tekrarlanır. Dallanma ve sınırlama süreci sırasında, LP gevşemelerine yönelik integral olmayan çözümler üst sınırlar ve integral çözümler alt sınırlar olarak hizmet eder. Bir düğüm olabilir budanmış bir üst sınır mevcut bir alt sınırdan daha düşükse. Ayrıca, LP gevşemelerini çözerken, ek kesme düzlemleri üretilebilir; küresel kesintileryani, tüm uygulanabilir tamsayı çözümleri için geçerlidir veya yerel kesimler, şu anda dikkate alınan dal ve bağlı alt ağacın yan kısıtlamalarını karşılayan tüm çözümlerden memnun oldukları anlamına gelir.

Algoritma aşağıda özetlenmiştir.

  1. İlk ILP'yi şuraya ekle: , aktif sorunların listesi
  2. Ayarlamak ve
  3. süre boş değil
    1. Bir sorunu seçin ve kaldırın (sırayı kaldırın).
    2. Problemin LP gevşemesini çözün.
    3. Çözüm uygulanabilir değilse, 3'e (while) geri dönün. Aksi takdirde çözümü şu şekilde ifade edin: nesnel değeri olan .
    4. Eğer 3. adıma geri dönün.
    5. Eğer tam sayıdır, set ve 3. adıma geri dönün.
    6. İstenirse, ihlal edilen uçakları arayın. . Herhangi biri bulunursa, bunları LP gevşemesine ekleyin ve 3.2'ye geri dönün.
    7. Sorunu, sınırlı uygulanabilir bölgelerle yeni sorunlara bölmek için kollara ayırın. Bu sorunu şuraya ekle: ve 3'e geri dön
  4. dönüş

Sözde kod

İçinde C ++ -sevmek sözde kod, bu yazılabilir:

 1 // Hedefin en üst düzeye çıkarılacağını varsayarak ILP dallanma ve kesme çözümü sözde kodu 2 ILP_solution branch_and_cut_ILP(IntegerLinearProgram ilk_sorun) { 3     kuyruk active_list; // L, yukarıda 4     active_list.sıraya almak(ilk_sorun); // Aşama 1 5     // Adım 2 6     ILP_solution en uygun çözüm; // bu yukarıda x * tutacak 7     çift best_objective = -std::sayısal_sınırlar<çift>::sonsuzluk; // yukarıda v * tutacak 8     süre (!active_list.boş()) { // yukarıdaki 3. adım 9         Doğrusal Program& curr_prob = active_list.kuyruktan çıkarmak(); // adım 3.110         yapmak { // 3.2-3.7. adımlar11             RelaxedLinearProgram& relaxed_prob = LP_relax(curr_prob); // adım 3.212             LP_solution curr_relaxed_soln = LP_solve(relaxed_prob); // bu yukarıdaki x13             bool cut_planes_found = yanlış;14             Eğer (!curr_relaxed_soln.uygulanabilir()) { // adım 3.315                 devam et; // başka bir çözüm deneyin; 3. adımda devam ediyor16             }17             çift current_objective_value = curr_relaxed_soln.değer(); // v yukarıda18             Eğer (current_objective_value <= best_objective) { // adım 3.419                 devam et; // başka bir çözüm deneyin; 3. adımda devam ediyor20             }21             Eğer (curr_relaxed_soln.is_integer()) { // adım 3.522                 best_objective = current_objective_value;23                 en uygun çözüm = cast_as_ILP_solution(curr_relaxed_soln);24                 devam et; // 3. adımda devam eder25             }26             // mevcut rahat çözüm integral değildir27             Eğer (Hunting_for_cutting_planes) { // adım 3.628                 violated_cutting_planes = search_for_violated_cutting_planes(curr_relaxed_soln);29                 Eğer (!violated_cutting_planes.boş()) { // adım 3.630                     cut_planes_found = doğru; // adım 3.2'de devam edecek31                     için (Oto&& cut_plane : violated_cutting_planes) {32                         active_list.sıraya almak(LP_relax(curr_prob, cut_plane));33                     }34                     devam et; // 3.2 adımda devam eder35                 }36             }37             // adım 3.7: ya ihlal edilen kesme düzlemleri bulunamadı ya da onları aramıyorduk38             Oto&& dallı_problemler = Branch_partition(curr_prob);39             için (Oto&& şube : dallı_problemler) {40                 active_list.sıraya almak(şube);41             }42             devam et; // 3. adımda devam eder43         } süre (Hunting_for_cutting_planes / * algoritmanın parametresi; bkz 3.6 * /44                && cut_planes_found);45         // 3.2 adımı tamamla döngüsü46     } // döngü sırasında 3. adımı sonlandır47     dönüş en uygun çözüm; // 4. adım48 }

Yukarıdaki sözde kodda, işlevler LP_relax, LP_solve ve Branch_partition alt yordamlar olarak adlandırılan, soruna uygun şekilde sağlanmalıdır. Örneğin, LP_solve arayabilir simpleks algoritması. İçin dallanma stratejileri Branch_partition aşağıda tartışılmaktadır.

Dallanma stratejileri

Dallanma ve kesme algoritmasındaki önemli bir adım dallanma adımıdır. Bu adımda, kullanılabilecek çeşitli dallanma sezgisel yöntemleri vardır. Aşağıda açıklanan dallanma stratejilerinin tümü, bir değişken üzerinde dallanma.[3] Bir değişken üzerinde dallanma, bir değişken seçmeyi içerir, , kesirli bir değerle, , mevcut LP gevşemesine en uygun çözümde ve ardından kısıtlamaları ekleyerek ve

En elverişsiz dallanma
Bu dallanma stratejisi, kesirli kısmı 0,5'e en yakın olan değişkeni seçer.
Sözde maliyet dallanma
Bu stratejinin temel fikri, her değişkeni takip etmektir. bu değişken daha önce dallanacak değişken olarak seçildiğinde amaç işlevindeki değişiklik. Ardından strateji, dallanma değişkeni olarak seçildiğinde geçmiş değişikliklere dayalı olarak amaç fonksiyonunda en fazla değişikliğe sahip olacağı tahmin edilen değişkeni seçer. Sahte maliyet dallanmasının aramada başlangıçta bilgisiz olduğuna dikkat edin, çünkü birkaç değişken dallanmış.
Güçlü dallanma
Güçlü dallanma, aday değişkenden hangisinin amaç işlevine en iyi gelişmeyi sağladığını, gerçekte dallanmadan önce test etmeyi içerir. Tam güçlü dallanma tüm aday değişkenleri test eder ve hesaplama açısından pahalı olabilir. Hesaplama maliyeti, yalnızca aday değişkenlerin bir alt kümesini dikkate alarak ve karşılık gelen LP gevşemelerinin her birini tamamlanana kadar çözmeyerek azaltılabilir.

Bu dallanma stratejilerinin çok sayıda varyasyonu da vardır, örneğin sözde maliyet dallanmasının görece bilgisiz olduğu erken dönemde güçlü dallanma kullanmak ve daha sonra sözde maliyetin bilgilendirici olması için yeterli dallanma geçmişi olduğunda sözde maliyet dallarına geçiş yapmak gibi.

Referanslar

  1. ^ Padberg, Manfred; Rinaldi Giovanni (1991). "Büyük Ölçekli Simetrik Seyahat Eden Satıcı Sorunlarının Çözümü için Dal ve Kes Algoritması". SIAM İncelemesi. 33 (1): 60–100. doi:10.1137/1033004. ISSN  0036-1445.
  2. ^ John E., Mitchell (2002). "Kombinatoryal Optimizasyon Problemleri için Dal ve Kes Algoritmaları" (PDF). Uygulamalı Optimizasyon El Kitabı: 65–77.
  3. ^ Achterberg, Tobias; Koch, Thorsten; Martin, Alexander (2005). "Dallanma kuralları yeniden gözden geçirildi". Yöneylem Araştırma Mektupları. 33 (1): 42–54. doi:10.1016 / j.orl.2004.04.002.

Dış bağlantılar