【贪心算法】【Python实现】最优装载问题

文章目录

    • @[toc]
      • 问题描述
        • 形式化描述
      • 贪心算法
        • 贪心选择性质
        • 最优子结构性质
      • `Python`实现
      • 时间复杂性

问题描述

  • 有一批集装箱要装上一艘载重量为 c c c的轮船,其中集装箱 i i i的重量为 w i w_{i} wi
  • 在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船
形式化描述

{ max ⁡ ∑ i = 1 n x i ∑ i = 1 n w i x i ≤ c x i ∈ { 0 , 1 } , 1 ≤ i ≤ n \begin{cases} \max\displaystyle\sum\limits_{i = 1}^{n}{x_{i}} \\ \displaystyle\sum\limits_{i = 1}^{n}{w_{i} x_{i}} \leq c \end{cases} \kern{2em} x_{i} \in \set{0 , 1} , 1 \leq i \leq n maxi=1nxii=1nwixicxi{0,1},1in


贪心算法

  • 采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解
贪心选择性质
  • 设集装箱已依其重量从小到大排序, ( x 1 , x 2 , ⋯ , x n ) (x_{1} , x_{2} , \cdots , x_{n}) (x1,x2,,xn)是最优装载问题的一个最优解,设 k = min ⁡ 1 ≤ i ≤ n { i ∣ x i = 1 } k = \min\limits_{1 \leq i \leq n}{\set{i \mid x_{i} = 1}} k=1inmin{ixi=1},如果给定的最优装载问题有解,则 1 ≤ k ≤ n 1 \leq k \leq n 1kn
    • k = 1 k = 1 k=1时, ( x 1 , x 2 , ⋯ , x n ) (x_{1} , x_{2} , \cdots , x_{n}) (x1,x2,,xn)是一个满足贪心选择性质的最优解
    • k > 1 k > 1 k>1时,取 y 1 = 1 y_{1} = 1 y1=1 y k = 0 y_{k} = 0 yk=0 y i = x i y_{i} = x_{i} yi=xi 1 < i ≤ n 1 < i \leq n 1<in i ≠ k i \neq k i=k,则 ∑ i = 1 n w i y i = w 1 − w k + ∑ i = 1 n w i x i ≤ ∑ i = 1 n w i x i ≤ c \displaystyle\sum\limits_{i = 1}^{n}{w_{i} y_{i}} = w_{1} - w_{k} + \displaystyle\sum\limits_{i = 1}^{n}{w_{i} x_{i}} \leq \displaystyle\sum\limits_{i = 1}^{n}{w_{i} x_{i}} \leq c i=1nwiyi=w1wk+i=1nwixii=1nwixic,因此, ( y 1 , y 2 , ⋯ , y n ) (y_{1} , y_{2} , \cdots , y_{n}) (y1,y2,,yn)是所给最优装载问题的可行解
  • ∑ i = 1 n y i = ∑ i = 1 n x i \displaystyle\sum\limits_{i = 1}^{n}{y_{i}} = \displaystyle\sum\limits_{i = 1}^{n}{x_{i}} i=1nyi=i=1nxi知, ( y 1 , y 2 , ⋯ , y n ) (y_{1} , y_{2} , \cdots , y_{n}) (y1,y2,,yn)是满足贪心选择性质的最优解,所以,最优装载问题具有贪心选择性质
最优子结构性质
  • ( x 1 , x 2 , ⋯ , x n ) (x_{1} , x_{2} , \cdots , x_{n}) (x1,x2,,xn)是最优装载问题的满足贪心选择性质的最优解,则 x 1 = 1 x_{1} = 1 x1=1 ( x 2 , x 3 , ⋯ , x n ) (x_{2} , x_{3} , \cdots , x_{n}) (x2,x3,,xn)是轮船载重量为 c − w 1 c - w_{1} cw1、待装船集装箱为 { 2 , 3 , ⋯ , n } \set{2 , 3 , \cdots , n} {2,3,,n}时相应最优装载问题的最优解,也就是说,最优装载问题具有最优子结构性质

Python实现

def loading_ship(containers, capacity):# 将集装箱组织成 (索引, 重量) 二元组形式containers = list(enumerate(containers))# 按照集装箱的重量进行排序containers.sort(key=lambda x: x[1])# 记录已经装载的集装箱索引loaded_containers = []# 记录当前已经装载的总重量current_weight = 0# 遍历每个集装箱for index, weight in containers:# 如果当前集装箱的重量加上已经装载的总重量不超过轮船的载重量, 则将集装箱装上轮船if current_weight + weight <= capacity:current_weight += weightloaded_containers.append(index)else:# 如果无法装载当前集装箱, 则退出循环breakloaded_containers.sort()return loaded_containerscontainers = [3, 5, 2, 7, 4, 1]
capacity = 10res = loading_ship(containers, capacity)print(f'装载的集装箱索引: {res}')
装载的集装箱索引: [0, 2, 4, 5]

时间复杂性

  • 算法的主要计算量在于将集装箱依其重量从小到大排序,所以算法所需的计算时间为 O ( n log ⁡ n ) O(n \log{n}) O(nlogn)

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

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

相关文章

SSM学习路线推荐

文章目录 时间安排javawebjdbcspring5springMVCMyBatis 前两天有朋友问我ssm怎么学的&#xff0c;去翻了翻当时学完之后记的总结 友情提示&#xff1a;该文主要分享自己看过的b站免费视频评价&#xff0c;仅代表个人观点 时间安排 因为已经过去好久了&#xff0c;只能凭记忆想…

Java基础(35)网站前端优化技术

网站前端优化是一个持续的过程&#xff0c;涉及多个方面的技术策略。深入详细的前端优化可以大致分为以下几个方面&#xff1a; 1. 代码优化 最小化和压缩资源 CSS/JS压缩&#xff1a;使用工具如UglifyJS、Terser、CSSNano等去除代码中的空格、注释&#xff0c;减少文件大小…

【微信小程序开发(从零到一)【婚礼邀请函】制作】——任务分析和效果实现的前期准备(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

深入浅出Java中的数据结构:LinkedHashMap详解

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

hive获取这周五到下周四的区间,周一到周日的区间

-- 获取每个日期所在周期的开始和结束时间 SELECTcreated_date AS date_in_period,CASEWHEN date_format(created_date, u) < 5 THEN date_sub(created_date, cast(date_format(created_date, u) AS INT) 2)ELSE date_sub(created_date, cast(date_format(created_date, u)…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…

[第五空间 2021]WebFTP

目录扫描git泄露phpinfo.php 一开始想到是sql注入&#xff0c;但是不行。目录扫描&#xff0c;发现 .git 和 phpinfo.php 访问phpinfo.php&#xff0c;ctrlf 搜索 flag&#xff0c;找到 flag。

Vue 封装axios

【一】准备工作 &#xff08;1&#xff09;安装必要插件 安装Axios&#xff0c;这是必要的。默认最新版 npm install axios -S 或 cnpm install axios -S安装elementui-plus&#xff0c;用于提示信息 npm install element-plus --save # 或 cnpm install element-plus --s…

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于随机森林(Random Forest, RF)的风电功率预测是一种常用且有效的方法。以下是基于RF的风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括风速、风向、温度、湿度等气象数据以及风电场的历史功率数…

第七篇 Asciidoc中使用PlantUML 绘制各种示意图

示意图的特点 示意图表示的是大体上描述或表示物体的形状、相对大小、物体与物体之间的联系(关系),描述某器材或某机械的大体结构和工作的基本原理,描述某个工艺过程简单图示都叫做示意图。 示意图的特点就是简单明了,它突出了重点,忽略很多次要的细节。老师上课时在黑板…

MKS 电源 :EDGE 30R40A 400kh 现货 功能正常

MKS 电源 :EDGE 30R40A 400kh 现货 功能正常

Java注解的作用

注解介绍 Java注解是从Java5开始添加到java中的。 Java的注解可以说成是一种标记&#xff0c;标记一个类或者一个字段&#xff0c;经常是和反射&#xff0c;AOP结合起来进行使用。一般是定义一个注解&#xff0c;如果某个被注解的类或者字段符合条件&#xff0c;就执行某些能…

嵌入式开发四大平台介绍

MCU&#xff08;Micro Control Unit&#xff09;四大平台介绍&#xff09; 单片机优点&#xff1a;缺点&#xff1a;总结&#xff1a; DSP digital signal processingARM优点&#xff1a;缺点&#xff1a;总结 FPGA什么事FPGA&#xff08;集成元件库&#xff09;FPGA开发方法—…

Mysql的数据如何导入mongdb

将MySQL的数据导入MongoDB&#xff0c;有多种方法可以实现。以下是其中的一些常见方法&#xff1a; 使用可视化工具MongoVUE&#xff1a; 选中MongoVUE中的数据库节点&#xff0c;点击Database菜单&#xff0c;选择Import->from MySql。 填入相关参数&#xff0c;即可连接…

【微记录】dmidecode是干什么的?常用来做什么?如何查看系统支持的PCIe版本号(本质:标准,Desktop Management Interface)

是什么 dmidecode 是一个在 Linux 系统提取硬件信息的命令行工具。DMI 代表桌面管理接口&#xff08;Desktop Management Interface&#xff09;&#xff0c;是一种标准&#xff0c;收集桌面计算机的硬件信息&#xff0c;包括系统制造商、序列号、BIOS 信息、系统资产标签等。…

10分钟快速掌握正则表达式

一、背景 因为工作的时候要做一些表单校验和精准搜索。所以写下这篇文章。 当涉及到正则表达式的理解和使用时&#xff0c;尽管它们提供了强大的文本处理能力&#xff0c;但其语法的复杂性常常让人倍感挑战。即使是对经常使用正则表达式的专业开发者来说&#xff0c;也常常会因…

在数据挖掘中,如何使用grep和正则表达式从CSV文件中提取特定字段?

在数据挖掘中&#xff0c;你可以使用grep和正则表达式来提取CSV文件中的特定字段。以下是一些步骤和例子&#xff0c;展示如何进行操作&#xff1a; 确定要提取的字段&#xff1a;首先&#xff0c;你需要知道要提取的数据在CSV文件中的确切位置或者它的特征&#xff08;比如&am…

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店评论情感分析 酒店价格预测系统 酒店可视化 酒店爬虫 neo4j知识图谱 深度学习

广东科技学院毕业设计(论文)开题报告 设计(论文)名称 民宿数据可视化分析系统的设计与实现 设计(论文)类型 C 指导教师 朱富裕 学 院 计算机学院 专 业 数据科学与大数据技术 姓 名 庄贵远 学 号 2020135232 班 级 20大数据本科2班 选题依据(包括项目研究的…

Nginx 生产环境部署的最佳实践

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 最近一段时间&#xff0c;我一直在和大家一起探讨Nginx的相关话题。期间&#xff0c;我收到了很多小伙伴的私信&#xff0c;他们好奇地问我&#xff1a;在生产环境中&#xff0c;Nginx应该如何配置&#xff1f; 他们在…

文件加密与解密技术实战:使用Java实现AES/CBC/PKCS5Padding加密算法

文件加密与解密技术实战&#xff1a;使用Java实现AES/CBC/PKCS5Padding加密算法 在数据保护和信息安全领域&#xff0c;文件加密是一项至关重要的技术。本文将通过一个实际的Java示例项目&#xff0c;深入浅出地介绍如何利用AES加密标准中的CBC模式及PKCS5Padding填充方式&…