逻辑约束

Python 供应链分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

示例问题

最大重量 20,000 磅

产品 重量(磅) 利润(美元)
A 12,800 77,878
B 10,900 82,713
C 11,400 82,728
D 2,100 68,423
E 11,300 84,119
F 2,300 77,765
  • 在不超出重量上限下,选择最赚的产品装运
  • 决策变量:
    • X$_{i}$ = 1 表示选择产品 _i_,否则为 0
  • 目标:
    • 最大化 z = $\sum$ 利润$_{i}$X$_{i}$
  • 约束:
    • $\sum$ 重量$_{i}$X$_{i}$ < 20,0000
Python 供应链分析
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765}

# Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective model += lpSum([prof[i]*x[i] for i in prod]) # Define Constraint model += lpSum([weight[i]*x[i] for i in prod]) <= 20000
# Solve Model model.solve() for i in prod: print("{} status {}".format(i, x[i].varValue))
Python 供应链分析

示例结果

最大重量 20,000 磅

产品 是否装运
A
B
C
D
E
F

结果

  • 利润:$230,307
  • 产品重量:15,700 磅
Python 供应链分析

逻辑约束示例 1

产品 E 与产品 D 二选一,不能同时选择。

  • X$_{E}$ = 1 表示选择产品 _i_,否则为 0
  • X$_{D}$ = 1 表示选择产品 _i_,否则为 0
  • 约束
    • X$_{E}$ + X$_{D}$ ≤ 1
Python 供应链分析

代码示例——逻辑约束示例 1

model += x['E'] + x['D'] <= 1
prod = ['A', 'B', 'C', 'D', 'E', 'F']
weight = {'A':12800, 'B':10900, 'C':11400, 
          'D':2100, 'E':11300, 'F':2300}
prof = {'A':77878, 'B':82713, 'C':82728, 
        'D':68423, 'E':84119, 'F':77765}

# Initialize Class
model = LpProblem("Loading Truck Problem",
                   LpMaximize)

# Define Decision Variables
x = LpVariable.dicts('ship_', prod, 
                      cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
  lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['E'] + x['D'] <= 1

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Python 供应链分析

逻辑约束示例 1 结果

最大重量 20,000 磅

产品 是否装运
A
B
C
D
E
F

结果

  • 利润:$228,916
  • 产品重量:15,800 磅
Python 供应链分析

逻辑约束示例 2

若选择产品 D,则必须选择产品 B。

  • X$_{D}$ = 1 表示选择产品 _i_,否则为 0
  • X$_{B}$ = 1 表示选择产品 _i_,否则为 0
  • 约束
    • X$_{D}$ ≤ X$_{B}$
Python 供应链分析

代码示例——逻辑约束示例 2

model += x['D'] <= x['B']

prod = ['A', 'B', 'C', 'D', 'E', 'F'] weight = {'A':12800, 'B':10900, 'C':11400, 'D':2100, 'E':11300, 'F':2300} prof = {'A':77878, 'B':82713, 'C':82728, 'D':68423, 'E':84119, 'F':77765} # Initialize Class model = LpProblem("Loading Truck Problem", LpMaximize) # Define Decision Variables x = LpVariable.dicts('ship_', prod, cat='Binary')
# Define Objective
model += lpSum([prof[i]*x[i] for i in prod])

# Define Constraint
model += 
 lpSum([weight[i]*x[i] for i in prod]) <= 20000
model += x['D'] <= x['B']

# Solve Model
model.solve()
for i in prod:
  print("{} status {}".format(i, x[i].varValue))
Python 供应链分析

逻辑约束示例 2 结果

最大重量 20,000 磅

产品 是否装运
A
B
C
D
E
F

结果

  • 利润:$228,901
  • 产品重量:15,300 磅
Python 供应链分析

其他逻辑约束

逻辑约束 数理表达
若选择项目 _i_,则也选择项目 _j_ x$_{i}$ - x$_{j}$ ≤ 0
二选一:选 _i_ 或选 _j_,但不能同时 x$_{i}$ + x$_{j}$ = 1
若选择项目 _i_,则不选项目 _j_ x$_{i}$ - x$_{j}$ ≤ 1
若不选项目 _i_,则不选项目 _j_ -x$_{i}$ + x$_{j}$ ≤ 0
至多选择 _i_、_j_、_k_ 中的一个 x$_{i}$ + x$_{j}$ + x$_{k}$ ≤ 1
1 James Orlin, and Ebrahim Nasrabadi. 15.053 Optimization Methods in Management Science. Spring 2013. Massachusetts Institute of Technology: MIT OpenCourseWare. License: Creative Commons BY-NC-SA.
Python 供应链分析

小结

  • 回顾了逻辑约束示例
  • 给出了其他逻辑约束的表格
Python 供应链分析

轮到您了!

Python 供应链分析

Preparing Video For Download...