İş çizelgeleme problemi

oy
8

Ben otomatik dönen bir programa üyeleri için işler planlamak gerekir bir uygulama üzerinde çalışıyorum. Kuralları açıklayan çok iyi değilim, bu yüzden burada yardım için bazı veriler var:

Pozisyonlar: Böyle haftalık Pazartesi ve Çarşamba gibi kurallara Bir iş unvanı.
Kategoriler: pozisyonları kümesi
Grupları: pozisyonların başka kümesi. Aynı gruptaki Pozisyonlar aynı gün üzerinde atanamaz
belirli bir tarihte pozisyonlara atanmış kullanıcılar: Üyeleri.

ayda her gün için, üyelerin pozisyonları (hem artan düzende) atanır. Bir üyenin bir kategoride bir pozisyona atanmışsa, bir dahaki sefere aynı kategorideki bir pozisyon sonraki eleman alfabetik (veya listenin başında) örneğin atanır, çıkageldi.

M1, M2, M3, M4: Üye
Kategori C1 Pozisyonlar: P1, P2, P3
pozisyonu P1 Üyeleri: M1, M2, M3, M4
, M1, M2, M3: Pozisyon P2 üyeleri
pozisyonu P2 Üyeleri: M1, M3, M4

M1 P1 için atanmışsa P2 sonraki gelirse, M2 atanacaktır. P3 sonraki yerine gelirse, M3 atanır nerede karmaşıklık ek bir katman tanıtıldı. Sistem bu pek varken ayrıca karmaşık hale (M2 'atlanır' ve kullanılabilir, ardından bir sonraki M4 atamak ya da M2 kullanılabilir bir pozisyona gelene kadar bekleyin sonraki eğer M2 atamak gerçeği takip etmek için vardır 'atlanır ' üyeler).

o tarihte kullanılabilir olmayacak belirtti eğer bir üye de atlanır. sistemin bir şekilde, Atlanan üyeleri öncelik onlar gelip zaman onları tanımlamak ve sonra listedeki bir sonraki mantıksal kişiye atlamak gerekiyor. Atlama ayrıca tarih çatışmalar nedeniyle gruplar için de geçerlidir.

Zaten her adımı açıklayan içinde yorumların çok şey var gerçi ben artık bile anlamaya geçici [ve dağınık] çözümü var. Onun zayıf yönleri Atlanan üyeleri ile uğraşan içindedir.

Eğer kod gittiğini Eğer bu konuda nasıl gider? PHP bu uygulamaya ediyorum ama yalancı kod de çalışmak.

Oluştur 19/12/2009 saat 11:20
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

uff. sana açıklama uymayan, ancak benzer durumlarda ben bu tür sorunların çözümü 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 saklamak ve daha sonra sql sorgusu, istediğiniz cevabı verir çalışma dışarı bir yol bulmak olduğunu. Bir prosedürel dilde göre oldukça sık sql yapacak çok basittir.

Atlanan kısmı için, örneğin, bu bir kullanıcının geçen atandı zaman kaydeden sütunu ve sonra siparişi olabilir (eğer uzun süre tahsis edilmemiştir kişiyi seçmek, böylece). Zaman Bununla bir sütun ve sipariş olarak atlanır ve alternatif olarak, sayısı olabilir.

Cevap 19/12/2009 saat 13:09
kaynak kullanıcı

oy
6

Benim çözüm: (SplPriorityQueue altında PHP mevcuttur) bir PriorityQueue gerekir. PriorityQueue size inen öncelikli elemanları verir (değerlerine göre sıralanmadığından, en küçük değeri en yüksek önceliğe sahiptir).

Her üye atanan değer alır. Bu değer, n pozisyonlarına sıfır ile doldurdu n basamak (eğer kolaylık 8 basamak kullanabilirsiniz) ile bir ASCII sayıdır. Bundan sonra adını ekleyin. Ayrıca mevcut pozisyonları her üye eklemek

Yani (n = 5):

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

Bu sayede öncelik ve ada göre üyelere sıralamak mümkün kılar.

Hazırlık:

