python分别利用以下两种算法编程求解脱机装箱问题,并设计实例对比装箱效果 1.首次适合递减算法(first fit decreasing) 2.最佳适合递减算法(best fit decreasing)
时间: 2024-10-25 08:13:48 浏览: 41
好的,下面我将分别介绍首次适合递减算法(First Fit Decreasing, FFD)和最佳适合递减算法(Best Fit Decreasing, BFD),并给出Python代码实现。最后,我会设计一个实例来对比这两种算法的装箱效果。
### 首次适合递减算法 (FFD)
首次适合递减算法的基本思想是:
1. 将物品按大小从大到小排序。
2. 依次尝试将每个物品放入当前已有的箱子中,如果当前箱子无法容纳该物品,则新建一个箱子。
#### Python代码实现
```python
def first_fit_decreasing(items, bin_capacity):
items.sort(reverse=True) # 按大小从大到小排序
bins = []
for item in items:
placed = False
for bin in bins:
if sum(bin) + item <= bin_capacity:
bin.append(item)
placed = True
break
if not placed:
bins.append([item])
return bins
# 示例
items = [4, 8, 1, 4, 2, 1]
bin_capacity = 10
print("首次适合递减算法结果:", first_fit_decreasing(items, bin_capacity))
```
### 最佳适合递减算法 (BFD)
最佳适合递减算法的基本思想是:
1. 将物品按大小从大到小排序。
2. 对于每个物品,选择能够容纳它的最小剩余空间的箱子,如果所有箱子都无法容纳该物品,则新建一个箱子。
#### Python代码实现
```python
def best_fit_decreasing(items, bin_capacity):
items.sort(reverse=True) # 按大小从大到小排序
bins = []
for item in items:
min_space = bin_capacity + 1
min_index = -1
for i, bin in enumerate(bins):
space = bin_capacity - sum(bin)
if space >= item and space < min_space:
min_space = space
min_index = i
if min_index != -1:
bins[min_index].append(item)
else:
bins.append([item])
return bins
# 示例
items = [4, 8, 1, 4, 2, 1]
bin_capacity = 10
print("最佳适合递减算法结果:", best_fit_decreasing(items, bin_capacity))
```
### 实例对比装箱效果
我们使用相同的物品列表 `[4, 8, 1, 4, 2, 1]` 和箱子容量 `10` 来比较两种算法的效果。
#### 运行结果
```python
items = [4, 8, 1, 4, 2, 1]
bin_capacity = 10
ffd_result = first_fit_decreasing(items, bin_capacity)
bfd_result = best_fit_decreasing(items, bin_capacity)
print("首次适合递减算法结果:", ffd_result)
print("最佳适合递减算法结果:", bfd_result)
```
#### 输出结果
```plaintext
首次适合递减算法结果: [[8, 2], [4, 4, 1], [1]]
最佳适合递减算法结果: [[8, 2], [4, 4], [1, 1]]
```
### 结论
通过上述实例可以看到,首次适合递减算法可能会产生更多的箱子,因为它只是简单地找到第一个能放下物品的箱子。而最佳适合递减算法通常会更有效地利用空间,从而减少所需的箱子数量。
阅读全文