具有多个箱子和约束的无界背包

2023-11-30

我是 Python 编码新手,需要帮助解决具有多个垃圾箱(4 个垃圾箱)和约束的无界背包问题。

  1. 这些箱子的重量限制分别为 10.5、10.5、7 和 7。
  2. 每个箱子只能装满某些物品。例如,仓 0 只能填充项目 0-9,仓 1 只能填充项目 10-19,等等。
  3. 该算法递归运行,直到达到总权重限制 3000。

我已经修改了 or-tools 中可用的代码,如下所示。输出非常接近我的要求,但我在第 2 项和第 3 项上遇到了问题。

from ortools.linear_solver import pywraplp


def main():
    data = {}
    data['weights'] = [
        0.95,0.31,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.75,0.95,0.78,0.45,1.00,1.00,1.00,0.19,1.00,1.00,0.50,3.00,3.00,3.00,0.75,
     1.25,5.00,3.00,1.00,3.00,1.00,1.00,0.63,3.00,1.00,0.55,1.00,1.00,0.75,0.67,0.38
    ]
    data['values'] = [
        0.8554,0.7855,0.7406,0.7282,0.7855,0.8653,0.8529,0.9177,0.8329,0.9077,0.7706,0.8928,0.8354,0.9077,0.8379,0.8055,0.8778,
     0.8778,0.9252,0.9501,0.9451,0.9377,0.9252,0.9102,0.9252,0.9476,0.9426,0.9476,0.9377,0.9302,0.9401,0.8579,0.8678,0.8903,
     0.8853,0.8105,0.9077,0.9152,0.9152,0.8579
    ]
    assert len(data['weights']) == len(data['values'])
    data['num_items'] = len(data['weights'])
    data['all_items'] = range(data['num_items'])

    data['bin_capacities'] = [10.5, 10.5, 7, 7]
    data['num_bins'] = len(data['bin_capacities'])
    data['all_bins'] = range(data['num_bins'])

    # Create the mip solver with the SCIP backend.
    solver = pywraplp.Solver.CreateSolver('SCIP')
    if solver is None:
        print('SCIP solver unavailable.')
        return

    # Variables.
    # x[i, b] = 1 if item i is packed in bin b.
    x = {}
    for i in data['all_items']:
        for b in data['all_bins']:
            x[i, b] = solver.BoolVar(f'x_{i}_{b}')

    # Constraints.
    # Each item is assigned to at most one bin.
    for i in data['all_items']:
        solver.Add(sum(x[i, b] for b in data['all_bins']) <= 1)

    # The amount packed in each bin cannot exceed its capacity.
    for b in data['all_bins']:
        solver.Add(
            sum(x[i, b] * data['weights'][i]
                for i in data['all_items']) <= data['bin_capacities'][b])

    # Objective.
    # Maximize total value of packed items.
    objective = solver.Objective()
    for i in data['all_items']:
        for b in data['all_bins']:
            objective.SetCoefficient(x[i, b], data['values'][i])
    objective.SetMaximization()

    status = solver.Solve()

    if status == pywraplp.Solver.OPTIMAL:
        print(f'Total packed value: {objective.Value()}')
        total_weight = 0
        for b in data['all_bins']:
            print(f'Bin {b}')
            bin_weight = 0
            bin_value = 0
            for i in data['all_items']:
                if x[i, b].solution_value() > 0:
                    print(
                        f"Item {i} weight: {data['weights'][i]} value: {data['values'][i]}"
                    )
                    bin_weight += data['weights'][i]
                    bin_value += data['values'][i]
            print(f'Packed bin weight: {bin_weight}')
            print(f'Packed bin value: {bin_value}\n')
            total_weight += bin_weight
        print(f'Total packed weight: {total_weight}')
    else:
        print('The problem does not have an optimal solution.')


