Динамическая настройка индекса в функцииPython

Программы на Python
Anonymous
Динамическая настройка индекса в функции

Сообщение Anonymous »


У меня следующая проблема. У меня есть этот код. Полный код можно найти здесь.

из импорта gurobipy * импортировать гуробипи как гу импортировать панд как pd # Создаем DF из наборов I_list = [1, 2, 3] T_list = [1, 2, 3, 4, 5, 6, 7] K_список = [1, 2, 3] I_list1 = pd.DataFrame(I_list, columns=['I']) T_list1 = pd.DataFrame(T_list, columns=['T']) K_list1 = pd.DataFrame(K_list, columns=['K']) DataDF = pd.concat([I_list1, T_list1, K_list1], ось=1) Demand_Dict = {(1, 1): 2, (1, 2): 1, (1, 3): 0, (2, 1): 1, (2, 2): 2, (2, 3): 0 , (3, 1): 1, (3, 2): 1, (3, 3): 1, (4, 1): 1, (4, 2): 2, (4, 3): 0, (5, 1): 2, (5, 2): 0, (5, 3): 1, (6 , 1): 1, (6, 2): 1, (6, 3): 1, (7, 1): 0, (7, 2): 3, (7, 3): 0} Класс МастерПроблема: def __init__(self, dfData, DemandDF, итерация, current_iteration): self.iteration = итерация self.current_iteration = текущая_итерация self.nurses = dfData['I'].dropna().astype(int).unique().tolist() self.days = dfData['T'].dropna().astype(int).unique().tolist() self.shifts = dfData['K'].dropna().astype(int).unique().tolist() self.roster = список(диапазон(1, self.current_iteration + 2)) self.demand = ТребованиеDF self.model = gu.Model("MasterProblem") self.cons_demand = {} self.newvar = {} self.cons_lmbda = {} защита buildModel (сам): self.generateVariables() self.generateConstraints() self.model.update() self.generateObjective() self.model.update() Защиту генерироватьVariables (сам): self.slack = self.model.addVars(self.days, self.shifts, vtype=gu.GRB.CONTINUOUS, lb=0, name='slack') self.motivation_i = self.model.addVars(self.nurses, self.days, self.shifts, self.roster, vtype=gu.GRB.CONTINUOUS, lb=0, ub=1, name='motivation_i') self.lmbda = self.model.addVars(self.nurses, self.roster, vtype=gu.GRB.BINARY, lb=0, name='lmbda') защита генерироватьConstraints (сам): для меня в self.medurses: self.cons_lmbda = self.model.addConstr(gu.quicksum(self.lmbda[i, r] for r в self.roster) == 1) за t в самоднях: для s в самосмещениях: self.cons_demand[t, s] = self.model.addConstr( гу.быстрая сумма( self.motivation_i[i, t, s, r] * self.lmbda[i, r] for i в self.nurses for r в self.roster) + self.slack[t, s] >= self.demand[t, s]) вернуть self.cons_lmbda, self.cons_demand Защиту генерироватьОбъектив (сам): self.model.setObjective(gu.quicksum(self.slack[t, s] для t в self.days для s в self.shifts), смысл=gu.GRB.МИНИМИЗАЦИЯ) защитаsolveRelaxModel(self): self.model.Params.QCPDual = 1 для v в self.model.getVars(): v.setAttr('vtype', 'C') self.model.optimize() защита getDuals_i(self): Pi_cons_lmbda = self.model.getAttr("Пи", self.cons_lmbda) вернуть Pi_cons_lmbda защита getDuals_ts(self): Pi_cons_demand = self.model.getAttr("QCPi", self.cons_demand) вернуть Pi_cons_demand защита updateModel (сам): self.model.update() Защиту addColumn (self, newSchedule): self.newvar = {} colName = f"Расписание[{self.nurses},{self.roster}]" новыйСписокРасписания = [] для i, t, s, r в newSchedule: newScheduleList.append(newSchedule[i, t, s, r]) Столбец = gu.Column([], []) self.newvar = self.model.addVar(vtype=gu.GRB.CONTINUOUS, lb=0, столбец=столбец, имя=имя столбца) self.current_iteration = itr print(f"Индекс реестра: {self.current_iteration}") self.model.update() защита setStartSolution(self): startValues ​​= {} для i, t, s, r в itertools.product(self.nurses, self.days, self.shifts, self.roster): startValues[(i, t, s, r)] = 0 для i, t, s, r в startValues: self.motivation_i[i, t, s, r].Start = startValues[i, t, s, r] defsolveModel(self, timeLimit, EPS): self.model.setParam('TimeLimit', timeLimit) self.model.setParam('MIPGap', EPS) self.model.Params.QCPDual = 1 self.model.Params.OutputFlag = 0 self.model.optimize() защита getObjVal (сам): obj = self.model.getObjective() значение = obj.getValue() возвращаемое значение def FinalSolve(self, timeLimit, EPS): self.model.setParam('TimeLimit', timeLimit) self.model.setParam('MIPGap', EPS) self.model.setAttr("vType", self.lmbda, gu.GRB.INTEGER) self.model.update() self.model.optimize() Защиту модифицироватьConstraint(self, index, itr): self.nurseIndex = индекс self.rosterIndex = itr за t в самоднях: для s в самосмещениях: self.newcoef = 1,0 current_cons = self.cons_demand[t, s] qexpr = self.model.getQCRow(current_cons) новая_вар = self.newvar новый_коэф = self.newcoef qexpr.add(new_var * self.lmbda[self.nurseIndex, self.rosterIndex + 1], new_coef) rhs = current_cons.getAttr('QCRHS') смысл = current_cons.getAttr('QCSense') имя = current_cons.getAttr('QCName') newcon = self.model.addQConstr(qexpr, sense, rhs, name) self.model.remove(current_cons) self.cons_demand[t, s] = новыйкон вернуть Ньюкон класс Подзадача: def __init__(self, Duals_i, Duals_ts, dfData, i, M, итерация): self.days = dfData['T'].dropna().astype(int).unique().tolist() self.shifts = dfData['K'].dropna().astype(int).unique().tolist() self.duals_i = Duals_i self.duals_ts = Duals_ts сам.М = М self.alpha = 0,5 self.model = gu.Model("Подзадача") self.index = я self.it = итерация защита buildModel (сам): self.generateVariables() self.generateConstraints() self.generateObjective() self.model.update() Защиту генерироватьVariables (сам): self.x = self.model.addVars([self.index], self.days, self.shifts, vtype=GRB.BINARY, name='x') self.mood = self.model.addVars([self.index], self.days, vtype=GRB.CONTINUOUS, lb=0, name='mood') self.motivation = self.model.addVars([self.index], self.days, self.shifts, [self.it], vtype=GRB.CONTINUOUS, lb=0, name='мотивация') защита генерироватьConstraints (сам): для меня в [self.index]: за t в самоднях: для s в самосмещениях: self.model.addLConstr( самомотивация[i, t, s, self.it] >= self.mood[i, t] - self.M * (1 - self.x[i, t, s])) self.model.addLConstr( самомотивация[i, t, s, self.it]

Вернуться в «Python»