I am developing an application, which performs combinatorial function as described below. Could anyone point out a suitable algorithm (or direction)?
== Basic scheme: ==
There are fixed amount of slots (say air tickets), a few hundreds of workers, and a few dozens of jobs. Every time, a bunch of workers (the "crew") are sent to complete jobs. The number of workers sent are determined by the available slots. The crew must finish all appointed jobs by themselves.
Each job requires a combination of skills that were possessed by workers. Besides skills, some jobs may optionally require the worker to possess certain ability. Further, some of those jobs with ability requirements imposed as must-have.
Example:
- A worker, possesses the skill "software engineering", but lacks "maths" ability;
- There are 3 jobs that require "software engineering" skill;
- Job A is a simple programming job;
- Job B is a programming job involves basic "maths" processing, but since it's basic processing, "maths" ability is optional;
- Job C is a programming job involves advance "maths" processing, so the "maths" ability is a must.
We say:
- The worker fulfills Job A.
- The worker fulfills Job B, but not the best candidate. Any worker possess "software engineering" skill and "maths" ability is better candidate to the job;
- The worker cannot fulfill Job C, due to lack of "maths" ability.
On the server, calculation is done every night (or twice daily), to find out the best combination of workers to sent out:
- Can finish all jobs;
- No more than the available slots;
- (Optional) With least head count.
- (Optional) A crew list with highest rating;
- (Optional) Best score to head count ratio;
- (Optional) The algorithm should be portable to mobile platform.
== Update 2 ==
TL;DR;
The available slots is a constraint (relatively speaking, a constant), which confines the crew size we can sent out. After receiving a contract, the number of workers we'll be sending out is determined, hence the slot constraint. Theoretically, sending out less worker would be more profitable, and exceeding that may be an out-of-budget alarm.
The words "skill" and "ability" are similar in common concept. But they are two sets of factors to account for in this specific application, separately. These two words are actually come from the up-stream system, which generates the base data set. Maybe it's better put them as: "skill" could be accountants, programmers, etc. While "ability" could be "maths" as accountant & programmers both could possess maths ability; or "graphic" could be an ability of programmer who is making computer software like photo editors. These are well defined in the up-stream system.
While working on the program, before reaching this "combinatorial" portion, we have done some extra work on job & worker classifications. During job & worker classification, a few information is calculated and stored, and will be transferred to mobile device:
- Lists of suitable worker to each job are generated, and attached to job records;
- Each worker is given a "score", which is:
- the total number of jobs he/she can finish;
- plus the total number of jobs with optional ability requirements he/she can finish;
- plus the total number of jobs with must-have ability requirements he/she can finish.
At the time of computation, no worker is actually occupied. The contract consists of various jobs, unique and/or repetitive. How to assign workers to jobs is left to the on-site manager's decision. So any worker could be assigned multiple jobs during the contract period, and is out of this application's scope. We just provide a team of workers that is capable of finishing all jobs.
== Update ==
I'm planning to do this the "brute force" way on the server, due to its limited probabilities. However, this process will be moved to mobile (phones, etc.) platforms eventually, since worker availability may change in reality. It seems performing such computation on mobile platform is not feasible.
It seems to me not a knack-sack problem, nor a linear problem. I can't find a way to place variable worker & job constraints to the formulas.
With this question, I'm hoping to have some better options that can come out with the result with as few iterations as possible.
So, as we enter this function, there will be a few constants & variables:
let $U$ to be all of our available workers;
let $Z$ to be the constant of the maximum crew size (slot);
let $V_{w}$ to be the score of each worker, could be used as weight;
let $L_{j}$ to be the list of suitable workers to a job, which in turn are subsets of our available workers, where $L_{j} \in U$
printf()
s or GUI labels. In that case it only complicates matters (for readers like me) to distinguish these things. $\endgroup$