Görev atama


10

İşçilerin örneğin duvar inşa etmekle görevlendirildiği bir RTS'de, işçiler hangi duvarları inşa edeceklerine nasıl karar verir?

Oyuncu, hangi duvarların nereye inşa edileceğine karar verir, ancak bireysel işçileri bireysel duvar meydanlarına atamaz. Birçok RTS oyununda, işçiler sadece kendilerine yakın görevler yaparlar, ancak RTS'imde belirli karelerdeki açık görevlerin stratejik işlerini ana strateji olarak kullanmak istiyorum, bu yüzden aptal işçilerin bir yerde kümelenmesini ve görevleri daha fazla bırakmasını istemiyorum uzakta yapılmadı.

Örnek bina duvarını kullanıyorum; madencilik taşı olabilir, bir yol yapabilir, odun toplayabilir ya da her neyse. Anahtar şey kullanıcı nerede seçer, ama kim değil.

Çalışanlar yalnızca erişilebilir karelere bitişik karelerde çalışabilir; kendi başlarına çalıştıkları kareler, iş tamamlanana kadar geçilmez olabilir.

resim açıklamasını buraya girin

İşçi 1 ve 2'ye A, B, C ve D karelerini çıkarmaları söylenir.

Oyun işareti başına bir kare taşıyabilirler ve bir kare madenciliği 10 keneyi alır.

Hangi işçinin hangi kareyi mayınladığına nasıl karar veriyorsunuz?

Görünüşe göre 1'in A ve 2'nin C benim olması gerekir.

1, A'dan 4 karedir, bu nedenle 14 kenede madenciliği bitirmiş olacaksınız. 1 nereye gitmeli ve neden?

Peki ya doğrudan B'nin üzerine çıkarılacak başka bir kare - E - olsaydı?

Bir çalışanın bir sonraki adımda nereye gideceğine karar vermek için kullandığı mantık nedir?


Şansımı SO yerine deneyeceğim: stackoverflow.com/questions/18634701/assigning-worker-tasks - eğer bir mod kapatmak / silmek kadar nazik olabilirse?
Will

1
Çapraz gönderi iyi bir şey değildir. Burada yaptığınız, aşağıda size cevap veren herkesin zamanını boşa harcıyor. SE sitelerini kullanmanın çok bencil bir yolu.
MichaelHouse

Yanıtlar:


6

Kaynak düğümünü meşgul olarak işaretleyin veya bir ağacın kullanabileceği işçi sayısını sınırlayın. Belirli bir noktada toplanmak için bir iş atanmışsa, onlara gerçekten söylediğiniz şey, mevcut en yakın ağacı hasat etmektir.

Bunun için iki ana yol: Gerçekçi bir yaklaşım, kaynak no'larını gelmeden önce değerlendirmek ve işaretlemek olacaktır. Garip kuyruk sorunlarını önlemek için, işçilere ağaçları değerlendirmek için bir vizyon aralığı verin. Bu, işçinin yamaya yürürken belirli bir kaynak düğümüne yaklaşmasını sağlar. Bu, optimizasyon hakkında sınırlı bir bilgi verir.

Bununla birlikte, birçok RTS'nin (SC ve SC2) işçilerin gelene kadar bir düğümü değerlendirmelerini sağlamaz. Bu, işçileri bir kaynak düğümü bulunana kadar dolaşmaya yönlendirir. Bu, daha fazla beceri / optimizasyon ödülüne izin verir, (Hiç harika işçi bölmeleri görüyor musunuz?) Ancak, oyuncularınızın çoğu sadece hepsini kutuya koyacak, tıklayacak ve hepsinin önce aynı yere gitmesinden rahatsız olacak.

Kesin uygulama, kaynakların nasıl gruplandığına bağlı olarak değişecektir. AoE'de ağaçlar ve balıklar sürekli genişlemelerdir, bu nedenle toplayıcılar oyun ilerledikçe oldukça uzakta olabilirler. Ancak SC ve Red Alert gibi oyunlarda kaynaklar ayrı yamalarda bulunur. Yani bir işçi sadece o yamanın etrafına bakmak zorundadır.