if __name__ == '__main__':
    main()

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多个箱子和约束的无界背包 的相关文章

  • Google OR 工具 - 火车调度问题

    我试图解决的问题有点像这里的员工调度问题 https github com google or tools blob master examples python shift scheduling sat py 然而 有一些事情我被困住了
  • 计算运输箱尺寸的粗略估计

    我正在尝试找到计算运输所需的箱子尺寸的最佳方法 我有 3 个不同尺寸的集装箱 我在数据库中定义了产品的宽度 长度 深度和质量 我想知道如何找到需要运输的最小箱子数量 以及考虑到购物车中的物品数量 这些箱子的最小尺寸 我当前的 想法 是找到整
  • 仅限于 N 元解的背包算法

    这段摘自 CRAN 文档的 adagio 函数 knapsack 的功能符合预期 它用利润向量解决了背包问题p 权重向量w 和容量cap 在所选元素的总权重不超过容量的约束下 选择利润最大的元素子集 library adagio p lt
  • 线性规划 - Google ortool - 错误的决策变量最终值

    我正在尝试解决线性规划问题 以下是问题的具体情况 我有一个网络流问题已转换为线性规划问题 因此 所有流量约束 例如容量 流量守恒等 都必须强制执行 我的目标是最小化成本 决策变量 我通过定义字典并在这 128 个位置中的每个位置添加决策变量
  • 压缩阻塞文件中的记录的好算法是什么?

    假设您有一个由一堆固定大小的块组成的大文件 每个块都包含一定数量的可变大小的记录 每条记录必须完全适合单个块 并且根据定义 此类记录永远不会大于整个块 随着时间的推移 随着记录从这个 数据库 中移入和移出 记录会被添加到这些块中或从这些块中
  • 解决具有两个属性的背包问题的最快方法是什么

    假设我们有一个输入 10 saying 1st property should be 10 in total 10 saying 2d property should be 10 in total 5 saying theres 5 rec
  • 需要 T-SQL 查询找到所有可能的方式

    create table sample product varchar 100 Price float insert into sample values Pen 10 insert into sample values DVD 29 in
  • 如何确定最便宜的通勤票组合

    My 当地火车服务 http www sunrail com default aspx faresandpasses reloadable htm最近添加了日常通勤的选项 我正在尝试确定一种算法 用于查找给定日期的一组给定往返行程的最便宜的
  • 动态规划和 0/1 背包

    尽管我已经阅读了很多资源试图理解动态编程 但我在理解动态编程方面遇到了一些困难 我理解使用斐波那契算法给出的动态规划的示例 我明白如果你使用分而治之的方法 你最终会多次解决一些子问题 而动态编程通过解决这些重叠的子问题但只解决一次 并存储它
  • Google OR-Tools(使用 SCIP 求解器)- 如何访问求解器找到的中间解?

    我是 Google OR Tools 的新手 我使用 Python 实现了一个以 SCIP 作为求解器的 MIP 模型 目标函数用于最小化 求解器 最小化 C 并且我正在通过访问最终解决方案求解器 Objective Value 但是 我还
  • 背包0-1路径重建(拿哪些物品)[重复]

    这个问题在这里已经有答案了 我知道如何用动态规划方法解决背包 0 1 问题 但我很难弄清楚要拿哪些物品而不影响 O N C N 个物品 C 容量 的复杂性 有什么想法 我更喜欢自下而上的方法 假设现在您将结果存储在数组中bool a whe
  • 从ortools获取SAT解决方案列表

    我正在尝试找出如何从以下位置获取可能解决方案的完整列表ortools sat python cp model 我知道我可以打印它们 如下例所示 但我不清楚如何获取这些值 例如作为嵌套列表或字典列表 我尝试通过修改来编写自己的回调类VarAr
  • 如何在 Ortools 中定义约束以设置不同值的限制

    我试图定义一个约束来限制求解器生成的唯一值的数量 它可以生成尽可能多的重复项来解决问题 但唯一值有限制 为每个值创建一个布尔变量selected value这是正确的 当且仅当至少为它分配了一个值 为此 您将需要 2 组约束 从左到右 se
  • 为什么解决背包问题不被视为线性规划?

    为什么背包问题不属于线性规划算法尽管背包问题陈述看起来与中的问题相似线性规划 背包可以写成整数线性规划程序 与普通的线性规划不同 该问题要求解中的变量是整数 已知线性规划可在多项式时间内求解 而整数线性规划是 NP 完全的 读者练习 证明
  • Google Or-Tools员工排班。条件无法正常工作

    我在用着那个护士调度的例子 https developers google com optimization scheduling employee scheduling 我有 3 名员工 2 班次 7 天 我有一个条件 如果一名员工在 1
  • 如何用Google OR工具绘制车辆路径问题解决方案?

    我正在使用 Google OR 工具来解决 Python 中的简单车辆路径问题 我想以类似于 Google 教程的方式绘制求解器返回的解决方案 Google OR Tools 车辆路径问题教程解决方案 https i stack imgur
  • 这2个背包算法一样吗? (他们总是输出相同的东西吗)

    在我的代码中 假设C是容量 N是物品数量 w j 是物品j的重量 v j 是物品j的值 它与0 做同样的事情吗 1 背包算法 我一直在一些数据集上尝试我的代码 情况似乎确实如此 我想知道这一点的原因是因为我们学过的 0 1 背包算法是二维的
  • 从不同组中选择的背包

    我对背包问题有一个变体 我正在努力寻找有效的解决方案 假设您有多组项目 每个组可以有任意数量的物品 每个物品都有一个值和重量 问题是找到总价值最大 重量 也就是说 想象一下你有数百种物品可供选择 但你必须带一份三明治 一份饮料 一份零食 一
  • 01 背包专业化

    抱歉 如果这个问题已经得到解答 但我对算法没有深入的了解 并且并不总是注意到算法不同专业之间的微妙之处 我有 我认为是 01 背包问题的一个轻微变体 我有一个背包 其最大重量为 W 有 N 个重量为 w 价值为 v 的物品可供选择 我想要做
  • Google OR-Tools TSP 返回几个解决方案

    我最近一直致力于使用 Google 的 OR Tools 寻找最佳路线以外的内容 我找到了一个仓库中的示例 https github com google or tools blob master examples dotnet cshar

