Kruvasan almanın kimin sırası olduğunu öğrenin


9

Bir ekip, her sabah birisinin herkese kruvasan getirmesi gerektiğine karar verdi. Her seferinde aynı kişi olmamalı, bu yüzden bir sonraki sıranın kim olduğunu belirlemek için bir sistem olmalı. Bu sorunun amacı, yarın kruvasan getirmenin kimin sırası olacağına karar vermek için bir algoritma belirlemektir.

Kısıtlamalar, varsayımlar ve hedefler:

  • Kimin kruvasan getirmesi bir önceki öğleden sonra belirlenecek.
  • Herhangi bir günde, bazı insanlar yoktur. Algoritma o gün mevcut olacak birini seçmelidir. Tüm devamsızlıkların bir gün önceden bilindiğini varsayalım, böylece kruvasan alıcısı bir önceki öğleden sonra belirlenebilir.
  • Genel olarak, çoğu insan çoğu günlerde mevcuttur.
  • Adil olmak adına, herkes kruvasanları diğerlerinden daha fazla satın almalıdır. (Temel olarak, her ekip üyesinin kruvasanlara harcamak için aynı miktarda paraya sahip olduğunu varsayın.)
  • Bir listenin can sıkıntısını hafifletmek için bazı rastgele unsurlar veya en azından algılanan rasgelelik unsurlarına sahip olmak güzel olurdu. Bu zor bir kısıtlama değildir: daha çok estetik bir yargıdır. Ancak, aynı kişi arka arkaya iki kez seçilmemelidir.
  • Kruvasanları getiren kişi önceden bilmelidir. Bu yüzden P kişisi D gününde kruvasan getirecekse, bu gerçek P kişisinin bulunduğu önceki bir günde belirlenmelidir. Örneğin, kruvasan getirici her zaman bir gün önce belirlenirse, o zaman bir gün önce mevcut olanlardan biri olmalıdır.
  • Ekip üyesi sayısı, depolama ve bilgi işlem kaynaklarının etkin bir şekilde sınırsız olacağı kadar azdır. Örneğin, algoritma geçmişte kruvasanları kimin getirdiğine dair tam bir geçmişe dayanabilir. Her gün hızlı bir bilgisayarda birkaç dakikaya kadar hesaplama tamam olurdu.

Bu gerçek bir dünya probleminin bir modelidir, bu yüzden senaryonun daha iyi modellendiğini düşünüyorsanız, varsayımlara itiraz etmek veya düzeltmek için özgürsünüz.

Menşei: Florian Margaine tarafından kruvasanları kimin alacağını öğrenin . Buradaki reformlamamın biraz farklı gereksinimleri var.


1
Soru tam olarak neydi? İnsanların az çok aynı miktarda olmadığını varsayabilir miyiz? Bunu en az kez yapan kişiyi veya sadece rastgele bir kişiyi almanın nesi yanlış?
Pål GD

@ PålGD İnsanların yaklaşık olarak aynı miktarda bulunmadığını varsayarsak basitleştirici olur. İsterseniz yapın, ancak algoritmanız yarı zamanlı olarak çalışıyorsa, bu daha iyidir. Bunu en az kez yapan kişiyi almak bir çözümdür (bir gün önceden bildikleri gerekliliğine dikkat etse de, çözümü tamamen önemsiz yapmaz). Rastgele bir kişi de çalışabilir, ancak rastgele olma, sınırlamak isteyebileceğiniz adaletten sapma getirir.
Gilles 'SO- kötü olmayı kes'

Ne? Tükürük resmi yok mu? Fırına kaymak yerine matematik yaparak masamıza köle atmamızı mı istiyorsun ?
Caleb

@Gilles - FYI, P.SE üzerinde bu sorunun sürümüyle bir deneme yapıyor . Her iki site de biraz daha eski olduğuna göre, her topluluğun yanıtlarının nasıl şekillendiğini merak ediyorum.

Yanıtlar:


7

Bu tür bir sorunun farkında olduğum iki kategorisi vardır: yanlı piyangolar ve filtrelenmiş / üretilen rastgele diziler .

İlk olarak, durumu koruyamayan kolay ama yanlış çözümlerden vazgeçelim. Hiçbir durumu muhafaza etmeyen herhangi bir piyango tarzı çözüm, bir binom dağılımında "birçok kez" kriterini geçemeyen kazanç sayısına sahip olacaktır. Tüm insanları eşit olarak seçen rastgele bir dizi seçebilirsiniz (sadece listede dolaşmak; permütasyonlar rasgelelik sağlar), ancak insanlar tatile çıkmaya başladığında dizinizin delikleri vardır. Takip etmedikçe, kendinizi eşit efor sarf etmek yerine tekrar binom dağılımları ile bulacaksınız.

Ayrıca gerçek rastgelelik sahibi olmayı taahhüt edelim. Örneğin, bir kişi tatilini deterministik bir algoritma temelinde planlayamaz, böylece kruvasan satın alma sırası geldiğinde asla mevcut olmaz (sanırım tüm tatil günlerini tüketene kadar) .

