Iş zamanlama sorunu

3 Cevap php

Ben otomatik olarak dönen bir programa üyeleri için işleri planlamak için gereken bir uygulama üzerinde çalışıyorum. Ben kuralları açıklayan çok iyi değilim, bu nedenle burada yardım için bazı veriler var:

Positions: A job title, with rules such as Mondays and Wednesdays weekly.
Categories: A set of positions
Groups: Another set of positions. Positions in the same group cannot be assigned on the same day
Members: Users assigned to positions on a given date.

Ayın her bir tarih için, üyeler (artan hem de) pozisyonlara atanır. Bir üye bir kategoride bir konuma, aynı kategoride bir pozisyon gelir sonraki zaman, alfabetik bir sonraki üyesi (veya listenin başında) atanmış ise örneğin atanır.

Members: M1, M2, M3, M4
Positions in Category C1: P1, P2, P3
Members in Position P1: M1, M2, M3, M4
Members in Position P2: M1, M2, M3
Members in Position P2: M1, M3, M4

M1, P1 için atanmış ise P2 sonraki gelirse, M2 atanacaktır. Karmaşıklık ek bir katman aşağıdaki P3 yerine gelirse, M3 atanır yere sokulur. Sistem M2 'atlanır' ve 'çok atlanır olduğunda bu ek karmaşık hale gelir (eğer varsa, o zaman bir sonraki M4 atamak, ya da M2 kullanılabilir bir konuma gelene kadar bekleyin sonraki M2 atamak olduğu gerçeği takip etmek için vardır 'üyeleri).

O bu tarihte geçerli olmayacaktır belirtti eğer bir üye de atlanır. Sistem nasılsa onlar gelip onları tanımlamak ve sonra listedeki bir sonraki mantıksal kişiye atlamak, Atlanan üyeleri öncelik gerekiyor. Atlama nedeniyle de tarih çatışmalar gruplar için de geçerlidir.

Zaten ben artık her adımı açıklayan içinde bir sürü yorum var olsa bile anlamak geçici [ve dağınık] çözüm var. Onun zayıflıkları atlanan üyeleri ile ilgili bulunmaktadır.

Eğer kod gidiyor olsaydı bu bunu nasıl hakkında gitmek istiyorsunuz? PHP bu uygulama yaşıyorum ama yalancı de çalışmak.

3 Cevap

My solution: You need a PriorityQueue (which is available in PHP under SplPriorityQueue). The PriorityQueue gives you elements with descending priority (sorted by values, the smallest value has the highest priority).

Each member gets an assigned value. This value is an ASCII number with n digits (you could use 8 digits for convenience), filled up with zeroes to n positions. After that you append the name. You also add to each member the available positions

Bu nedenle (n = 5):

  • M1 değeri: 99999Albert P1, P2, P3
  • M2 değeri: 99999Susi P1, P2
  • M3 değeri: 99999Bob P1, P3

Bu kolay öncelik ve ismiyle üyeleri sıralamak için yapar.

Hazırlama:

A sunny day. You are retrieving the assigned positions and a category for a given day. Each member is loaded on a long list. Each member who is not showing up on work is not loaded, but gets his value decreased by minus two. Bob is not here, so its new value gets 99997Bob. This means that Bob will be selected automatically the next time. All other members get their value decreased by minus one.

Belirli bir gün için atanan pozisyonları (SplObjectStorage kullanın) eşleştirilir:

P1->M1,M2,M3,M4 etc. P2-> etc.

The map contains only the positions which must be assigned this day. After the

Filter: You must look up the groups and delete any positions on the map which cannot be assigned this day. Your group description is a bit unclear.

Ata:

  • Sen atamak pozisyonunu seçin
  • Pozisyonu doldurmak için üyelerin listesini alın
  • Listeden mevcut üye çıkarma ve PriorityQueue koydu
  • Assign the position by extract() from PriorityQueue (correct assignment is done automaticially). Each member which is assigned will gets its value increased by one (So the decrease and increase levels out if you are here and working). If you are here and not assigned to a position for whatever reason, you get a small penalty of one. If you not here, you get a penalty of two.
  • After completion, put remaining members on the list again, clear the PQueue and continue with the next assignment.

Uyarılar:

  • Yeterince insan bir pozisyon için her zaman vardır dikkatli olmalıdır.

uff. ben size açıklama takip etmiyorum, ama benzer durumlarda ben bu tür bir sorunu çözmek için sql kullandık. Eğer php kullanarak eğer i mevcut sql var sanırım.

ne ben yapıyor öneririz tablolar kümesi içine bu bilgileri saklama yolunu bulma ve daha sonra sql sorgusu size istediğiniz cevabı verir ne çalışıyor. oldukça sık bir usul dilde daha sql yapmak çok basittir.

Atlanan kısmı için, örneğin, (uzun bir süre için atanmış değil insanı seçmek böylece) birisi atanan en son ne zaman kaydeder ve sonra bu tarafindan bir sütun olabilir. alternatif olarak, kaç kez o bir sütun ve sipariş olarak atlanır olabilir.

Anlayamadığım 'm' üyeleri ve 'n' pozisyon var olduğunu.

Kategori: pozisyonların bir grup - kategorisindeki bir konuma atanmış bir üye başka olamaz?

Grup: pozisyonların bir grup - aynı grupta pozisyonları farklı günlerde atanmalıdır.

Son bir şey, bir pozisyonu doldurabilirsiniz üyelerinin bir listesi vardır.

Görünümünde bir veri yapısı açısından bu baktığımızda, bir bağlantılı liste üyeleri koymak - Her üye nihayet atanmış olduğunu [pozisyonda, günün] ek bir liste olması vardır. Sonra, her bir pozisyon için, o pozisyonu doldurmak üyelerine referansların bir listesi var. Içeri olduğunu hangi kategoriler olarak bir pozisyon için başvurular başka bir liste gibi kategoriler uygulamak

Gerçek atama: = 0 bir gün sayacı var ve pozisyonlar üzerinden yineleme. Her pozisyon P için, doldurabilirsiniz üyeleri aracılığıyla yineleme. Bir üye M pozisyonu ise doldurabilirsiniz:

  • O P2 doldurdu herhangi bir pozisyon P. ile bir kategori paylaşmak değildir
  • O gün = daycounter ile P2 doldurdu herhangi bir pozisyon P. ile bir grup paylaşmak değildir

O pozisyonu doldurmak eğer, [pozisyon, gün] çifti üyesine eklenir, ve üyenin düğüm referansları gerekli bu yüzden (listenin sonuna taşınır - tüm başvuruları hala geçerli olsa düğüm) taşındı. Bu 'atlandı' üyeleri öncelik verilir sağlar ve ulaşamamış olan üyeler sonraki en yüksek öncelik verildi.

Bir pozisyon doldurulduktan sonra, bir sonraki pozisyona gidin. Pozisyon zaten atanmış bir konuma sahip bir grup paylaşırsa, olabildiğince her gün 1 gibi birçok pozisyonları atamak kadar tüm pozisyonlarda yineleme, atlayın. Ardından, gün sayacı artırmak ve 2 gün boyunca tekrarlayın. Bu size vermelidir tüm işler için bir maksimal atama (maksimum hakkında emin değilim).

İpucu: üye listesinin sonuna bir üyesi taşırken, listesinde geçiş sonuna kadar bir başvuru tutmak zorunda önlemek için - bir sonraki pozisyon için, sen zaten başından başlamak gerekir, bu yüzden geçiyor anlamı yok her şey.