Wang Haihua
🍈 🍉🍊 🍋 🍌
固定费用问题,是指求解生产成本最小问题。总成本包括固定成本和变动成本,而选择不同生产方式会有不同的固定成本,因此总成本与选择的生产方式有关。
固定费用问题,实际上是互斥的目标函数问题,对于不同的生产方式具有多个互斥的目标函数,但只有一个起作用。固定费用问题不能用一般的线性规划模型求解。
一般地,设有 $m$ 种生产方式可供选择,采用第 $j$ 种方式时的固定成本为 $k_j$、变动成本为 $c_j$、产量为 $x_i$,则采用各种生产方式的总成本分别为:
$$ P_j = \begin{cases} k_j + c_j x_j,& x_j>0 \\ 0, & x_j=0 \end{cases} $$这里 $j \in \{1,2,...,m\}$
为了构造统一的目标函数,可以引入 $m$ 个 $0-1$ 变量 $y_j$ 表示是否采用第 $j$ 种生产方式:
$$ y_j = \begin{cases} 1,& 采用第j 种生产方式 \\ 0, & 不采用第j种生产方式 \end{cases} $$于是可以构造新的目标函数和约束条件: $$ \begin{aligned} &{\min \quad \sum_{j=1}^{m} (k_j y_j +c_j x_j)} \\ s.t. \quad & x_j \le y_j M, j \in \{1,2,...,m\} \end{aligned} $$
这里$M$ 是一个充分大的常数。
某服装厂可以生产 A、B、C 三种服装,生产不同种类服装需要租用不同设备,设备租金、生产成本、销售价格等指标如下表所示。如果各类服装的市场需求都足够大,对于不同服装,服装厂每月可用人工时分别为600,800,600,那么应该如何安排生产计划使利润最大?
设备租金(元) | 材料成本(元/件) | 销售价格(元/件) | 人工工时(小时/件) | 设备工时(小时/件) | 设备可用工时 | 人工可用工时 | |
---|---|---|---|---|---|---|---|
A | 5000 | 280 | 400 | 5 | 3 | 300 | 600 |
B | 2000 | 30 | 40 | 1 | 0.5 | 300 | 800 |
C | 2000 | 200 | 300 | 4 | 2 | 300 | 600 |
首先要理解生产某种服装就会发生设备租金,租金只与是否生产该产品有关,而与生产数量无关,这就是固定成本。因此本题属于固定费用问题。
这里我们采用Pulp库进行求解,结果为
产量 | |
---|---|
A | 60 |
B | 300 |
C | 75 |
收入为8700元
import numpy as np
import pulp as lp
import pandas as pd
from model_insight.load_datasets import load_factory_clothes
fac = load_factory_clothes()
fac
设备租金(元) | 材料成本(元/件) | 销售价格(元/件) | 人工工时(小时/件) | 设备工时(小时/件) | 设备可用工时 | 人工可用工时 | |
---|---|---|---|---|---|---|---|
A | 5000.0 | 280.0 | 400.0 | 5.0 | 3.0 | 300.0 | 600.0 |
B | 2000.0 | 30.0 | 40.0 | 1.0 | 0.5 | 300.0 | 800.0 |
C | 2000.0 | 200.0 | 300.0 | 4.0 | 2.0 | 300.0 | 600.0 |
fac.columns
Index(['设备租金(元)', '材料成本(元/件)', '销售价格(元/件)', '人工工时(小时/件)', '设备工时(小时/件)', '设备可用工时', '人工可用工时'], dtype='object')
# initialize the model and data
model = lp.LpProblem(name="factory_production",sense=lp.LpMaximize)
[K_,C_,S_,Tp_,Tm_,T1_,T2_]=['设备租金(元)', '材料成本(元/件)', '销售价格(元/件)', '人工工时(小时/件)', '设备工时(小时/件)',
'设备可用工时','人工可用工时']
cloth_types = fac.index
M = 1000
# variables
xi = lp.LpVariable.dicts(name='production',indexs=cloth_types,cat='Continuous')
yi = lp.LpVariable.dicts(name='whether_use',indexs=cloth_types,cat='Binary')
# objective funtion
objective = lp.lpSum([xi[i]*(fac.loc[i,S_]-fac.loc[i,C_])-yi[i]*fac.loc[i,K_] for i in cloth_types])
model += objective,'objective_function'
# constraints
## constraints for labor
for i in cloth_types:
model +=xi[i]*fac.loc[i,Tp_] <=fac.loc[i,T1_],f'constraint_cloth_{i}_{Tp_}'
## constraints for machines
for i in cloth_types:
model +=xi[i]*fac.loc[i,Tm_] <=fac.loc[i,T2_],f'constraint_cloth_{i}_{Tm_}'
## constraints of relationship between x and y
for i in cloth_types:
model +=xi[i]<=M*yi[i],f'constraint_xy_{i}'
model.solve()
1
df_result = pd.DataFrame(np.zeros((3,1)),index=cloth_types,columns=['产量'])
for i in cloth_types:
df_result.loc[i,'产量']=lp.value(xi[i])
df_result
产量 | |
---|---|
A | 60.0 |
B | 300.0 |
C | 75.0 |
lp.value(model.objective)
8700.0