Cada trabalho deve ter a) uma importância b) status de atribuição (número de trabalhadores designados)
Um trabalhador pode então decidir pelo trabalho que lhe dá mais "recompensa" por vez. A recompensa é calculada pela importância dividida pelo número de trabalhadores designados dividido pelo tempo que ele precisa investir (andando e fazendo o trabalho). Se o seu trabalhador puder se especializar em trabalhos (por exemplo, corte de madeira), ele realmente preferirá as tarefas que pode executar com eficiência. Obviamente, os trabalhos só devem ser atribuídos, se puderem ser continuados no momento certo (por exemplo, os recursos necessários devem estar disponíveis).
Para evitar que alguns trabalhos sejam desfeitos por muito tempo (por exemplo, porque estão longe). A importância deve aumentar com o tempo. No caso da colheita, a importância também deve depender de quantos recursos desse tipo estão disponíveis / necessários no momento (por exemplo, unidades produzidas divididas pela unidade solicitada em um determinado período).
Para evitar que os trabalhadores mudem seu trabalho rapidamente, deixe-os mudar apenas de emprego atual, se a recompensa melhorar significativamente (em um determinado limite). Além disso, você pode aplicar os custos dobrados para a caminhada inicial para o trabalho, ao calcular os valores da recompensa por tempo. Além disso, você deve permitir recalcular o trabalho ideal dos trabalhadores, um após o outro, não todos ao mesmo tempo.
Além disso, adicione alguma aleatoriedade às recompensas calculadas. Isso causará uma melhor distribuição dos trabalhadores para trabalhos diferentes (dessa forma, eles não apenas "todos" fazem o mesmo trabalho). Porém, esse efeito já é reduzido, recalculando em série o próximo trabalho ideal para um trabalhador e adaptando o número de trabalhadores já designados (mais trabalhadores no mesmo trabalho reduzem a recompensa esperada).
Talvez o algoritmo precise ser adaptado um pouco, se seus trabalhos puderem ser atribuídos apenas a um trabalhador. Se for esse o caso, faça o seguinte: Um trabalhador escolhe o trabalho com maior recompensa por tempo (importância dividida pelo tempo individual necessário). Se outro trabalhador puder fazer o mesmo trabalho com uma recompensa esperada mais alta por vez, ele inicia o trabalhador atualmente atribuído. O novo trabalhador "desempregado" tenta encontrar outro emprego. No seu exemplo, isso pode ser assim:
- "C" tem uma importância muito alta. E o trabalhador 1 se atribui a "C", mesmo que ele esteja mais longe.
- O trabalhador 2 é designado a seguir e tem uma recompensa mais alta por tempo para "C" (menos caminhada). Por isso, retira o trabalhador 1 do trabalho e se atribui a "C". Isso não custou tempo, pois ainda estamos no mesmo intervalo de simulação. Portanto, o usuário não verá essa reatribuição do trabalho.
- O trabalhador 1 está procurando outro emprego. O trabalhador 1 não inicia o trabalhador 2 de "C", pois sua recompensa por tempo não é melhor. Então ele é designado para "A" ou "B" (dependendo da importância). Novamente, isso ainda está no mesmo intervalo de tempo da simulação.