I am modelling a project in which doing some tasks before others will save
time. I think that the model is correct - but even though I have only entered
the savings for 1 task into the objective function, it is taking too long to
run. I believe that the problem lies in my "before1" and "before2" conditions,
each of which contain 15^4=50625 modelling variables. These conditions are
needed to enable the before[] variable, where before[a,b]=1 means that task a
will be completed before task b.
The variable position[] is working correctly (position[5]=3 means that task
five will be done third). I could eliminate the huge amount of work being done
in the "before1" and "before2" conditions if I could make use of these position
variables. Could anyone advise me how I can achieve the following, please?
* if position[a] > position[b], then before[a,b] = 0
* if position[a] < position[b], then before[a,b] = 1
Thanks for any suggestions!
Model appended below:
/*
The project consists of 15 tasks. Completion of any of these tasks will save
time on other tasks in the project as follows:
Task 1 savings: 2 hours on task 2: 2 hours on task 4: 1 hours on task 9
Task 2 savings: 2 hours on task 1: 3 hours on task 15
Task 3 savings: 4 hours on task 1: 1 hours on task 5
Task 4 savings: 1 hours on task 1: 1 hours on task 3: 2 hours on task 5: 1
hours on task 10
Task 5 savings: 1 hours on task 2: 1 hours on task 10: 1 hours on task 13: 1
hours on task 14: 1 hours on task 15
Task 6 savings: 1 hours on task 4: 1 hours on task 8: 2 hours on task 11: 1
hours on task 15
Task 7 savings: 2 hours on task 2: 3 hours on task 15
Task 8 savings: 4 hours on task 5: 1 hours on task 11
Task 9 savings: 1 hours on task 2: 2 hours on task 3: 1 hours on task 11: 1
hours on task 13
Task 10 savings: 4 hours on task 11: 1 hours on task 15
Task 11 savings: 1 hours on task 1: 1 hours on task 3: 1 hours on task 8: 1
hours on task 10: 1 hours on task 12
Task 12 savings: 3 hours on task 1: 1 hours on task 4: 1 hours on task 11
Task 13 savings: 2 hours on task 3: 3 hours on task 12
Task 14 savings: 1 hours on task 3: 1 hours on task 6: 1 hours on task 7: 1
hours on task 8: 1 hours on task 12
Task 15 savings: 2 hours on task 6: 2 hours on task 12: 1 hours on task 13
*/
var task{1..15, 1..15}, binary;
s.t. task1{a in 1..15}: sum{b in 1..15} task[a, b] = 1;
s.t. task2{b in 1..15}: sum{a in 1..15} task[a, b] = 1;
var position{1..15}, >= 0;
s.t. position1{a in 1..15}: sum{b in 1..15} b * task[b,a] = position[a];
var before{1..15, 1..15}, binary;
s.t. before1{a in 1..15, b in 1..15, c in 1..15, d in 1..15: b > a and c != d}:
before[c,d] + 1.5 >= task[a,c] + task[b,d];
s.t. before2{a in 1..15, b in 1..15, c in 1..15, d in 1..15: a > b and c != d}:
before[c,d] + task[a,c] + task[b,d] <= 2.5;
var saving{1..15}, >= 0;
s.t. s1: saving[1] = 2 * before[1,2] + 2 * before[1,4] + before[1,9];
maximize savings: saving[1];
solve;
for {a in 1..15} {
for {b in 1..15: task[a,b] = 1} {
printf "%s. Task %s\n", a, b;
}
}
for {a in 1..15, b in 1..15: before[a,b] >= 0.5 and a != b}{
printf "task %s is done before task %s\n", a, b;
}
for {a in 1..15} {
printf "Position of task %s: %s\n", a, position[a];
}
printf "\nTotal Savings: %s hours.", saving[1];
end;
_________________________________________________________________
We want to hear all your funny, exciting and crazy Hotmail stories. Tell us now
http://clk.atdmt.com/UKM/go/195013117/direct/01/
_______________________________________________
Help-glpk mailing list
Help-glpk@gnu.org
http://lists.gnu.org/mailman/listinfo/help-glpk