ankerr
ankerr

Reputation: 3

Algorithm for efficient optimization

I'm trying to make algorithm for optimization daily task schedule. For example:

1. There are 16 tasks to finish in one day, expirience worker can finish 8 tasks and newer worker could finish 4 tasks. As output we should get 2 expirienced worker and none new worker.

For now I have this code, but it's not working properly:

private void calculate(int numberOfTasks, int oldWorkerValue, int youngWorkerValue) {

    int numberOfOldWorkers = numberOfTasks / oldWorkerValue;
    int numberOfYoungWorkers = 0;

    if(numberOfOldWorkers == 0) {
        numberOfOldWorkers = 1;
    } else {
        numberOfYoungWorkers = (numberOfTasks % numberOfOldWorkers) / youngWorkerValue;

        if(numberOfTasks % oldWorkerValue != youngWorkerValue*numberOfYoungWorkers) {
            numberOfYoungWorkers = numberOfYoungWorkers + 1;
        }
    }
    System.out.println("Expirienced worker: " + numberOfOldWorkers + " and new workers: " + numberOfYoungWorkers);
}

it returns me number of worker but it doesn't work like it should be. I don't get result like I wrote in this few examples. Could you give me some advice for this?

Upvotes: 0

Views: 95

Answers (1)

Iłya Bursov
Iłya Bursov

Reputation: 24145

I'm not sure whether you can find exact formula for this, so I'd do simple brute force:

public static Pair<Integer, Integer> calculate(int numberOfTasks, int oldWorkerValue, int youngWorkerValue) {
    int m = Integer.MAX_VALUE; // minimal value
    int o = 0; // old workers
    int n = 0; // new workers
    for (int i = 1; i <= (int)Math.ceil((double) numberOfTasks / oldWorkerValue); i++) {
        int nw = (int) Math.ceil((double)(numberOfTasks - i * oldWorkerValue) / youngWorkerValue);
        if (nw < 0) nw = 0;
        int tm = i * oldWorkerValue + nw * youngWorkerValue;
        if (tm < m) {
            m = tm; o = i; n = nw;
        }
    }
    return new Pair<>(o, n); // pair <old workers, new workers>
}

Upvotes: 1

Related Questions