【算法】装箱问题

news2024/12/28 19:42:49

一、引言

        装箱问题算法、Bin-Packing算法是一种典型的优化问题,广泛应用于物流、资源分配、内存管理等领域。

二、算法原理

        Bin-Packing问题可以描述为:给定一组大小不同的物品和一个容量有限的背包,如何将物品放入背包,使得背包内物品的总价值最大,且不超过背包容量。这里的物品大小和背包容量均为整数。

        Bin-Packing算法的目标是:将n个物品放入最少数量的背包中,使得每个背包的容量不超过给定值。

        Bin-Packing算法是一种组合优化问题,旨在将一组物品(具有不同的大小)放入有限数量的容器(或“箱子”)中,使得使用的容器数量最小化。该问题属于NP-hard问题,意味着没有已知的多项式时间算法可以解决所有实例。

三、数据结构

        物品:一个物品包含两个属性,分别是大小和编号。

        背包:一个背包包含一个属性,即当前已装入物品的总大小。

  • 数组:用于存储物品的大小。
  • 列表:用于存储每个容器中物品的分配情况。
  • :用于实现最佳适应算法时的快速查找。

四、算法使用场景

Bin-Packing算法的应用场景包括:

  • 内存管理:操作系统在内存分配时需要将进程的内存需求放入可用内存块中。
  • 物流与运输:在运输过程中,将货物装载到卡车或集装箱中。

  • 云计算:在云服务中,合理分配虚拟机资源。
  • 仓库存储:将不同规格的货物放入仓库,使得仓库空间利用率最高。

  • 虚拟机调度:将多个虚拟机分配到物理服务器上,使得服务器资源利用率最高。

五、算法实现

Bin-Packing算法有多种实现方式,以下介绍两种常见的算法:

        贪心算法(First Fit) (1)将物品按大小从小到大排序。 (2)遍历每个物品,将其放入第一个能容纳它的背包中。 (3)如果所有背包都无法容纳该物品,则创建一个新的背包。

        动态规划算法(Best Fit) (1)将物品按大小从小到大排序。 (2)遍历每个物品,找到能容纳它且剩余空间最小的背包。 (3)将物品放入该背包,更新背包的剩余空间。

六、其他同类算法对比

  • First Fit:按顺序放入第一个合适的容器。

  • Best Fit:放入能够容纳剩余空间最小的容器。
  • Next Fit:在上一个容器无法放入时,尝试放入新的容器。
  • Worst Fit:放入剩余空间最大的容器。
  • 贪心算法:Bin-Packing问题的贪心算法通常表现良好,但不能保证找到最优解。相较于动态规划,贪心算法实现简单且效率高。
  • 动态规划:可以找到最优解,但时间复杂度较高,适合物品数量和箱子数量较小的情况。
  • 回溯算法:通过尝试所有可能的组合来找到最优解,适合小规模问题,但效率低下。

七、多语言实现

    Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class BinPacking {
    public static List<List<Integer>> firstFit(int[] items, int binCapacity) {
        List<List<Integer>> bins = new ArrayList<>();
        for (int item : items) {
            boolean placed = false;
            for (List<Integer> bin : bins) {
                int binWeight = bin.stream().mapToInt(Integer::intValue).sum();
                if (binWeight + item <= binCapacity) {
                    bin.add(item);
                    placed = true;
                    break;
                }
            }
            if (!placed) {
                List<Integer> newBin = new ArrayList<>();
                newBin.add(item);
                bins.add(newBin);
            }
        }
        return bins;
    }

    public static void main(String[] args) {
        int[] items = {4, 8, 1, 4, 2, 1};
        int binCapacity = 10;
        List<List<Integer>> bins = firstFit(items, binCapacity);
        System.out.println("Bins: " + bins);
    }
}

Python

def first_fit(items, bin_capacity):
    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

if __name__ == "__main__":
    items = [4, 8, 1, 4, 2, 1]
    bin_capacity = 10
    bins = first_fit(items, bin_capacity)
    print("Bins:", bins)

C++

#include <iostream>
#include <vector>
#include <numeric>

std::vector<std::vector<int>> firstFit(int items[], int n, int binCapacity) {
    std::vector<std::vector<int>> bins;
    for (int i = 0; i < n; i++) {
        bool placed = false;
        for (auto &bin : bins) {
            if (std::accumulate(bin.begin(), bin.end(), 0) + items[i] <= binCapacity) {
                bin.push_back(items[i]);
                placed = true;
                break;
            }
        }
        if (!placed) {
            bins.push_back({items[i]});
        }
    }
    return bins;
}