Düzenlemenizden sonra DÜZENLE: İşçi verimsizlikleri üzerinde fazla durmayın. Düşünebildiğim herhangi bir RTS'nin çalışan yetersizlikleri var. İşçi bölünmeleri gibi şeyler, oyuncunun işçilerini yönetmede oyundan daha iyi olmasından kaynaklanır. Bence tasarımcılara değil, programcılara bakış açısı alıyor olabilirsiniz. Tekli kene sol sorunu sadece sayıları değiştirerek ve düğümlerin ayrı sayıda gezide harmanlanabilir olmasıyla çözülebilir. İşçi verimsizlikleri size göze çarpıyor, çünkü arkasındaki sistemi biliyorsunuz. Ancak, oyun testçileriniz fark etmezse, çok uzun yaşamayın.


Soruyu, RTS'mde oyuncunun hangi kaynak döşemelerini hasat edeceğine ve her bir işçinin görev türüne karar verdiğini açıklığa kavuşturmak için düzenledim, ancak hangi işçinin nereye gittiğini mikro yönetmek zorunda olmamalı.
Will

Evet, oyunum belki de atipiktir, çünkü kullanıcının hangi karoları hasat edeceğini ve bunun için çok stratejik olmasını isterim. Ancak kullanıcının görevi yerine getirmek için bireysel işçilere mikro görev yapmasını istemiyorum. Soruya bir örnek ekledim.
Will

2

Çözüm ve düşünce:

Çözüm: Tıklatıldığında toplama düğümlerinin bir kuyruğa yerleştirilmesini sağlayabilirsiniz, daha sonra bir iş kuyruğun üstüne yükseldikçe, işçiler için ağırlıklı görev kuyruğu değerini bulun ve ardından en iyi ağırlıklı görev kuyruğu değerine sahip en yakın komşuyu bulun ( sıra değeri).

Örneğinizde, en uygun kuyruk değerine 0 sahip olabilirsiniz (geçerli görevleri içermez). Seyahat etmeleri gereken her karenin sıra değerine 1 ve her görev için 10 (görevi yapma zamanı) ekleyin. Geçen her bir birim için her bir işçinin kuyruk değerinden 1 değerini kaldırın (başlangıç ​​kuyruk değeri 10 ise, 3 birim süreden sonra kuyruk değeri 7 olur). Sonra bu görevi yapması gereken işçiyi bulmak için en yakın komşuyu (birden fazla çalışanın eşdeğer kuyruk değerlerine sahip olması durumunda) bulabilirsiniz.

Örneğiniz için, toplama düğümlerinin görev kuyruğundan alfabetik sırayla (AD) açıldığını ve kuyruk açıldığında hiçbir hareket yapılmadığını varsayarak:

(values in format [total] = [preexisting value] + [current task distance])
A Pops: 
    queue value of 1: 4 = 0 + 4 
    queue value of 2: 19 = 0 + 19
    Assigned to 1.
B Pops:
    queue value of 1: 24 = 14 + 10 (distance to B from A) 
    queue value of 2: 9 = 0 + 9
    Assigned to 2.
C Pops:
    queue value of 1: 25 = 14 + 11
    queue value of 2: 20 = 19 + 1 
    Assigned to 2.
D Pops:
    queue value of 1: 36 = 25 + 11
    queue value of 2: 41 = 20 + 21
    Assigned to 1.

Böyle yapmanın dezavantajı: son derece hesaplamalı.


Düşünce:

Oyununuz kaynaklar tarafından engellenmeyi nasıl başaracak? yani her düğümün bir kaynak olduğu bir 4x4 ızgara varsa, çalışanlar iç 4 düğümü alabilir mi? Değilse, işçilerin orada onları almaya çalışırken sadece boşta kalmadığından emin olun, belki onlara farklı bir görev atayın ve dış düğüm tamamlandıktan sonra dış düğümlerden birini toplayan işçilerden birini atayın (koy işçi için bir görev kuyruğunda).


