基于OR-Tools的装箱问题优化:同供应商物品归箱需求求解
装箱问题优化:减少单箱供应商数量的OR-Tools实现指导
我使用OR-Tools和SCIP求解器处理装箱问题,已遵循Google官方装箱指南完成基础算法实现,达成了最小化使用箱子数量的目标,并加入了基于CBM(体积)和重量的容量约束,确保每个箱子的装载量不超过上限。
但目前在修改算法以进一步减少每个箱子中的供应商数量时遇到困难。我的需求是:尽可能将同一供应商的物品放入同一箱子;若该供应商的所有物品总容量(CBM或重量)超过单箱上限,则允许拆分至多个箱子。
我尝试了多种方法但未找到合适方案,希望获得修改代码的指导,尤其是约束条件和目标函数的调整方法。以下是相关代码片段:
def __variables__(self): # Variables # x[i, j] = 1 if item i is packed in bin j. x = {} for i in self.model['data']: for j in self.model['bins']: x[(i, j)] = self.solver.IntVar(0, 1, 'x_%i_%i' % (i, j)) # y[j] = 1 if bin j is used. y = {} for j in self.model['bins']: y[j] = self.solver.IntVar(0, 1, 'y[%i]' % j) self.variables = [x, y] def __constraints__(self): if not self.variables or not self.solver: return x = self.variables[0] y = self.variables[1] # Constraints # Each item must be in exactly one bin. for i in self.model['data']: self.solver.Add(sum(x[i, j] for j in self.model['bins']) == 1) # The amount packed in each bin cannot exceed its capacity. for j in self.model['bins']: self.solver.Add( sum(x[(i, j)] * self.model['cbms'][i] for i in self.model['data']) <= y[j] * self.model['bin_capacity_cbm']) self.solver.Add( sum(x[(i, j)] * self.model['weights'][i] for i in self.model['data']) <= y[j] * self.model['bin_capacity_weight']) # Objective: minimize the number of bins used. self.solver.Minimize(self.solver.Sum( [y[j] for j in self.model['bins']])) # solver.Minimize(solver.Sum([ model['cbms'][j] for j in model['bins'] for i in model['suppliers'] if z[(j, i)] in model['bins'][i])]) def create_model(self) -> Dict[str, List]: model = {'data': [], 'cbms': [], 'weights': [], 'items': [], 'suppliers': []} # Iterate through each item for item in self.items: model['weights'].append(item[WEIGHT]) model['cbms'].append(item[CBM]) model['items'].append(item) model['suppliers'].append(item[SUPPLIER]) # Set the 'items' list as a range of indices based on the length of 'cbms' model['data'] = list(range(len(model['cbms']))) model['bins'] = model['data'] model['bin_capacity_cbm'] = MAX_CBM model['bin_capacity_weight'] = MAX_WEIGHT self.model = model
物品输入列表如下:
data = [ { 'asin': '...', 'cbm': 0.728, 'how_many_cartons': ..., 'how_many_to_ship': '...', 'optional': '', 'port': 'Tianjin', 'product_name': '...', 'ready_date': '6/30/2023', 'sku': '...', 'supplier': 'HEBEI HOUDE HANFANG MEDICAL DEVICES GROUP CO.,LTD', 'weight': 163.8 }, { 'asin': '...', 'cbm': 11.392, 'how_many_cartons': ..., 'how_many_to_ship': '...', 'optional': '', 'port': 'Shenzhen', 'product_name': '...', 'ready_date': 'Ready', 'sku': '...', 'supplier': 'HEBEI HOUDE HANFANG MEDICAL DEVICES GROUP CO.,LTD', 'weight': 7048.8 }, { 'asin': '...', 'cbm': 5.6, 'how_many_cartons': ..., 'how_many_to_ship': '...', 'optional': '', 'port': 'Shenzhen', 'product_name': '...', 'ready_date': 'Ready', 'sku': '...', 'supplier': 'HongTaiDingYe', 'weight': 1666.0 }, { 'asin': '...', 'cbm': 0.08, 'how_many_cartons': ..., 'how_many_to_ship': '...', 'optional': '', 'port': 'Shenzhen', 'product_name': '...', 'ready_date': '6/30/2023', 'sku': '...', 'supplier': 'HongTaiDingYe', 'weight': 35.6 } ]
内容的提问来源于stack exchange,提问作者Roni Jack Vituli
相关产品推荐
相关产品推荐

