好的,我们将在现有优化模型的基础上,进一步解决**问题三**:针对乙客户的特定需求,在限定成本的情况下,寻找满足性能指标的配方。
### 问题三:针对乙客户的特定需求,在限定成本的情况下,寻找满足性能指标的配方
#### 题目重述
乙客户要求配制80000吨润滑油,成本不超过3500元/吨,性能指标如表3所示(各项指标误差均不超过5%),请给出配方。
#### 详解
1. **构建优化模型**
- **目标函数**:最小化总成本。
\[
\text{Minimize } C = \sum_{j} p_j \times q_j
\]
其中 \(p_j\) 表示第 \(j\) 种基础油的价格,\(q_j\) 表示第 \(j\) 种基础油的用量。
- **约束条件**:
- 性能指标约束:每个性能指标的相对误差不超过5%。
\[
\left|\frac{\sum_{j} (q_j \times I_{ij}) - R_i}{R_i}\right| \leq 5\% \quad \text{for all } i
\]
- 总量约束:所有基础油的总用量为80000吨。
\[
\sum_{j} q_j = 80000
\]
- 成本约束:每吨成本不超过3500元。
\[
\frac{C}{80000} \leq 3500
\]
2. **优化求解**
我们将使用`scipy.optimize.minimize`求解非线性规划问题,确保模型设置正确并且约束条件合理。
#### Python代码实现
```python
import numpy as np
from scipy.optimize import minimize
# 加载基础油数据
base_oil_data = {
'指标1': [90.42, 5.616, 26.41, 4.216, 6.837, 28.18, 72.84, 31.58, 5.353, 25.83],
'指标2': [30, 50, 70, 100, 150, 220, 320, 460, 60, 76],
'指标3': [3.52, 5.06, 7.48, 11, 16.5, 24.2, 35.2, 50.6, 65.9, 87.8],
'指标4': [100, 150, 220, 320, 460, 680, 130, 250, 400, 190],
'指标5': [90, 135, 198, 288, 414, 612, 900, 1350, 1500, 1650],
'指标6': [1100, 1650, 1300, 1350, 506, 1900, 1100, 1650, 2000, 2300],
'价格': [3800, 2750, 4630, 2210, 3220, 1500, 4300, 3800, 5200, 3000]
}
# 转换为NumPy数组
base_oil_performance = np.array([base_oil_data[f'指标{i+1}'] for i in range(6)]).T
prices = np.array(base_oil_data['价格'])
# 乙客户要求指标
client_requirements = np.array([11.597, 8.936, 15.169, 358.831, 392.399, 1243.484])
# 设置相对误差容忍度(±5%)
tolerance = 0.05
lb = client_requirements * (1 - tolerance)
ub = client_requirements * (1 + tolerance)
# 总量约束
total_quantity = 80000 # 80000吨
# 成本约束
max_cost_per_ton = 3500 # 每吨不超过3500元
max_total_cost = max_cost_per_ton * total_quantity
# 定义目标函数(最小化总成本)
def objective(x):
cost = np.dot(prices, x)
return cost
# 约束条件
# 添加总量约束
cons = [{'type': 'eq', 'fun': lambda x: np.sum(x) - total_quantity}]
# 添加性能指标约束
for i in range(len(client_requirements)):
cons.append({'type': 'ineq', 'fun': lambda x, idx=i: np.dot(base_oil_performance[:, idx], x / total_quantity) - lb[idx]})
cons.append({'type': 'ineq', 'fun': lambda x, idx=i: ub[idx] - np.dot(base_oil_performance[:, idx], x / total_quantity)})
# 添加成本约束
cons.append({'type': 'ineq', 'fun': lambda x: max_total_cost - np.dot(prices, x)})
# 变量范围:x >= 0
bounds = [(0, None) for _ in range(len(base_oil_performance))]
# 初始猜测
x0 = np.ones(len(base_oil_performance)) * (total_quantity / len(base_oil_performance))
# 求解
res = minimize(objective, x0, bounds=bounds, constraints=cons)
if res.success:
print("优化成功,基础油配比(吨):", res.x)
print("性能指标:", np.dot(base_oil_performance.T, res.x / total_quantity))
print("总成本:", res.fun)
print("每吨成本:", res.fun / total_quantity)
else:
print("优化失败,原因:", res.message)
```
### 代码解释
1. **目标函数**:最小化总成本,即所有基础油用量乘以各自的价格之和。
2. **约束条件**:
- **总量约束**:所有基础油的总用量为80000吨。
- **性能指标约束**:每个性能指标必须在±5%的范围内。
- **成本约束**:总成本不超过3500元/吨。
3. **变量范围**:基础油用量非负。
4. **初始猜测**:每种基础油的初始用量均摊为80000吨的一半。
### 结果解释
运行上述代码后,会输出:
- **基础油配比(吨)**:每种基础油的使用量(单位:吨)。
- **性能指标**:优化后的实际性能指标。
- **总成本**:总成本最小化后的值。
- **每吨成本**:每吨润滑油的成本。
### 知识点
- **线性规划与非线性规划**:线性规划适用于线性目标和约束,而非线性规划则允许更复杂的数学关系。
- 本例中,使用非线性规划以包含复杂约束条件。
- **软约束**:通过引入惩罚项放松硬性约束,使模型更易求解。
- 适用于某些约束难以严格满足的情况。
- **优化求解器**:如`scipy.optimize.minimize`提供了多种优化算法,适用于不同类型的问题。
### 总结
通过引入额外的成本约束和总量约束,我们扩展了现有的优化模型,以解决乙客户的特定需求。这确保了配方不仅满足性能指标,还控制在预算之内。如果有更多的基础油数据或进一步的需求,请随时提供更多信息,我将继续优化模型并提供支持。希望这能满足您的需求!如果有任何问题或需要进一步的帮助,请随时告知!