Nasıl ağırlıklı 'kullanıcı' rastgele ama oldukça PHP kullanarak bir listeden 'takımlar' oluşturabilirim?

3 Cevap php

Ne elde etmek umuyorum kullanıcıların 'ekipleri' oluşturmak için yeteneğidir. Ben (75.23 gibi ondalık beceri ağırlık) erkeklerin x miktarı, ağırlıklı olması ve kadınların y miktarı (aynı zamanda bir beceri ağırlık değeri ile) olacaktır.

Kullanıcıların bu liste önüne alındığında, o zaman (6 ekipleri, diyelim) yapmak girişi için ekiplerin sayısını alacaktı. Sonra, ben x'lerin ve y adlı listesinde geçmesi ve iyi ortalama mümkün ağırlıklı ekipleri oluşturulur, böylece onları organize. Ben ekipleri dengeli tutmak istiyorum (kadın ve erkek oranı)

Ben 'yığılmış' ekipleri, (bir takım iyi vasıflı) istemiyorum. Ben ağırlık eşit dağılımını istiyorum.

PHP bunu başarmak nasıl meraklı? Ben ağırlık değerleri ile kullanıcılara almak için bir MySQL veritabanı kullanarak olurdu. Ben oluşturmak istiyorum kaç ekipleri de, öncesinde ben olurdu kaç kullanıcıların zaman bilemez.

Herkes bu gibi benzer bir şey buldum eğer ben herhangi bir öneri ya da bir çözüm bağlantıları seviniriz. Ben sadece bir matematik dehası değilim, ben burada geçerli olacağını formül bilmiyorum.

Teşekkürler. Ben herhangi bir giriş takdir!

EDIT

Cevapları inceledikten sonra, belki ben yeterince açık değildi, bu yüzden umarım bu biraz daha yardımcı olur.

  1. Ben ekipleri kabaca eşit büyüklükte olmak istiyorum
  2. Ben her takım için ortalama (ortalama) beceri puanı kabaca eşit olmak istiyorum
  3. Ben her takımda erkeklerin kadınlara oranı (bölünme, bir dağıtım olsun eğer 5 erkek ve takım başına 3 kadın, ben kabaca aynı olduğunu tutmak istiyorum, demek ki) kabaca eşit olmak istiyorum. Gerçekten bir sorun değil ben ilk erkek sıralamak ve kadınların ikinci (veya mengene-versa) eğer.
  4. Ben (vb .. takım 1 yüksek alır, takımı 2, sn yüksek, ekip 3) doğrusal bir yaklaşım istemiyoruz. (6 takımlar varsa) daha sonra 6 kişi ve rastgele ve doğrusal bir moda yoluyla dağıtılması alarak Tim'in yöntem gayet iyi iş gibi görünüyor.

3 Cevap

I entirely Burada sonra ne konum açık değilim, ben size soruyor anlamak ne recap olacak. Bu doğru değilse, sizin sorunuzu düzenleyerek ihtiyaçlarınızı açıklayabiliriz:

Siz erkeklerin belirli sayıda bir listesini ve kadınların belli bir dizi var. Her kişi bilinen bir beceri puan var. Sen, aşağıdaki amaçlarla, takımların belli bir sayıda içine bu bölmek istiyorum:

  • Eğer ekipleri kabaca eşit büyüklükte olmak istiyorum
  • Her takım için ortalama (ortalama) beceri puanı kabaca eşit olmak istiyorum
  • Her takımda erkeklerin kadınlara oranının kabaca eşit olmak istiyorum

Bunu başarmak için basit bir yöntem olacağını düşündüm olurdu:

  1. Beceri puan azalan tüm erkeklerin bir listesini oluşturun.
  2. Beceri puan azalan tüm kadınların bir listesini oluşturun.
  3. Erkek listesinin sonuna kadınların listesi.
  4. Kombine listenin başında başlar ve bir yuvarlak robin moda bir takım sırayla her kişi tahsis. (Yani, demek bir numara, iki numara ekip ikinci ekip ilk kişi tahsis ve böylece size oluşturmak istediğiniz her takım için bir kişi tahsis kadar. Ardından insanlar ayrılırken, takımı biriyle yeniden başlamak için böylece sırayla, ve her takım için.)

Bu yaklaşım ile, aşağıdaki sonuçları garantili olacak:

  • Mümkünse (takımların sayısı halkının toplam sayısını bölen varsa yani), ekipleri tüm insanların aynı sayıda sahip olacak.
  • Ekipleri aynı boyutta değilse, büyük takım küçük takım daha tam olarak bir kişi daha olacak.
  • Mümkünse ekipleri tüm erkeklerin aynı sayıda sahip olacak.
  • Ekipleri erkeklerin aynı sayıda yoksa, en az erkekler takım daha tam olarak bir daha adam en erkeklerle ekip.
  • Mümkünse ekipleri tüm kadınların aynı sayıda sahip olacak.
  • Ekipleri kadınların aynı sayıda yoksa, en azından kadınlarla takım daha tam olarak bir daha adam çoğu kadın olan takım.
  • Her takım aralığının üstüne yakın gelen aralığının alt kısmına yakın, beceri bir puan aralığı ile erkek olacaktır.
  • Her takım aralığının en yakın gelen aralığın alt kısmında, beceri puan bir dizi kadınlar olacaktır.
  • Mantıklı verilerle (takım bir takım iki biraz daha yüksek bir puan ortalaması sahip olacak olmasına rağmen, ve böylece - bu düzeltilmesi yolu vardır), her takım için ortalama beceri puanı kabaca eşit olacaktır.

Bu basit yaklaşım gereksinimlerini karşılamak değilse, bize aklınızda başka ne vardı iletebilirsiniz.

Bu eşleştirme fazla iki unsurdan (bu (beceri ağırlık var ne farklı bir ağırlık olduğunu unutmayın) için, sadece bu "maksimum / minimum ağırlık mükemmel eşleme" benzer, yani bir bir ağırlık atamak eşleştirme (eşleşen önerilen bir 'takım' olurdu)).

(Örneğin, Edmond algoritması) üzerinde mükemmel bir eşleştirme için bilinen algoritmalar grup durum için adapte olmayabilir. Ben belki biraz benzetilmiş tavlama tekniği ya da basit bir genetik algoritma içine bakmak istiyorum.

If the number of people in each group (x,y) is relatively even, and the total number of people is relatively high random sampling should work quite well. See here on how to select random rows from a MySQL database: http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand

Hafif düzenleme, ben şahsen böyle bir şey yapmak istiyorum adaleti sağlamak için. Eğer takımın başına n üye istediğinizi bilmek demek. Sonra n yerel bir değişken oluşturmak * ortalama kişi başına ortalama beceri düzeyi olduğu anlamına gelir. Sonra rasgele seçerek ekip üyelerinin bu sınırı içinde bunu yaparken.

Örneğin

while(new random record){

if(team_skill+random person skill > n*mean){
 next;
}

if(team_skill+random person skill < n*mean && selected team members =n){
team + random person;
break;
}
}