model tvnetwork !up-front market sales plan generator model uses "mmxprs" parameters BUDGET = 12900 !Budget lower bound BUDGET_UB = 15000 !Budget upper bound PENALTY_SHOW = 100 !Penalty for not meeting show mix requirement PENALTY_WEEK = 100 !Penalty for not meeting weekly weighting requirement RANKWEIGHT = 0.5 !Rank value weight in the objective function UB_FACTOR = .5 !Factors to define customer constraint ranges LB_FACTOR = .5 DATAFILE = "tvnetwork.dat" MAXTIME = -10 end-parameters declarations SHOWS: set of string WEEKS: set of string SHOW_MIX: array(SHOWS) of real WEEK_WEIGHT: array(WEEKS) of real SHOW_MIX_LB: array(SHOWS) of real SHOW_MIX_UB: array(SHOWS) of real WEEK_WEIGHT_LB: array(WEEKS) of real WEEK_WEIGHT_UB: array(WEEKS) of real PRICE: array(SHOWS,WEEKS) of real INVENTORY: array(SHOWS,WEEKS) of integer RANK: array(SHOWS,WEEKS) of real end-declarations initializations from DATAFILE SHOW_MIX WEEK_WEIGHT PRICE INVENTORY RANK end-initializations forall(s in SHOWS) do SHOW_MIX_UB(s) := (SHOW_MIX(s) + UB_FACTOR)/100 SHOW_MIX_LB(s) := (SHOW_MIX(s) - LB_FACTOR)/100 end-do forall(w in WEEKS) do WEEK_WEIGHT_UB(w) := (WEEK_WEIGHT(w) + UB_FACTOR)/100 WEEK_WEIGHT_LB(w) := (WEEK_WEIGHT(w) - LB_FACTOR)/100 end-do declarations !decision variable x: array(SHOWS,WEEKS) of mpvar !slack variables slack_show_lb: array(SHOWS) of mpvar slack_show_ub: array(SHOWS) of mpvar slack_week_lb: array(WEEKS) of mpvar slack_week_ub: array(WEEKS) of mpvar !dependant variables budget: mpvar !total budget used in plan units: mpvar !total commercial units in plan rank_value: mpvar !total rank value in plan end-declarations forall(s in SHOWS, w in WEEKS) do x(s,w) is_integer end-do !budget constraints budget = sum(s in SHOWS, w in WEEKS) PRICE(s,w)* x(s,w) budget >= BUDGET budget <= BUDGET_UB !Total number of commercials in plan units = sum(s in SHOWS, w in WEEKS) x(s,w) !Plan total rank value rank_value = sum(s in SHOWS, w in WEEKS) RANK(s,w)* x(s,w) !Show-mix constraints forall(s in SHOWS)do sum(w in WEEKS) x(s,w) - SHOW_MIX_LB(s) * units + slack_show_lb(s) >= 0 sum(w in WEEKS) x(s,w) - SHOW_MIX_UB(s) * units - slack_show_ub(s) <= 0 end-do !Weekly weighting constraints forall(w in WEEKS)do sum(s in SHOWS) x(s,w) - WEEK_WEIGHT_LB(w) * units + slack_week_lb(w) >= 0 sum(s in SHOWS) x(s,w) - WEEK_WEIGHT_UB(w) * units - slack_week_ub(w) <= 0 end-do !Inventory constraints forall(s in SHOWS, w in WEEKS) x(s,w) <= INVENTORY(s,w) penalty := sum(s in SHOWS) PENALTY_SHOW * (slack_show_lb(s) + slack_show_ub(s)) + sum(w in WEEKS) PENALTY_WEEK * (slack_week_lb(w) + slack_week_ub(w)) deviation := sum(s in SHOWS) (slack_show_lb(s) + slack_show_ub(s)) + sum(w in WEEKS) (slack_week_lb(w) + slack_week_ub(w)) setparam("XPRS_MAXTIME",MAXTIME) minimize(penalty + RANKWEIGHT * rank_value) declarations status:array({XPRS_OPT,XPRS_UNF,XPRS_INF,XPRS_UNB}) of string totalweek: array(WEEKS)of integer end-declarations writeln("Budget used: ",strfmt(getsol(budget),8,0),"(BUDGET:",BUDGET,"/BUDGET_UB:",BUDGET_UB,")") writeln("Units used : ", strfmt(getsol(units),8,0)) writeln("Range Constraints Deviation: ", getsol(deviation),' units/', getsol(deviation)/getsol(units)*100, '%') writeln forall (w in WEEKS) totalweek(w):=0 write(strfmt('Week',-13),':') write(' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Total') writeln forall (s in SHOWS) do write(strfmt(s,-13),':') str := "" total:=0 forall (w in WEEKS) do x1:=round(getsol(x(s,w))) if (x1 > 0)then totalweek(w) += x1 str += " " + string(x1) total += round(x1) else str += " " end-if end-do if (total > 0) then write(strfmt(str,-20), " ",total) end-if writeln end-do write("Total Weekly :") forall(w in WEEKS) write(strfmt(totalweek(w),3)) writeln writeln forall(s in SHOWS)do totsw:=0. forall(w in WEEKS)do totsw:=totsw+getsol(x(s,w)) end-do if(getsol(slack_show_lb(s))>0) then writeln("slack_show_lb(",s,")= ",getsol(slack_show_lb(s))) end-if if(getsol(slack_show_ub(s))>0) then writeln("slack_show_ub(",s,")= ",getsol(slack_show_ub(s))) end-if end-do forall(w in WEEKS)do totsw:=0. forall(s in SHOWS)do totsw:=totsw+getsol(x(s,w)) end-do if(getsol(slack_week_lb(w))>0) then writeln("slack_week_lb(",w,")= ",getsol(slack_week_lb(w))) end-if if(getsol(slack_week_ub(w))>0) then writeln("slack_week_ub(",w,")= ",getsol(slack_week_ub(w))) end-if end-do writeln status:=["Optimum found", "Unfinished", "Infeasible", "Unbounded"] writeln("Problem status: ", status(getprobstat)) !writeln("Best Solution: ",getobjval) end-model