以下是使用蛮力法实现0/1背包问题求解的代码:

import random
import time
import matplotlib.pyplot as plt


def generate_items(n):
    items = []
    total_weight = 0
    for _ in range(n):
        weight = random.randint(1, 10)
        value = random.randint(10, 50)
        items.append((weight, value))
        total_weight += weight
    return items, total_weight


def brute_force_knapsack(items, capacity):
    n = len(items)
    max_value = 0
    best_subset = []

    for i in range(2**n):
        subset = []
        total_weight = 0
        total_value = 0

        for j in range(n):
            if (i >> j) & 1:
                subset.append(items[j])
                total_weight += items[j][0]
                total_value += items[j][1]

        if total_weight <= capacity and total_value > max_value:
            max_value = total_value
            best_subset = subset

    return best_subset, max_value


def plot_results(n_list, time_list):
    plt.plot(n_list, time_list, 'bo-')
    plt.xlabel('N')
    plt.ylabel('Time (seconds)')
    plt.title('Time Complexity of Brute Force Knapsack')
    plt.grid(True)
    plt.show()


if __name__ == '__main__':
    n_list = []
    time_list = []

    for n in [4, 8, 16, 32]:
        items, total_weight = generate_items(n)
        capacity = total_weight // 2

        start_time = time.time()
        best_subset, max_value = brute_force_knapsack(items, capacity)
        end_time = time.time()
        elapsed_time = end_time - start_time

        n_list.append(n)
        time_list.append(elapsed_time)

        print(f'N = {n}')
        print(f'Best Subset: {best_subset}')
        print(f'Max Value: {max_value}')
        print(f'Time: {elapsed_time} seconds\n')

    plot_results(n_list, time_list)

这段代码会生成随机的物品列表,并计算出物品总重量。然后,根据总重量的一半作为背包的容量,使用蛮力法求解0/1背包问题。最后,记录求解过程所需要的时间,并绘制时间复杂度的图像。

你可以将以上代码复制粘贴到PyCharm中运行。


原文地址: https://www.cveoy.top/t/topic/hHUl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录