Güneşli bir gün. Belirli bir gün için atanan pozisyonları ve bir kategori alıyorsanız. Her üye, uzun listede yüklenir. çalışma görünmüyor Her üye yüklü değildir, ancak eksi ikiye onun değeri azalmış olur. Bob burada değil, yani yeni bir değer 99997Bob alır. Bunlar Bob otomatik olarak bir sonraki zaman seçileceği anlamına gelir. Diğer tüm üyeler değeri eksi bir azalma olsun.

Belirli Gün için atanmış pozisyonları (kullanım SplObjectStorage) eşlenir:

P1-> M1, M2, M3, M4 vb P2-> vb

haritası bu gün atanmalıdır sadece pozisyonları içerir. Sonra

Filtre: Sen grupları aramak ve bu gün atanamaz harita üzerinde bir konum silmeniz gerekir. Grubunuz açıklama biraz belirsizdir.

Atamak:

  • Sen atamak pozisyonunu seçmek
  • pozisyonu doldurmak için üye listesini alın
  • listeden mevcut üyeleri kaldırma ve PriorityQueue içine koydu
  • PriorityQueue özüt () ile pozisyon (doğru atama automaticially yapılır) düzenleme. irade atanır Her üye (burada ve çalışma olup olmadığını Yani daralma ve genişlemeler seviyeleri dışarı) bir birim artar değerini alır. Burada değil, sebebi ne olursa olsun bir pozisyona atanan iseniz, birinin küçük bir ceza olsun. burada sen ise, ikisinin bir ceza olsun.
  • Tamamlandıktan sonra, tekrar Listedeki kalan üyelerini koymak PQueue temizlemek ve bir sonraki atama işlemine devam edin.

Uyarılar:

  • Her zaman bir pozisyon için yeterli insanlar olduğunu dikkatli olmak gerekir.
Cevap 02/01/2010 saat 16:10
kaynak kullanıcı

oy
0

Anlayamadığım 'm' üyeleri ve 'n' pozisyonları vardır olduğunu.

Kategori: pozisyonların bir grup - Başka olamaz kategorisinde bir konum atanan üye?

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

Son bir şey, bir pozisyonu doldurmak olabileceği üye bir listesi vardır.

görünümünde bir veri yapısı açısından bu bakıldığında, bir bağlantılı liste üye koymak - her bir üye, son olarak atanmış olan [pozisyonda, gün] ek bir listesini elde etmek için yer alır. Sonra, her pozisyon için, o pozisyonu doldurmak olabilir üyelerine referansların bir listesi var. içinde bulunduğu kategorileri için bir pozisyon için referans başka bir liste gibi kategoriler uygulanması.

Gerçek ataması: günde bir sayaç = 0 olması, ve pozisyonları yineleyin. Her pozisyon P için, bunu doldurabilirsiniz üyeleri arasında yineleme. Bir üye M pozisyonu eğer doldurabilirsiniz:

  • O P2 doldurdu herhangi bir pozisyon P. bir kategori paylaşmaz
  • O gün P2 doldurdu herhangi bir pozisyon = daycounter P. ile bir grup paylaşmaz

tüm referanslar rağmen hala geçerlidir - o pozisyon, [pozisyonu gün] çifti üyesine eklenir ve üyenin düğümü (referanslar gerekli bu yüzden listenin END taşınır doldurabilirsiniz düğüm) taşındı. Bu üyeler en yüksek öncelik verilir ve sağlanamadığı üyeleri bir sonraki en yüksek öncelik verildi 'atlanır' olmasını sağlar.

Bir pozisyon doldurulur sonra, bir sonraki pozisyona geçin. pozisyon bir konumda zaten atanmış olan bir grup paylaşırsa Sonra 1. günde, gün sayacını arttırmak ve bu size vermelidir gün 2 için tekrarlayabilirsiniz kadar çok pozisyon atayabilirsiniz kadar bütün pozisyonlarda yineleme, atlayın tüm işler için bir maksimal atama (maksimum hakkında emin değilim).

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

Cevap 02/01/2010 saat 18:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more