I am modeling a problem similar to the job shop problem (tasks with start times, duration, and predecessors) and my objective is to minimize the makespan, with Python and OR-Tools.
start[i] is an integer decision variable that shows the period when task $i$ starts
start = 3 $\Rightarrow$ task 1 starts on period 3
duration[i] is a parameter that is the task $i$ duration (and is known)
duration  = 2 $\Rightarrow$ task 1 takes 2 period to be completed
Now I want to integrate a cost function where if a task $i$ starts on a specific period and ends on period
start[i]+duration[i], the cost will be the sum of every period it's being worked on.
I have a cost matrix:
Cost[i,j] = [[ 1, 2, 3, 6, 8], [5, 6, 7, 2, 1]]
cost[1,1] is the cost for task 1 if it's being worked on during period 1
So if task 1 has a duration of 2, and starts on period 1, then periods 1,2,3 will be the target periods, and the cost will be
cost[1,1]+cost[1,2]+cost[1,3] = 1+2+3 from the cost matrix.
I tried creating a binary matrix
BIN[i,start[i]:start[i]+duration[i]] that uses
duration[i] and returns a style matrix, where 1 if the task is in progress and 0 if not, so then I can pass the
cost[i,j] and find the total cost for a scenario.
total_cost = model.NewIntVar(0,99999,'total_cost') b = model.newboolvar('b') for i in range(alltasks): model.Add(start[i] != 0).OnlyEnforceIf(b) model.Add(start[i] == 0).OnlyEnforceIf(b.Not()) model.Add(total_cost == sum(Cost*b)).OnlyEnforceIf(b) model.Add(total_cost == 0).OnlyEnforceIf(b.Not())
But that doesn't work at all...
If it can help in the understanding: My goal is to make the model choose the best period to start/end on a period knowing the duration is fixed and there is a cost to each period that this task will be worked on (so to reduce the cost)