int main() {
    int items[] = {4, 8, 1, 4, 2, 1};
    int binCapacity = 10;
    int n = sizeof(items) / sizeof(items[0]);
    auto bins = firstFit(items, n, binCapacity);
    
    std::cout << "Bins:\n";
    for (const auto &bin : bins) {
        std::cout << "[ ";
        for (int item : bin) {
            std::cout << item << " ";
        }
        std::cout << "]\n";
    }
    return 0;
}

Go

package main

import (
    "fmt"
)

func firstFit(items []int, binCapacity int) [][]int {
    bins := [][]int{}
    for _, item := range items {
        placed := false
        for i := range bins {
            binWeight := 0
            for _, bItem := range bins[i] {
                binWeight += bItem
            }
            if binWeight+item <= binCapacity {
                bins[i] = append(bins[i], item)
                placed = true
                break
            }
        }
        if !placed {
            bins = append(bins, []int{item})
        }
    }
    return bins
}

func main() {
    items := []int{4, 8, 1, 4, 2, 1}
    binCapacity := 10
    bins := firstFit(items, binCapacity)
    fmt.Println("Bins:", bins)
}

八、实际服务应用场景代码框架

服务框架设计

  • 服务接口:提供一个API接收物品和箱子容量。
  • 处理逻辑:使用Bin-Packing算法处理请求。
  • 返回结果:返回每个箱子的物品分配情况。

示例代码(使用Python Flask)

from flask import Flask, request, jsonify

app = Flask(__name__)

def first_fit(items, bin_capacity):
    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

@app.route('/bin-packing', methods=['POST'])
def bin_packing():
    data = request.json
    items = data.get('items', [])
    bin_capacity = data.get('bin_capacity', 10)
    bins = first_fit(items, bin_capacity)
    return jsonify(bins)

if __name__ == "__main__":
    app.run(debug=True)

测试服务

可以使用Postman或curl发送POST请求测试服务:

curl -X POST http://127.0.0.1:5000/bin-packing -H "Content-Type: application/json" -d '{"items": [4, 8, 1, 4, 2, 1], "bin_capacity": 10}'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prompt提示词工程尝试

使用提示前 添加prompt后 提示词中的内容 # Rule&#xff1a; 数学大师## Profile - author: bennie - version: 1.0 - language: 中文 - description: 你是数学领域的专家&#xff0c;擅长进行数学领域内容的逐步分析和推导## Skills - 深入理解数据大小的比较 - ## Back…

ssm新闻发布系统-计算机毕业设计源码68754

摘要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对新闻发布等问题&#xff0c;对新闻发布进行研…

【竞技宝】奥运会:郑钦文夺冠破纪录

郑钦文在2024奥运会女子网球单打决赛中2比0击败了克罗地亚选手维基奇&#xff0c;为中国网球赢得了历史上首枚奥运会金牌&#xff0c;同时也成为了首位站上奥运会最高领奖台的亚洲运动员。其实郑钦文是顶着巨大压力参加奥运会的比赛&#xff0c;而且为此损失了很多钱&#xff0…

翻转二叉树 - 力扣(LeetCode)C语言

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出…

springboot智能停车场管理系统-计算机毕业设计源码46885

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2 开发现状 1.3论文结构与章节安排 2 智能停车场管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用…

springboot集成websocket实现聊天室(极简版)

文章目录 前情描述websocket优势效果展示spring-boot后端html前端代码资源地址结语 前情描述 最近想了解websocket的相关原理&#xff0c;于是写了一个极简版的程序&#xff0c;后端使用springboot集成websocket模块&#xff0c;前端手敲了一个html页面&#xff08;页面很丑很…

多屏显卡调试

本文依照2017年11月8日一般工作日志改写。 目录 一、显卡选用 二、安装过程 &#xff08;1&#xff09;操作系统&#xff1a; &#xff08;2&#xff09;开机安装驱动 &#xff08;3&#xff09;调整连接线缆 &#xff08;4&#xff09;显卡设置 这是一个LED大屏幕系统&…

秒懂C++之List

目录 前言 一.常用接口展示 二.模拟常用接口 1.1 准备阶段 1.2 push_back 尾插 1.3 insert 插入 1.4 头插 1.5 erase 删除 1.6 clear 清理 析构 1.7 拷贝构造 1.8 赋值拷贝 1.9 反向迭代器 1.10 ->运算符重载 三.全部代码 前言 List其实就是我们前面数据结构学…

AUTOSAR之AUTOSAR OS(上)

1、OSEK OS 1.1 OSEK OS介绍 AUTOSAR OS是基于 OSEK OS发展而来&#xff0c;向下兼容OSEK OS&#xff0c;所以了解AUTOSAR OS之前我们了解一下OSEK OS。 OSEK操作系统&#xff08;OS&#xff09;是一个为分布式嵌入式系统所定义的单核操作系统。为适应汽车电子可靠性、实时性、…

