Real-World Scheduling Problem for Wind Turbine Tower Installation

36 Views Asked by At

The tower of a wind turbine consists of a number $k$ of segments $s_i$ (e.g., 4 or 5), which have to be installed in a certain order $s_1, s_2, ..., s_k$. To build each segment, a specific time $t_i$ (e.g., 3 hours) is required.

What complicates the installation process is a wind speed limit $l_i$ for every segment, which applies after the installation of a specific segment $s_i$ until after the next segment is installed; then, the next segments s_(i+1) wind speed limit l_(i+1) applies. This means that the start of a segment is limited by the wind speeds that occur until the installation of the following segment is completed, whose starting point again depends on the following wind speeds and segments completion time and so on.

To make it easy, we assume that wind speeds are deterministic and known exactly on an hourly basis. If we are interested in a schedule on an hourly basis, what mathematical approaches would you suggest to find the earliest possible starting time for each tower segment $s_i$?

So far I have "solved" this (I think) by using an algorithm, but I think that there should be an easy solution using optimization? I am not looking for solutions, just inspiration of possible methods.

1

There are 1 best solutions below

0
On

ok, initial pseudocode in PariGP format, not optimized

I find it easier to use numerical time for datetime ops. For that I use the same function as seen in Excel, so that any code for day rollover is unnecessary. 8/22/2022 00:00 = 44797, 01:00 = 44797.0417, etc

genit(k,tStart)={  \\inputs are # segments, start datetime
\\ define wHi (max wind speed, may be stepwise), 
\\ define buffer (min time between end of segment install & start of next),
\\ define installTime (segment install time (may vary with time/shift etc)
\\ I have not included the code to compute numerical time 8/24/2022 00:00 = 44797.00 
dbg=1;
wHi=7;
buffer=1/24.;   \\allow 1 hr betw start&end of consecutive segments
kStart=List();kEnd=List();  \\segment start,end times
prevEnd=-1;  \\initialize
for(i=1,k,   \\segment
t1=tStart;dun=0;
for(t1del=0,20,   \\coded for numeric time
t1=t1+t1del/24.;
wind= subWind(t1+t1del);
if(wind>wHi,next);
if(t1<prevEnd,next);   \\ next start can't be before previous end
break
);  \\end for t1del
\\ we can start this segment, when will its install end?
cnt=0;
listput(kStart,t1);
if(dbg>0,print("segment,start = ",i,"  ",t1));
t2=t1;
for(t2del=1,20,   \\coded for numeric time
t2=t2+t2del/24.;
wind= subWind(t2);
if(wind>wHi,print("wind delay, segment/time=",i,"  ",t2,"  ",wind);next);
cnt+=1;
if(cnt>=installTime(t2),break)
);  \\end for t2del
listput(kEnd,t2);
prevEnd=t2;
tStart=t2+buffer
);  \\ end segment for loop
print("Segment, start time ");
for(ptr=1,k,print(ptr,"  ",kStart[ptr] ));
}
\\***************************
subWind(tyme)= { \\ here I just generate a random wind 5-8
getrand;
wynd= 5+random(4);
return(wynd); }
\\***************************
installTime(tyme)= { \\ here default is 3 unless swing shift 1530-2330
thyme=3;
hr=tyme-floor(tyme);
if(hr>0.645833 && hr<0.979167,thyme=3.5); \\extra 30-min on swing
return(thyme); }
\\****************************

And here is the sample output:

(15:17) gp > genit(5,44798.0)
segment,start = 1  44798.04
wind delay, segment/time=1  44798.08  8

wind delay, segment/time=1  44798.46  8

wind delay, segment/time=1  44798.92  8

segment,start = 2  44799.25
wind delay, segment/time=2  44799.50  8

segment,start = 3  44799.92
wind delay, segment/time=3  44799.96  8

segment,start = 4  44800.42
wind delay, segment/time=4  44800.54  8

segment,start = 5  44801.08
Segment, start time
1  44798.04
2  44799.25
3  44799.92
4  44800.42
5  44801.08