Yani, iki tür çözüm üzerinde.

  1. Önyargılı bir piyango inşa etmek için, öncelikle piyangomuz için sayı üretmek üzere hemen hemen her sürekli dağılımdan (sonlu sapma ile) seçim yapabileceğimizi unutmayın . Kaybeden bu durumda en düşük numaraya sahip olan kişi olabilir. O zaman en basit önyargı, her bireyin payından daha fazla mı yoksa daha az mı satın aldığını takip etmektir. Önyargıyı kruvasan birimlerinde ölçebilirsiniz. Dağılımın genişliğini ve şeklini değiştirerek rasgelelik derecesini ayarlayabilirsiniz - bu, herhangi bir bireyin "aynı sayıda" dan ne kadar uzaklaşabileceğini de belirler. Gausslular kolaydır; çok uzun kuyruklar ("haksız") olmadan makul bir sürpriz sağlar. Çözümün temel şekli (Scala kodunda)

    case class Employee(var bias: Double) {
      def eat         { bias -= 1 }
      def buy(n: Int) { bias += n }
      def roll        = bias + stdev * Random.nextGaussian
    }
    

    En son kimin satın aldığını takip edebilir ve onlara 10*stdev, tatil yapısının herkesin "son" zaman satın almasına izin verdiği uç durumda tasarruf ederek insanların arka arkaya iki kez satın almalarını önlemek için büyük bir önyargı bonusu verebilirsiniz . (yani satın alırsınız, sonra tatile çıkarsınız.) Aynı gün seçildikleri günde bulunmamakla aynı şeydir. (Eğer birisi her gün eksikse , sonunda önyargı bonuslarından yanarken ortaya çıkacak; Bunu bir hatadan ziyade bir özellik olarak görüyorum.)

    Böylece, mevcut çalışanlar listenizi gün boyunca toplar, hepsinin piyango için toplanmasını sağlar, en düşük olanı seçer ve günceller. Satın alma bonusunun çalışan sayısına eşit olup olmadığını seçebilirsiniz (maliyet göz ardı edilebilir, ancak kruvasan alma gezisi külfetlidir), mevcut çalışan sayısı (yolculuk kolay ise, ancak maliyet külfetlidir) ) veya aralarında bir şey (her iki yükü de kabul etmek için). Muhtemelen mevcut insanlar için "yemek" cezasına sahip olmak daha iyidir, ancak sadece tatilde olmanın size daha az doğru bir adım vermediğini düşünüyorsanız, her iki şekilde de yapabilirsiniz.

  2. Filtrelenmiş rastgele bir dizi oluşturmak için, önce rastgele bir dizi oluşturmanız gerekir. Çalışanların bir listesini karıştırmak, başlamak için iyi bir yoldur. Sadece listeyi gün be gün sırayla gözden geçirin. Birisi olmadığı için satın alamazsa veya daha önce söylenemez veya satın alınamazsa, bunları atlayın. Artık bir sorununuz var: atlanan insanları biriktiriyorsunuz. Yine de, sorun değil. Sıralamanızın sonuna geldiğinizde, karıştırmadan önce atlanan çalışanların listesini tam listeye ekleyin. Şimdi ortaya çıkma olasılığı, "aynı sayıda" özelliğini koruyan kaç kez atladığınızla orantılıdır.

    Standart bir shuffle kullanırsanız, tatil olmadığında rastgelelığı ölçmek de özellikle kolaydır. İnsanları tamamen rastgele seçtiyseniz, bir sonraki kimin getireceği bilgisi aşağıdakileri içerir:log2(N) varsa bilgi parçaları Nçalışanlar. Ancak bunun yerine yalnızcaN! onun yerine NN olası dizilere izin verilir, böylece bilgi log2[(N!NN)1/N]1log(2)+log22π/NN1.4 bit (büyük için N; içinN=10 onun  1.14).

Şahsen ben rastlantısallık üzerindeki kontrol daha iyi olduğu için taraflı piyango çözümünü tercih ediyorum. Filtrelenmiş dizilerle, diziler oluşturmak için daha karmaşık yollar bulabilirsiniz. Örneğin, rastgele bir permütasyon almak yerine, belirli bir mesafeye kadar yerel takaslar gerçekleştirin veya insanların havuzdan tamamen değiştirilmesine izin verin (ancak atlananlar listesine girerler) - ancak bunlar daha fazla algoritmik çaba gerektirir. Piyango ile sadece standart sapmayı ayarlarsınız.


4

İzin Vermek {P1,...,Pn}kruvasan baytlarının seti olun. İzin Vermekvik1 tarafından harcanan miktar Pi güne kadar kruvasan üzerinde k(kruvasan sevgilimiz için yeterince akıllı görünmeyen, mevcut halk sayısı ne olursa olsun, her zaman aynı parayı harcarsa, kruvasan satın alma sayısı olabilir); 1 başlatma ve bölme işleminden kaçınmak içindir. 0.

Bazı parametreler için l, İzin Vermek vk=i=1n(vik)l.

Günde k, ertesi günün kruvasan alıcısını seçerek rastgele bir değişken fırlatarak i olasılıkla 1(vik)lvk. Seçilen kişi burada değilse (bugün veya ertesi gün), uygun olanı bulana kadar madeni parayı tekrar atarlar (var olur, çünkü çoğunlukla her gün buradalar ...).

