请用python实现脱机装箱的两种算法,首次适合递减算法和最佳适合递减算法,给出完整代码和示例
时间: 2024-10-24 07:15:06 浏览: 17
在Python中,我们可以使用模拟退火(Simulated Annealing)算法来实现离线装载箱(Knapsack)问题的两种策略:首次适合(First Fit Decreasing, FFD)和最佳适合(Best Fit Decreasing, BFD)。这里我们假设有一个物品列表,每个物品都有重量和价值,我们需要在一个给定容量的背包中尽可能地装入物品以最大化总价值。
**1. 首次适合递减算法 (FFD)**:
这个算法按照物品的重量降序排列,每次都选择当前剩余容量能装下的最轻的物品。
```python
def ffd(items, capacity):
items.sort(key=lambda x: x['weight']) # 按照重量降序排序
packed_items = []
for item in items:
if item['weight'] <= capacity: # 如果物品可以完全放入
packed_items.append(item)
capacity -= item['weight']
if capacity == 0: # 当背包满时停止
break
return packed_items
# 示例
items = [{'weight': 10, 'value': 60}, {'weight': 20, 'value': 100}, {'weight': 30, 'value': 120}]
capacity = 50
packed_items_ffd = ffd(items, capacity)
```
**2. 最佳适合递减算法 (BFD)**:
这个算法同样按重量降序排列,但每次总是选择价值与剩余容量之比最高的物品。
```python
def bfd(items, capacity):
items.sort(key=lambda x: x['value']/x['weight'], reverse=True) # 按价值/重量降序排序
packed_items = []
for item in items:
if item['weight'] <= capacity: # 如果物品可以完全放入
packed_items.append(item)
capacity -= item['weight']
if capacity == 0: # 当背包满时停止
break
return packed_items
# 示例
packed_items_bfd = bfd(items, capacity)
```
阅读全文