Verimli Veriyolu Yüklemesi


10

Bu uzun zaman önce bir otobüs seyahat şirketi için yaptığım bir şeydi ve sonuçlardan hiç memnun kalmadım. Son zamanlarda bu eski projeyi düşünüyordum ve bu sorunu tekrar gözden geçireceğimi düşündüm.

Sorun:

Otobüs seyahat şirketinin farklı yolcu kapasitelerine sahip çeşitli otobüsleri vardır (örneğin 15 50 yolcu otobüsü, 25 30 yolcu otobüsü ... vb.). Çok büyük gruplara (grup başına 300+ yolcu) ulaşım sağlama konusunda uzmanlaştılar. Her grubun birlikte seyahat etmesi gerektiğinden, atıkları azaltmak için filolarını verimli bir şekilde yönetmeleri gerekiyordu.

Örneğin, 88 yolcuya üç adet 30 yolcu otobüsü (2 boş koltuk) iki 50 yolcu otobüsünden (12 boş koltuk) daha iyi hizmet veriyor. Başka bir örnekte, 75 yolcu bir 50 yolcu otobüsü ve bir 30 yolcu otobüsü, bir çeşit karışım tarafından daha iyi hizmet edecektir.

Bunu yapmak için iyi bir algoritma nedir?


3
Seçici olmamak, ancak otobüs şirketi açısından şüpheliyim, gaz masrafları 3 yerine sadece 2 otobüse gittiği için 2 50 yolcu otobüsü daha verimli olurdu.
Dunk

8
Bu NP-zor olan sırt çantası problemine benziyor . Uygulamada, belirli bir rota için arama alanınız oldukça küçük olmalıdır.
chrisaycock

@Dunk - Ben otobüs ve tur lojistik hakkında hiçbir fikrim yok olduğunu kabul etmek ilk olacak, ama bu oldu onların gereksinimi. Elle yapan yüksek ücretli bir danışman bile vardı.
System Down

Boş koltuklar önemsizdir, sayıları işletme masraflarıdır. Bu yüzden filosodadın cevabına bakın.
Loren Pechtel

@LorenPechtel - Daha önce söylediğim gibi, iş kurallarını dikte etmiyorum, sadece uyguluyorum.
System Down

Yanıtlar:


8

Bu, sırt çantası sorunuyla sıklıkla karıştırılan çöp kutusu paketleme probleminin bir örneğidir. Kutu ambalajında, belirli bir kapasitede çöp kutularınız var ve çeşitli boyutlardaki nesneleri kutulara dağıtmaya çalışıyorsunuz. Fikir, mümkün olan en az sayıda kutuyu kullanmaktır.

Çöp sayısını tam olarak en aza indirmeye çalışmıyorsunuz, ancak boş koltuk sayısını en aza indirmeye çalışıyorsunuz. Ve filodaki boş koltuk sayısını en aza indirmeye çalışıyorsunuz, yani çeşitli boyutlarda dört tur grubunuz var ve hepsini en az sayıda boş koltukla karşılamak istiyorsunuz. Yarasadan bir örnek düşünemiyorum, ancak bir filo ve bir grup tur grubu inşa etmenin mümkün olabileceğini hayal ediyorum, böylece bazı grup için standart dışı bir çözümle daha iyi olursunuz çünkü başka bir grup için daha da kötü bir çözüm kullanmak.

Daha da kötüleşiyor. Ya 20, 30 ve 50 yolcu otobüsünüz varsa. Her biri farklı miktarda yakıt kullanır, ancak bir 50'yi çalıştırmak 20 ve 30'u çalıştırmaktan daha etkilidir. Ancak tek ölçümüzden (en az boş koltuk sayısı), yolcu turu.

Ayrıca, 28 veya 39 gibi garip numaralara sahip otobüsler, kısayollarımızın çoğunu çarpıtır.

Yani, durumun karmaşıklığına bağlı olarak, iki şeyden birini yapabilirsiniz:

İlk ve kapsamlı arama ağacı: olası her otobüs kombinasyonunu kullanın. Yalnızca 3 veya 4 veri yolu boyutuna sahipseniz, bu muhtemelen makul bir çözümdür. Aksi takdirde, En uygun uyum azaltma gibi bir şey makul, ancak optimal değil sonuç verir.


Bu cevabın neden reddedildiğini hayal edemiyorum. Telafi etmek için yukarı oy. Aferin.
David Conrad

1

İşte Python'da hızlı ve kirli bir çözüm:

def add50(passengers, buses):
    proposed = buses + [50]
    if sum(proposed) < passengers:
        return add50(passengers, proposed)
    return proposed

def add30(passengers, buses):
    proposed = buses + [30]
    if sum(proposed) < passengers:
        proposed30 = add30(passengers, proposed)
        proposed50 = add50(passengers, proposed)
        return proposed30 if sum(proposed30) < sum(proposed50) else proposed50
    return proposed

print add30(88, [])
print add30(75, [])
print add30(105, [])

Ben koştuğumda, anladım:

[30, 30, 30]
[30, 50]
[30, 30, 50]

Kod olası senaryolarda önce derinlemesine arama yapıyor. Sipariş önemli olmadığı için ( [30, 50]aynı [50, 30]), yalnızca aynı boyutta veya daha büyük otobüsler ekleyerek arama alanını çok daha küçük hale getirebiliriz. Bu yüzden add30()arayabilirsin add50(), ama tam tersi değil.


0

Bunu müşteri açısından cevaplayacağım. Bu uygulama için sabit kodlanmış bir algoritma istemem. Zaman içinde değişebilen çok fazla değişken var. Otobüsleriniz hakkında hiçbir şey değişmese de, faktörlerin ağırlıkları değişebilir veya hiç düşünmediğim yeni faktörler keşfedilebilir (örneğin, fazla mesai, yasalar ve diğer sürücü maliyetleri).

Bu nedenle, istenen sayıda yolcu sayısına göre kendi arama masamı oluşturabilmek ve en iyi otobüs kombinasyonları için kendi ayarlarımı oluşturmak isterdim. Örnek: 31-50 = 1 X 50, 51-60 = 2 X 30. Bunun gerçekten hesaplanması gerekiyor mu? Koltukları, gazı ve sürücüleri çarpan bir grup formüle göre ayarları değiştirmek daha kolaydır. En iyi kombinasyonu bulun ve onunla yapın ve kullanıcının bu ayarları uygun gördüğü şekilde değiştirmesi için bolca alana sahip olun.

Yeni faktörler keşfedilebilir. Daha büyük otobüsler ücretli geçişlerde katlanarak daha yüksek bir ücret ödüyor mu? 30'dan fazla yolcunun otobüs sürücüleri için ekstra sertifika ve lisanslama için yeni bir yasa ortaya çıktığında küçük otobüsler için daha ucuz sürücüler alabilir miyim?

Formüllerinden farklı bir mantıkla yeni bir danışman işe alırlar ve uygulamanızın yeniden yazılması gerekebilir. Yani park etmenini hesaba katmak zorunda mısın?


Bu işe yaramaz: 31-50 = 50 koltuk otobüsü, başka gruplar için kullanılmadıkları veya hizmet dışı olmadıkları veya başka nedenlerle kullanılamadığı sürece. Sorudan gelen otobüs şirketi, 15 50 yolcu otobüsüyle aynı anda birden fazla müşteriye sahip olacak.
MSalters
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.