Hello. I recently posted a request for assistance in giving preference to certain resources/variables when optimizing. Proc Optmodel MILP Scheduling: Pausing resource reallocation and giving preference to allocation @RobPratt `s solution was very informative, particularly this bit that illustrates how to create sets within sets: con DesiredConstraint1 {<PROD_ID, slot, day> in PROD_SLOT_DAY, <(PROD_ID), slot2, day2> in PROD_SLOT_DAY: dayToNum[day2] in dayToNum[day]+1..dayToNum[day]+N}: I have another issue with set manipulation(?). I am using MILP to maximize revenue based on the allocation of product IDs to a set of time slots over a set of days. var PROD_ASSIGN{PROD_SLOT_DAY}
a tuple of <string PROD_ID, num SLOT, string DAY> I would like constrain allocation of the primary variable PROD_ID based on a secondary numeric feature, call it "FTR", such that: PROD_IDs with identical FTR cannot be scheduled in back-to-back SLOTs within a given DAY. PROD_IDs with identical FTR cannot be scheduled in the same SLOT on consecutive DAYs. So, for example, let PROD_ID={...,"ABC", "DEF"...}, slot={...9,10,...}, and day={...,"Wednesday", "Thursday",...}. Assume that both ABC and DEF both have identical FTR=10. Constraint 1 above would prevent the allocation of combinations {ABC,ABC}, {DEF,DEF}, and {ABC,DEF} to both SLOT=9 and SLOT=10 on Wednesday. Constraint 2 above would prevent the allocation of combinations {ABC,ABC}, {DEF,DEF}, and {ABC,DEF} to SLOT=9 on both Wednesday and Thursday. I have used the following code in a separate constraint to prevent a given PROD_ID from being assigned to more than 2 consecutive slots (indexed by "start" here): PROD_ASSIGN[prod_id, start, day] + PROD_ASSIGN[prod_id, start+1, day] + PROD_ASSIGN[prod_id, start+2, day] <= 2 I am just constraining the number of times a given PROD_ID can appear in set of consecutive slots. This is rather straight-forward sum as PROD_ID is a component of the PROD_ASSIGN optimization variable. In my example this time though, I would like to constrain the number of times that a secondary feature, which is not a component of PROD_ASSIGN, appears vertically (i.e. in consecutive slots within a given day) and horizontally (i.e. in a given slot across consecutive days). Any suggestions of how I can do this? In the attached "Build Input Data" code, I have created a data set called SECOND_FTR_PRODS that contains a numeric FTR code for each of the corresponding PROD_IDs. My sample optimization code is included in "Optimize Schedule". I am not married to the idea of a numeric FTR. If string is more convenient/easy-to-solve, I can convert numeric values to string as needed.
... View more