Etkinlik seçimi sorunu - Activity selection problem

Aktivitesi seçimi problemi a, kombinatoryal optimizasyon olmayan çakışan bir seçimi ile ilgili bir sorun faaliyetleri , belirli bir mesafede olan gerçekleştirmek için bir zaman dilimi faaliyetlerinin bir dizi, bir başlangıç zamanından (s ile işaretlenmiştir verilen i (f) ve bitiş zaman i ). Problem, bir kişinin aynı anda sadece tek bir aktivite üzerinde çalışabileceğini varsayarak, tek bir kişi veya makine tarafından gerçekleştirilebilecek maksimum aktivite sayısını seçmektir . Aktivitesi seçimi problemi olarak da bilinir Aralık zamanlama maksimize sorunu (ISMP) daha genel bir özel bir türüdür, Aralık Zamanlama sorun.

Bu sorunun klasik bir uygulaması , her biri kendi zaman gereksinimlerine (başlangıç ​​ve bitiş zamanı) sahip olan ve daha birçokları yöneylem araştırması çerçevesinde ortaya çıkan birden çok yarışan etkinlik için bir oda planlamaktır .

Resmi tanımlama

Her birinin başlangıç ​​zamanı s i ve bitiş zamanı f i ile temsil edildiği n aktivite olduğunu varsayın . s benf j veya s jf i ise, i ve j'nin iki faaliyetinin çelişkili olmadığı söylenir . Etkinlik seçimi problemi, daha doğrusu hiçbir bulunmalıdır olmayan çakışan faaliyetlerin maksimal çözüm kümesi (S) bulunmasında meydana gelmektedir çözüm seti | '| S öyle ki' S > |S| çoklu maksimal çözümlerin eşit boyutlara sahip olması durumunda.

En uygun çözüm

Aktivite seçimi problemi, bir çözüm bulmak için açgözlü bir algoritma kullanmanın her zaman optimal bir çözümle sonuçlanması bakımından dikkate değerdir . Algoritmanın yinelemeli versiyonunun bir sözde kod taslağı ve sonucunun optimalliğinin bir kanıtı aşağıda yer almaktadır.

algoritma

Greedy-Iterative-Activity-Selector(A, s, f): 

    Sort A by finish times stored in f
    S = {A[1]} 
    k = 1
    
    n = A.length
    
    for i = 2 to n:
        if s[i]  f[k]: 
            S = S U {A[i]}
            k = i
    
    return S

Açıklama

Satır 1: Bu algoritmaya Greedy-Iterative-Activity-Selector adı verilir , çünkü her şeyden önce açgözlü bir algoritmadır ve sonra yinelemelidir. Bu açgözlü algoritmanın özyinelemeli bir versiyonu da var.

  • aktiviteleri içeren bir dizidir .
  • içindeki etkinliklerin başlangıç ​​zamanlarını içeren bir dizidir .
  • içindeki etkinliklerin bitiş zamanlarını içeren bir dizidir .

Bu dizilerin, 1'den başlayarak karşılık gelen dizinin uzunluğuna kadar indekslendiğini unutmayın.

Satır 3: Dizide depolanan bitiş zamanlarını kullanarak etkinlikler dizisini artan bitiş zamanlarına göre sıralar . Bu işlem, örneğin birleştirme sıralama, yığın sıralama veya hızlı sıralama algoritmaları kullanılarak zamanında yapılabilir .

Satır 4: Seçilen etkinlikleri depolamak için bir küme oluşturur ve bunu en erken bitiş zamanı olan etkinlikle başlatır .

Satır 5: Son seçilen etkinliğin dizinini izleyen bir değişken oluşturur .

Satır 9: Dizinin ikinci öğesinden son öğesine kadar yinelemeye başlar .

Çizgiler 10,11: Eğer başlangıç zamanı içinde etkinliği ( ) büyük veya eşit olan bitiş zaman içinde son seçilen aktivitenin ( ), sonra sette seçilen faaliyetlere uyumludur ve böylece eklenebilir .

Satır 12: Son seçilen aktivitenin dizini, yeni eklenen aktiviteye güncellenir .

Optimallik kanıtı

Bitiş zamanına göre sıralanmış etkinlikler kümesi olsun . Bunun da bitiş zamanına göre sıralanmış bir optimal çözüm olduğunu varsayalım ; ve ilk aktivitenin endeksinin A ise , yani bu optimal çözüm değildir açgözlü seçimi ile başlar. Açgözlü seçimle (etkinlik 1) başlayan 'nin başka bir optimal çözüm olduğunu göstereceğiz . Yana A'da faaliyetlerdir ve ayrık tanım gereği, B faaliyetleri de ayrÛktÛr. Yana B gibi etkinlikler aynı sayıda A ise, , B de en uygunudur.

Açgözlü seçim yapıldığında, problem alt problem için en uygun çözümü bulmaya indirgenir. Eğer bir ilk sorun, optimum bir çözüm S hırslı bir seçim içeren, daha sonra etkinlik seçim problemine uygun çözümdür .

Niye ya? Aksi olsaydı, bir çözüm almak B 'olarak S daha faaliyetleri ile' A 'için açgözlü seçim içeren S '. Daha sonra, 1 ilave B 'uygun bir çözüm doğuracak B için S fazla faaliyetleri ile A optimalitesine çelişen.

Ağırlıklı aktivite seçimi problemi

Aktivite seçimi probleminin genelleştirilmiş versiyonu, toplam ağırlığın maksimize edileceği şekilde örtüşmeyen aktivitelerin optimal bir setini seçmeyi içerir. Ağırlıksız versiyonun aksine, ağırlıklı aktivite seçimi probleminin açgözlü bir çözümü yoktur. Bununla birlikte, aşağıdaki yaklaşım kullanılarak dinamik bir programlama çözümü kolayca oluşturulabilir:

Aktivite k içeren optimal bir çözüm düşünün . Şimdi k'nin solunda ve sağında örtüşmeyen etkinliklerimiz var . Optimal alt yapı nedeniyle bu iki küme için özyinelemeli çözümler bulabiliriz. k bilmediğimiz için etkinliklerin her birini deneyebiliriz. Bu yaklaşım bir çözüme yol açar . Bu, içindeki her bir faaliyet grubu için , t , j in ile örtüşmeyen son aralık olmak üzere , için çözümü bilseydik en uygun çözümü bulabileceğimizi göz önünde bulundurarak daha da optimize edilebilir . Bu bir çözüm sağlar. Bu, tüm aralıkları dikkate almamız gerekmediği, bunun yerine sadece . Aşağıdaki algoritma böylece bir çözüm verir :

Weighted-Activity-Selection(S):  // S = list of activities

    sort S by finish time
    opt[0] = 0  // opt[j] represents optimal solution (sum of weights of selected activities) for S[1,2..,j]
   
    for i = 1 to n:
        t = binary search to find activity with finish time <= start time for i
            // if there are more than one such activities, choose the one with last finish time
        opt[i] = MAX(opt[i-1], opt[t] + w(i))
        
    return opt[n]

Referanslar

Dış bağlantılar