Yönlendirilmiş bir grafikte, paylaşılmayan en fazla sayıda kenarı içeren döngüleri nasıl bulabilirim?


26

Ben bir bilgisayar bilimi teorisyeni değilim ama bu gerçek dünya probleminin buraya ait olduğunu düşünüyorum.

Sorun

Şirketimin ülke genelinde birkaç birimi var.

Çalışanlarımıza başka bir birimde çalışma imkanı sunduk. Ancak bir şart var: Bir birimin toplam çalışan sayısı değişemez.

Bunun anlamı: Birisi onun yerini istiyorsa bir çalışanın birimini bırakmasına izin vereceğiz.

Örnek (kurgusal) istek verileri:

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

Yukarıdaki, çizilen: Yukarıdaki verilerin görselleştirilmesi

Kırmızı, mavi veya siyah seçenekler arasında nasıl seçim yapmamız gerektiğini gördünüz mü?

Asıl sorun biraz daha karmaşık, çünkü 27 birim ve 751 isteğimiz var. Lütfen görselleştirmeye bir göz atın

Amaç

Tüm talepleri topladıktan sonra, çoğu nasıl karşılanır?

Teori (?) Uygulaması

grafiğine sahip , her birimin bir V köşesi olmasına ve bir isteğin bir E kenarı olmasına izin verin.G(V,E)VE , başarılı bir alışveriş, yönlendirilmiş bir tüp şeklini alacaktır.

Her döngü yalnızca bir kez kullanmalıdır ( bir işçi ünitesini iki kez bırakamaz ), ancak birkaç kez V'yi ziyaret edebilir ( bir birim bırakmak isteyen birçok işçiye sahip olabilir ).EV

Soru

Bu sorun olarak ifade edilirse

"Birlikte, en çok paylaşılmayan kenarı yönlendirilmiş grafikte içeren çevrimleri nasıl bulabilirim?"

Talep edenlerin çoğunu tatmin edecek miyiz?

Bu doğru, bu optimal döngü setini bulmak için bir algoritma var?

Bu garip yaklaşım bu sorunu çözecek mi?

  1. en büyük yönlendirilmiş çevrimi bulun ;G
  2. Kenarlarını çıkarın ;G
  3. yönlendirilmiş bir döngü olmadıkça 1'i tekrarlayın ;G

Bana yardımcı olabilir misiniz?

Özgün sorunu tanımlamanın başka bir yolunu biliyor musunuz (talep edenlerin çoğunu mutlu etmek)?

Düzenleme : sorunu daha iyi tanımlamak için departmanı birime değiştirdi.


3
Aynı kenarı bir defadan fazla kullanmaktan kaçınmak istediğinizden emin misiniz ? Uygulama açıklamanızdan, aynı köşeyi bir kereden fazla kullanmaktan kaçınmanız gerektiğini ( ki bu daha güçlü bir durumdur) görünüyor.
Tsuyoshi Ito

3
@TsuyoshiIto: Anlatımdan anladığım gibi, koşul her köşede derecenin üstünlüğe eşit olması gerektiğidir. Bu nedenle, köşe ayrılığı gerekli değildir.
Yoshio Okamoto

7
Bu arada, eğer benim anlayışım doğruysa, polinom zamanında ağ akışı ile problem çözülebilir olmalıdır. Yani, bir kenar boyunca bir akış birimi için bir kâr birimi verirsek ve her kenarda bir birim kapasite verirsek, sorun maksimum kar dolaşımını bulmaktır.
Yoshio Okamoto 16

3
Bu gönderide , sorununuzun genelleştirilmesi tartışılmaktadır. Okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (her bir kişiyi işlem yapacak bir ürün, yani işe yerleştirme olarak düşünün).
Radu GRIGore

4
Müthiş soru, yaptığımız şeyin gerçekte gerçek hayatta kullanılabileceğini hissettiriyor :).
Gopi

Yanıtlar:


9

Tamam, TradeMaximizer kodunu okudum ve aşağıdaki, daha genel bir sorunu çözdüğüne inanıyorum.