evet, kaynağın bazı karelerine (geçici olarak) erişilemeyebilir.
Will

1

bir ağırlık sistemine sahip olmayı deneyin, eğer ağaç toplanıyorsa, bir çeşit istif cezası ve ayrıca bir çeşit mesafe bonusu hesaplayın. (A-> B noktasından tahta vb. ile gitmek ne kadar sürer. o zaman en yakın ahşabı kontrol eden ve ağırlığını kontrol eden ve daha sonra ve sonra en düşük ağırlığa sahip olanı kullanın.

tabii ki bu biraz ince ayar gerektirir. ama fikir basit.


1

Her işin a) önemi b) atama durumu (atanan işçi sayısı) olmalıdır

Daha sonra bir işçi, ona her seferinde en çok "ödül" veren işi seçebilir. Ödülün önemi, tayin edilen işçi sayısının yatırım yapması gereken zamana (yürüme ve işi yapma) bölünmesiyle hesaplanır. İşçiniz işlerde uzmanlaşabilirse (örn. Odun kesimi), aslında verimli bir şekilde yapabilecekleri görevleri tercih edecektir. İşler elbette ancak doğru zamanda devam edilebilecekse atanmalıdır (örn. İhtiyaç duyulan kaynaklar mevcut olmalıdır).

Bazı işlerin uzun süre geri alınmasını önlemek için (örneğin uzak olduğu için). Önem zamanla artmalıdır. Hasat durumunda, bu tür kaynakların şu anda ne kadar kullanılabilir / ihtiyaç duyulduğuna da bağlı olmalıdır (örneğin, üretilen birimlerin bir verme döneminde talep edilen birime bölünmesi).

İşçilerin işlerini hızlı bir şekilde değiştirmelerini önlemek için, ödülün önemli ölçüde daha iyi hale gelmesi durumunda (belirli bir eşik ile) mevcut işlerini değiştirmelerine izin verin. Ayrıca, zaman başına ödül değerlerini hesaplarken işe ilk yürüme için iki katına çıkmış maliyetleri uygulayabilirsiniz. Ayrıca, işçilere en iyi işi aynı anda değil birbiri ardına yeniden hesaplamalısınız.

Ayrıca, hesaplanan ödüllere biraz rastgelelik ekleyin. Bu, işçilerin farklı işlere daha iyi dağıtılmasına neden olacaktır (bu şekilde sadece "hepsi" aynı işi yapmazlar). Ancak, bu etki, bir işçi için bir sonraki en uygun işi seri olarak yeniden hesaplayarak ve halihazırda atanan işçi sayısını uyarlayarak azalır (aynı işte daha fazla işçi beklenen ödülü azaltır).

İşleriniz yalnızca bir çalışana atanabiliyorsa, algoritmanın biraz uyarlanması gerekebilir. Bu durumda aşağıdakileri yapın: Bir işçi, zaman başına en yüksek ödülle işi seçer (önem, ihtiyaç duyulan bireysel zamana bölünür). Başka bir işçi aynı işi her defasında daha yüksek bir ödülle yapabilirse, o anda atanan işçiyi başlatır. Yeni "işsiz" işçi daha sonra başka bir iş bulmaya çalışır. Örneğinizde bu şöyle olabilir:

  • "C" nin önemi büyüktür. Ve işçi 1 kendini daha da uzaktayken bile "C" ye atar.
  • Sonraki işçi 2 atanır ve her seferinde "C" (daha az yürüme) için daha yüksek bir ödüle sahiptir. Bu yüzden işçi 1'i işten çıkarır ve kendisini "C" ye atar. Hala aynı simülasyon zamanı diliminde olduğumuz için bu zamana mal olmadı. Böylece kullanıcı bu görevin yeniden atanmasını görmeyecektir.
  • İşçi 1 daha sonra başka bir iş arıyor. İşçi 1, işçi 2'yi "C" den çıkarmaz, çünkü zaman başına ödülü daha iyi değildir. Böylece "A" ya da "B" ye atanır (önemine bağlı olarak). Yine, bu hala aynı simülasyon zaman dilimi içinde.
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.