【视觉SLAM】 十四讲ch7习题

简介 本文主要内容是《视觉SLAM十四讲》&#xff08;第二版&#xff09;第7章的习题解答&#xff0c;并介绍了在解答习题中的一下思考和总结的经验。本文代码部分参考了&#xff1a;HW-of-SLAMBOOK2 1、除了本书介绍的ORB特征点&#xff0c;你还能找到哪些特征点&#xff1f;…

Java聚合快递对接云洋系统小程序源码

&#x1f680;【物流新纪元】聚合快递如何无缝对接云洋系统&#xff0c;效率飙升秘籍大公开&#xff01;✨ &#x1f50d; 开篇揭秘&#xff1a;聚合快递的魅力所在 Hey小伙伴们&#xff0c;你是否还在为多家快递公司账号管理繁琐、订单处理效率低下而头疼&#xff1f;&#…

做不好PPT的原因

新手制作PPT长犯的10个错误 1.Word搬家 为了节约时间&#xff0c;直接把Word素材复制粘贴到PPT上&#xff0c;没有提炼 2.堆积图表 每个页面上堆积了大量的图表&#xff0c;却没有说明数据反映了什么趋势 3.图表业余 想用图表达自己的逻辑&#xff0c;但没有专业的模板&a…

【海洋生态环境】十大数据集合集,速看!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 MAI (Multi-scene Aerial Image) 发布方&#xff1a; 不列颠哥伦比亚大学德国航空航天中心慕尼黑大学 发布时间&#xff1a; 2021 简介&#xff1a; MAI 是用于在单个航拍图像中…

【原创】下载RealEstate10K数据集原始视频的方法

前言&#xff1a;目前互联网上能搜到下载RealEstate10K数据集原始视频的方法都已经不能用了&#xff0c;这篇博客介绍一种目前可用的下载RealEstate10K数据集原始视频的方法&#xff0c;并给出自动化的脚本代码。 目录 RealEstate10K简介 RealEstate10K标注文本下载 RealEst…

WhatsApp接不到验证码?快来看这个新功能,绑定邮箱

很多外贸朋友经常会因为WhatsApp接不到验证码来加我问这个解决方案&#xff0c;基本上我会的我都会帮一下忙。最近WhatsApp更新了一个非常实用的功能&#xff0c;绑定电子邮箱的功能&#xff0c;这个功能可以协助进行WhatsApp验证码的接收&#xff0c;下面来看下如何进行绑定吧…

【Linux-Platform】

目录 1. Linux驱动的分离与分层1.1 为什么要进行Linux驱动的分离与分层1.2 Linux驱动的分层 2. 驱动-总线-设备2.1 总线2.2 驱动2.3 设备 3. platform平台设备总线3.1 platform总线注册3.2 platform驱动3.3 platform设备 1. Linux驱动的分离与分层 1.1 为什么要进行Linux驱动的…

【人工智能专栏】基于人类反馈对语言模型进行强化学习 (RLHF)

Reinforcement Learning from Human Feedback (RLHF) 技术分解 字面上说,RLHF就是基于人类反馈(Human Feedback)对语言模型进行强化学习(Reinforcement Learning),和一般的fine-tune过程乃至prompt tuning自然也不同。RLHF 是一项涉及多个模型和不同训练阶段的复杂概念…

C++ 基础入门篇

文章目录 命名空间输入与输出缺省参数函数重载引用和const引用inline&#xff08;内联函数&#xff09; 命名空间 定义&#xff1a;命名空间需要用到namespace关键字&#xff0c;其后跟着命名空间的名字&#xff08;自定义&#xff09;&#xff0c;再接着就是一对花括号&#x…

气膜建筑在工业仓储厂房中的应用优势—轻空间

随着工业生产的快速发展&#xff0c;对仓储厂房的需求日益增长。气膜建筑作为一种新型的建筑形式&#xff0c;因其独特的优势在工业仓储领域逐渐受到青睐。以下是气膜建筑在工业仓储厂房中的主要应用优势。 快速建设与灵活布局 气膜建筑的一个显著优势是其建设速度快&#xff0…

免费分享:2021-2100中国多情景逐年干燥度模拟数据(附下载方法)

AI是表征一个地区干湿程度的指标&#xff0c;一般来说&#xff0c;根据AI分类可以概括地把区域分为湿润&#xff08;AI<1&#xff0c;相当于森林&#xff09;、半湿润&#xff08;AI在1-1.5&#xff0c;相当于森林草原&#xff09;、半干旱&#xff08;AI在1.5-4&#xff0c…