SORUN: Verilen, yayları maliyeti olan yönlendirilmiş bir grafik. İlk önce kapsanan köşelerin sayısını en üst düzeye çıkaran ve toplam maliyeti en aza indiren bir tepe-ayrılma döngüsü kümesi bulun.

Sorusunu çözmek için, burada sorulan köşe çalışanı olmak ve bir yay çizmek yapmak zaman birim maliyeti x işini istiyoruz y . Çalışanların artık kenarlardan çok köşeler olduklarına dikkat edin. İşin güzel yanı bir çalışanın “Gerçekten işini istiyorum” diyebilmesi.xyxy, ama z'nin de yapmasını.yz

Çözüm:

  1. İki taraflı bir grafiği aşağıdaki gibi oluşturun: Orijinal grafikteki her köşe için bir sol köşe x L , sağ köşe x R ve bir yay ekleyinxxLxRmaliyeti büyük olan x Lx R (orijinal maliyetlerin toplamından daha büyük) grafik). Orijinal grafiktekiher bir ark x y için, bir ark x L → ekleyinxLxRxy, iki taraflı grafiğe y R ekleyin.xLyR

  2. İki taraflı grafikte minimum maliyetle mükemmel bir eşleşme bulun.

Orijinal grafiğin de önceden işlenmesi var: SCC'ler arasındaki yayları kaldırın, sonra tüm SCC'leri işleyin >1 yukarıda belirtilen .

(Aslında, TradeMaximizer, yukarıdaki iki kritere göre, en büyük döngünün uzunluğu gibi diğer şeyleri sezgisel olarak optimize etmek için tüm optimal çözümleri yineliyor. kişi fikrini değiştirir.)

Not: Yazar Chris Okasaki, blog yazısında kodun yaptığı şeyin bu olduğunu onayladı .


TradeMaximizer'ı kullanarak asıl soruna bir çözüm bulmayı başardım. Ben detais'i yarın göndereceğim.
motobói

@ motobói, fakat tek yapmanız gereken ikinci paragrafta yazdığım şey ...
Radu GRIGore

Algoritma hakkında şu açıklamayı buldum: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

Strong Comnected Components arasındaki yayları çıkarmak için neden gerekli olduğu konusunda bir açıklama yapabilir veya açıklayabilir misiniz?
motobói

@ motobói, Bu bir optimizasyon (ortalama durum için). (1) ve (2) adımları yeterli olmalıdır.
Radu GRIGore

22

11 . O zaman uygulanabilir bir dolaşım, kenar ayrık yönlendirmeli çevrimlerin toplamıdır (yani birleşme) ve dolaşımın maliyeti, kenar sayısının ihmal edilmesidir.

Tüm maliyetler ve kapasiteler sabitler tarafından sınırlandırıldığından, basit bir döngü iptal algoritması gerekli dolaşımı polinom zamanında bulacaktır. Bu neredeyse açık açgözlü algoritması ile aynıdır:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0EEO(VE2)

Bu bilinen en hızlı algoritma değil.


Bir kişinin birden fazla “birim” de çalışmak istemediği sürece bunun işe yaradığını mı düşünüyorsunuz? orijinal soru cümlelerini kullanarak. ancak insanlar birden fazla birimde çalışmak istiyorsa, bu soyutlamanın bozulduğundan şüpheleniliyor. OP problemi sadece bir birim olarak belirtti, fakat bu yapay olarak bana kısıtlayıcı geldi. [hangi insanın tek bir tercihi var ...?]
vzn

1
"Kişi" ve "birim" nedir? Bu grafiklerle ilgili bir soru.
Jeffε

Şaşırdım: Örneğim bu algoritma için bir sayaç örneği değil mi? C'yi seçtikten sonra, C_1 ve C_2 çevrimleri artık çevrim değildir (çünkü her çevrim bir ters kenara sahiptir); C tekrar kullanılmayacak çünkü kenarlarını ters çevirdikten sonra pozitif bir maliyeti var ve yeni bir döngü sunulmuyor. Aynı problemden mi bahsediyoruz? Sorunun matematiksel formülüne sahip olmayı çok isterdim.
FiB