Ve bunu öğrenene kadar mutlu yaşadılar P1, korkak, orada, ikiden sadece bir gün geçti ve bu yüzden asla kruvasan satın almadın!

Biraz düşünmeden sonra (ve üzerinde biraz işkence olabilir) P1 böylece ödemeden yediği kruvasanı iade eder) algoritmalarını değiştirir.

Her gün ödedikleri kruvasanın ortalama fiyatını hesaplarlar ve çağırırlar v.

İlk gün, gelecek günler için alıcıların planlamasını hesaplarlar. Bunu yapmak için daha önce olduğu gibi rastgele değişken ile yaparlar vevik günde ödemesi gereken bedele göre k, yani ekleme vher defasında fırıncıya gitmeyi planlıyorlar. Zeki olduklarından ve çok fazla ödemek istemedikleri için, gün içinde gerçekten ne kadar ödediklerini de hatırlıyorlar.k planlamayı güncelleyecekleri zaman kimse cezalandırılmaz.

Her plana kadar Pi gelecekte kruvasan satın alması gereken bir tarihi var.

Eğer Pi günde kruvasan alması planlandı k+1 ama o gün yapamayacağını açıklar k (ya da ısınmamışsa), ertesi gün hiçbir yükümlülüğü olmayan mevcut birisine yerini verir; Pj ve bir sonraki dönüşünü yapar Pj.

İlk gün Pi gelecekte kruvasan almayı planlamıyorsa, planlarını uzatıyorlar (rastgele değişken ile vik ödeyecekleri gerçek tutar ve planlanan tutar) güncellenir).

Ve bu sonsuza kadar gittiğinde, kruvasan fiyatını eşit olarak paylaşarak mutlu yaşarlar.

Fakat P1mutlu değil. Gerçekten, o seçilmiş olduğunu düşünüyorumlçok küçük ve bu yüzden üst üste iki kez ödeme olasılığı çok büyük. Her neyse ... Diğerleri seçmesine izin verdilistediği kadar büyük. Huysuz ama aptal olmadığı için seçtil=k büyük ödeyenler ve küçük oyuncular arasındaki oran büyük görünmese de zaman geçtikçe l vurgulama eğilimindedir.

yine P1 o kadar mutlu değil, o günün sadece yarısı (kruvasanın yarısı kadar) var ve o kadar ödemek zorunda P2her gün burada. Haksız!

Ama huysuz bıktıkları için P1, kovalarlar. Ama başlarının köşesinde halavik ne ödedikleri ve ne yedikleri arasındaki fark (pozitif değerler elde etmek için normalize edilmiş) ama çok tembel ve kruvasanlarla dolu.

Ps: Kötü İngilizce için özür dilerim ama anadili konuşmuyorum ve geç oldu ... lütfen hataları düzeltmekten çekinmeyin (ve hikayeye baharat ekleyin ...)


2

Sahip olduğunuz her yineleme

  • Mevcut ve satın alınabilecek kişilerin listesi
  • Önceki alıcı

Listedeki kişiler arasında rastgele bir kişiyi seçer ve önceki alıcıyı hariç tutarsanız hedeflerinize ulaşırsınız:

  1. Minimum kullandığımız için algoritma "maksimum" rastgeleÖnceki yinelemeden bilgi miktarını rastgele.
  2. Ortalama insanlar, algoritmayı mümkün olduğunca adil hale getiren bir ekstraksiyona her katıldıklarında (N / (N-1)) kruvasanlar için ödeme yaparlar.
  3. Bunu en üst düzeyde rasgele yapmak için tekrarlama kuralını ortadan kaldırmayı öneririm.

Önerilen gördüğüm diğer algoritmalar daha az rastgele veya daha az adil:

  1. "Güverte shuffle" algoritmaları, ödeme yapma olasılığının sabit olmadığı (ilk seçimde 1 / N, ikinci seçimde 1 / (N-1) olmadığı anlamında gerçekten rastgele değildir ... Nth seçiminde 1 - - henüz seçilmediyse). Ayrıca, ilk olarak seçildiyseniz, sonraki N kez seçilme şansınız tam olarak sıfırdır. Sistem, toplanana kadar nadiren ve sonra sürekli olarak girilerek kolayca kırılır.

  2. Rastgele sayıların özelliklerine güvenmek yerine herkesin aynı sayıda kruvasan almasını sağlamaya çalışan "Telafi edici" algoritmalar rastgele veya adil (veya her ikisi) olamaz.


İle N insanlar ve m Günde ortalama çalışan çalışanlar, sayısındaki sapma yaklaşık olarak N/m. Asla daha fazla sapmayan çözümler var olduğundan1, bu "adil" nin garip bir tanımıdır (özellikle "defalarca" olarak belirtildiği için).
Rex Kerr

Ntabii ki insanlar değil.
Rex Kerr

@RexKerr neden çalışanlardan daha fazla kruvasan satın alsın?
Sklivvz

Kafam karıştı. Nerede olmasını önerdim?
Rex Kerr
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.