The scene allocation problem consists of deciding when to shoot each scene of a movie in order to minimize the total production cost (Van Hentenryck, 2002). Each scene involves a number of actors, and at most five scenes a day can be shot. All actors who appear in a scene must be present on the day the scene is shot. Each actor has a daily rate for each day spent in the studio, regardless of the number of scenes in which he or she appears on that day. The goal is to minimize the production costs of the studio.
The actor names, daily fees, and the scenes they appear are given in the SCENE data set shown in Output 3.6.1. The variables S_Var1, …, S_Var9 indicate the scenes in which the actor appears. For example, the first observation indicates that Patt’s daily fee is 26,481 and that Patt appears in scenes 2, 5, 7, 10, 11, 13, 15, and 17.
Output 3.6.1: The Scene Data Set
Obs | Number | Actor | DailyFee | S_Var1 | S_Var2 | S_Var3 | S_Var4 | S_Var5 | S_Var6 | S_Var7 | S_Var8 | S_Var9 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | Patt | 26481 | 2 | 5 | 7 | 10 | 11 | 13 | 15 | 17 | . |
2 | 2 | Casta | 25043 | 4 | 7 | 9 | 10 | 13 | 16 | 19 | . | . |
3 | 3 | Scolaro | 30310 | 3 | 6 | 9 | 10 | 14 | 16 | 17 | 18 | . |
4 | 4 | Murphy | 4085 | 2 | 8 | 12 | 13 | 15 | . | . | . | . |
5 | 5 | Brown | 7562 | 2 | 3 | 12 | 17 | . | . | . | . | . |
6 | 6 | Hacket | 9381 | 1 | 2 | 12 | 13 | 18 | . | . | . | . |
7 | 7 | Anderson | 8770 | 5 | 6 | 14 | . | . | . | . | . | . |
8 | 8 | McDougal | 5788 | 3 | 5 | 6 | 9 | 10 | 12 | 15 | 16 | 18 |
9 | 9 | Mercer | 7423 | 3 | 4 | 5 | 8 | 9 | 16 | . | . | . |
10 | 10 | Spring | 3303 | 5 | 6 | . | . | . | . | . | . | . |
11 | 11 | Thompson | 9593 | 6 | 9 | 12 | 15 | 18 | . | . | . | . |
There are 19 scenes and at most five scenes can be filmed in one day, so at least four days are needed to schedule all the scenes (). Let be a binary variable that equals 1 if scene is shot on day . Let be another binary variable that equals 1 if actor is present on day . The variable is the name of the th actor; is the daily cost of the th actor. if actor appears in scene , and 0 otherwise.
The objective function representing the total production cost is given by
The %SCENE macro first reads the data set scene
and produces three sets of macro variables: , , and . The data set cost
is created next to specify the objective function. Finally, the CLP procedure is invoked. There are two sets of GCC constraints
in the CLP call: one to make sure each scene is shot exactly once, and one to limit the number of scenes shot per day to be
at least four and at most five. There are two sets of LINCON constraints: one to indicate that an actor must be present if
any of his or her scenes are shot that day, and one for breaking symmetries to improve efficiency. Additionally, an OBJ statement
specifies upper and lower bounds on the objective function to be minimized.
%macro scene; /* Ai_Sj=1 if actor i appears in scene j */ /* Ai_Sj=0 otherwise */ /* Initialize to 0 */ %do i=1 %to 11; /* 11 actors */ %do j=1 %to 19; /* 19 scenes */ %let A&i._S&j=0; %end; %end; data scene_cost; set scene; keep DailyFee A; retain DailyFee A; do day=1 to 4; A='A'||left(strip(_N_))||'_'||left(strip(day)); output; end; call symput("Name"||strip(_n_), Actor); /* read actor name */ call symput("Cost"||strip(_n_), DailyFee); /* read actor cost */ /* read whether an actor appears in a scene */ %do i=1 %to 9; /* 9 scene variables in the data set */ if S_Var&i > 0 then call symput("A"||strip(_n_)||"_S"||strip(S_Var&i), 1); %end; run; /* Create constraint data set which defines the objective function */ proc transpose data=scene_cost out=cost(drop=_name_); var DailyFee; id A; run; data cost; set cost; _TYPE_='MIN'; _RHS_=.; run; /* Find the minimum objective value. */ proc clp condata=cost out=out varselect=maxc; /* Set lower and upper bounds for the objective value */ /* Lower bound: every actor appears on one day. */ /* Upper bound: every actor appears on all four days. */ obj lb=137739 ub=550956; /* Declare variables. */ %do k=1 %to 4; /* 4 days */ %do j=1 %to 19; /* 19 scenes */ var S&j._&k=[0,1]; /* Indicates if scene j is shot on day k. */ %end; %do i=1 %to 11; /* 11 actors */ var A&i._&k=[0,1]; /* Indicates if actor i is present on day k.*/ %end; %end; /* Every scene is shot exactly once.*/ %do j=1 %to 19; gcc ( %do k=1 %to 4; S&j._&k %end; )=( (1, 1, 1) ); %end; /* At least 4 and at most 5 scenes are shot per day. */ %do k=1 %to 4; gcc ( %do j=1 %to 19; S&j._&k %end; )=( (1, 4, 5) ); %end; /* Actors for a scene must be present on day of shooting.*/ %do k=1 %to 4; %do j=1 %to 19; %do i=1 %to 11; %if (&&A&i._S&j>0) %then %do; lincon S&j._&k <= A&i._&k; %end; %end; %end; %end; /* Symmetry breaking constraints. Without loss of any generality, we */ /* can assume Scene1 to be shot on day 1, Scene2 to be shot on day 1 */ /* or day 2, and Scene3 to be shot on either day 1, day 2 or day 3. */ lincon S1_1 = 1, S1_2 = 0, S1_3 = 0, S1_4 = 0, S2_3 = 0, S2_4 = 0, S3_4 = 0; /* If Scene2 is shot on day 1, */ /* then Scene3 can be shot on day 1 or day 2. */ lincon S2_1 + S3_3 <= 1; run; %put &_ORCLP_; %mend scene;
The optimal production cost is 334,144, as reported in the _ORCLP_ macro variable. The corresponding actor schedules and scene schedules are displayed in Output 3.6.2 and Output 3.6.3, respectively.