3
Seçme (ve tersine çevrilmesi) sonra , kenarlarının kaldırma C tarafından paylaşılan C 1 ve C 2 yapraklı bir uzun yönlendirilmiş çevrim 'CCC1C2CCC1C2C=C1+C2C

görünüşe göre bir "birim" bir "departman" gibi bir şeydir ve kullanıcılar departmanlar arasındaki transfer taleplerini kaydediyor [departmanlardaki kesin pozisyonları değil]? FIBs diyagramı, birimler arasındaki isteklerin talep ettiği gibi köşeler ve kenarlar olarak birimleri göstermektedir. FiB-- kesin bir formülasyon temin etmek size kalmış gerçekten .. "sorunun matematiksel formülasyonunu sahip olmak isterdim" .. sen .. yarısındaydık görünmektedir
vzn

4

Bu açgözlü yaklaşım her zaman en iyi çözümü vermeyecektir.

Bir döngü düşünün ile N kenarlarıCn{(v1,v2),,(vn,v1)}C1C2n1C

CnC1C2

C1C22(n1)=2n2

n2 daha da kötü hırslı bir çözüm yapar çevrimleri.


-3

Bunu çözmek için muhtemelen bir grafik teorisi yolu / formülasyonu vardır, ancak bu problem bana tüm permütasyonların bazılarının reddedildiği ve diğerlerinin geçerli olduğu bir permütasyon problemi gibi geliyor. permütasyonlar çalışanlar ve pozisyonlar şirkette “pozisyonlar” dır. "kişi [x] pozisyonu [y] istiyor" şartlarına uymazsa bir izin reddedilir. Birim / borç / org sınırlarının ayrımı, bu durumda çözüm için biraz gereksiz görünmektedir.

Kısıtlı bu tür permütasyon problemi kolayca SAT (tatmin edilebilirlik) probleminin bir örneğine dönüştürülebilir. Boolean değişken atamaları çalışanları temsil eder ve kısıtlama cümleleri "person [x] pozisyon [y] istiyor" kısıtlamalarını temsil eder. Bunun yakınında klasik örnekler vardır; bunlar genellikle "oturma masası" problemi olarak adlandırılır, burada oturma pozisyonlarınız ve misafirleriniz vardır ve tüm konukların yan yana oturmak istememesi (veya bazı misafirlerin diğer konukların yanında oturmak istemesi gibi).

ve tabii ki, PC'de ve problem binlerce zorlu ise, yüzlerce kadar değişken ve cümlecik içeren oldukça büyük durumlar için karmaşık SAT çözücüleri var.

örneğin profesyonel bir referans için [1] ve sınıf içi bir egzersiz için [2]. Güvercinlerin güvercinlere tahsis edildiği SAT çevrelerinde iyi çalışılmış ve güvercinlerden daha fazla veya daha az delik bulunduğunuz "güvercin deliği sorunları" olarak bilinenlere yapısal bir benzerlik de var. Bu durumda, ancak güvercinler genellikle değiştirilebilir olarak görülür. Başka bir deyişle, yemek masası problemi, daha kısıtlı olan güvercin deliği problemi gibidir ve misafir / güvercinlerin tercihleri ​​vardır.

Elbette, bu tür problemler için, kısıtlamalara bağlı olarak cevabın “böyle bir kısıtlı çözüm bulunmadığını” unutmayın.

[1] yemek masası algoritması, crato tarafından

[2] CS402 princeton HW SAT

[3] Memnuniyet sorunu, wikipedia


Trademaximizer kullanarak permütasyon denedim. Bir çalışanını X ünitesini Y birimi için değiştirmek isteyen bir kullanıcı olarak ayarlayın . Ancak yazılım birden fazla kullanıcının aynı ürünü (birimini) almasına izin vermez. Her öğe benzersiz olmalı. Buna
uymak
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.