随机推荐

  • 使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像

    我们有一个 ASP NET 应用程序 用户可以用它来生成某些报告 到目前为止 我们有一个 PDF 模板 上面有一张图像 我们只需用我们以编程方式生成的图像 图表 替换该图像 我们使用了该网站的代码 http blog rubypdf com
  • Ansible playbook 检查用户是否存在或显示错误消息

    如何检查用户是否存在以及 如果存在 则继续下一个任务 如果不存在 则显示一条消息 Given user does not exist 您可以简单地使用获取模块 name get root user info getent database
  • F# 性能问题:编译器在做什么?

    参考这段代码 F 静态成员类型约束 为什么 例如 let gL G of 1L 1L 100000L gt List map fun n gt factorize gL n 明显慢于 1L 100000L gt List map fun n
  • 扩展样式表块

    我在基本布局中有样式表块 stylesheets filter cssrewrite bundles static css main css endstylesheets 我想知道是否可以在子模板中扩展此块 添加另一个或多个 CSS 链接
  • MeekroDB 错误“命令不同步;您现在无法运行此命令”

    我有一个包含以下几行的 PHP 脚本 require once meekrodb 2 1 class php DB user usr DB password pwd DB dbName db DB encoding utf8 results
  • 确定 CSV 的数据类型 - Python

    我是 Python 新手 在使用列表时遇到问题 我公开了我的问题 如您所见 我有一个具有以下结构的 datos csv 文件 1 4 0 none 2 2 0 3 0 none 2 2 5 2 5 tc 39 使用此函数我将数据存储在列表中
  • 是否可以声明带有属性的匿名非 IIFE JavaScript 函数

    我有一次发现 在将属性作为参数传递给其他函数之前 将属性分配给函数很有用 看起来像这样 对于匿名函数和变量分配函数对象之间的任何混淆 我感到抱歉 我认为它们不是同一件事 could strict mode have something to
  • 查找与 matlab 中向量的阶数相同的向量的唯一值

    我有一个向量 A 2 5 6 2 4 13 34 3 34 我想找到这个向量的唯一值 但不是按排序顺序 我在Matlab网站上搜索 发现了这个函数 C ia ic unique A rows stable 但是Matlab R2011a不识
  • 文件名上的 Posix I/O 操作顺序一致吗?

    我想知道是否有Posix标准保证对文件的修改通过重复保证是可见的open close调用相同的文件名 为了便于说明 请考虑以下 Bash 脚本 bin bash FILE mktemp echo Some data gt gt FILE c
  • 使用 Google Drive SDK iOS 创建文件夹

    我正在尝试使用适用于 iOS 的 Google Drive SDK 创建一个文件夹 来自此处的 Google 云端硬盘文档 https developers google com drive folder 它说创建文件夹就像创建具有特殊 M
  • 如何在 R 中重新排列图表

    我更新了我的diagrammer到版本 0 9 0 并开始从相同的数据渲染不同的图表 我的数据框现在看起来像这样 df lt data frame col1 c Cat Dog Bird col2 c Feline Canis Avis s
  • 如何免费制作 Xbox Live 独立游戏?

    有没有办法制作免费的 Xbox Live 独立游戏 现在我并不是想在市场上向全世界发布它 而是想在我的 Xbox 上免费测试它 我知道您必须在 Xbox 和 PC 上下载 XNA 应用程序 但我是否需要 XNA Creators Club
  • 通过镜像名称获取进程的进程句柄

    我需要使用 Win32 从 C 中最简单的方法通过可执行文件名获取另一个进程的进程句柄 我正在寻找的进程没有任何已注册的窗口类 我还知道 如果它正在运行 则只会有一个实例在运行 Use 创建Toolhelp32Snapshot 进程32优先
  • DATEADD 的 NSPredicate 语法?

    有没有办法在 NSPredicate 上执行 DateAdd 或 DateDiff 函数 谢谢你 何塞 事实上 有 这是一种迂回的做法 因为NSPredicate不直接支持它 即 你不能只是 anInterval to an NSDate
  • 如何找到线段上距离任意点最近的点?

    该函数应该接受一个点参数 该参数将用于查找线段对象上与其最近的点 在示例断言代码中 函数getClosestPoint Point takes Point 10 0 作为参数并应该返回Point 5 5 作为最接近的点Point 10 0
  • 如何在滚动停止时触发ajax请求?

    在窗口滚动上我正在执行这样的ajax请求 window scroll function doing ajax request 但它正在为滚动事件创建多个ajax 请求 是否有像 onscrollstop 这样的事件或仅在窗口滚动结束后触发的
  • 文本识别无法识别货币符号

    我正在移动视觉中使用文本识别 API 并尝试处理货币金额 OCR 目前支持基于拉丁语的语言 如法语 德语等 因此我认为该国的货币 欧元 将是一个可识别的符号 但据我所知 事实并非如此 为了检测 我是否应该更改语言首选项 是否有人有在移动视觉
  • Access DB Query 将由“,”分隔的列拆分为多行

    我使用的是Access DB 表中数据如下 ID Number 1 12 34 45 55 67 66 5 7 2 45 55 67 89 777 3 23 45 67 88 777 8888 564 4 1 234 567 890 987
  • 和 之间有什么区别? (点)和 $(美元符号)?

    点和点有什么区别 和美元符号 据我了解 它们都是不需要使用括号的语法糖 The 运算符是为了避免括号 在它之后出现的任何内容都将优先于之前出现的任何内容 例如 假设您有一行内容如下 putStrLn show 1 1 如果你想去掉这些括号
  • 具有多个箱子和约束的无界背包

    我是 Python 编码新手 需要帮助解决具有多个垃圾箱 4 个垃圾箱 和约束的无界背包问题 这些箱子的重量限制分别为 10 5 10 5 7 和 7 每个箱子只能装满某些物品 例如 仓 0 只能填充项目 0 9 仓 1 只能填充项目 10