MATLAB初学者入门(11)—— 贪心算法

        贪心算法是一种简单直观的算法设计方法,常用于解决需要做出一系列选择以达到最优解的问题。贪心算法的核心思想是每一步都选择当前看起来最好的选项,而不考虑大局。这种方法通常易于实现,但不总是能得到全局最优解。下面,将详细介绍如何在MATLAB中实现贪心算法。

案例分析:分数背包问题

        假设你是一个小偷,打算抢劫一个商店。你有一个可以承载限定重量的背包,商店里有多种物品,每种物品都有其重量和价值,你可以拿走整个物品或者物品的一部分。目标是在不超过背包承重的情况下,最大化背包中物品的总价值。

步骤 1: 定义物品和背包

        首先定义各个物品的重量和价值,以及背包的最大承重。

weights = [10, 20, 30];  % 各物品的重量
values = [60, 100, 120];  % 各物品的价值
capacity = 50;  % 背包的最大承重
步骤 2: 计算价格与重量的比率

        为了应用贪心策略,我们需要计算每个物品单位重量的价值(即价值与重量的比率),并按此比率降序排序物品。

% 计算单位重量的价值并排序
[valuePerWeight, indices] = sort(values ./ weights, 'descend');
sortedWeights = weights(indices);
sortedValues = values(indices);
步骤 3: 贪心算法选择物品

        遍历排序后的物品列表,尽可能多地取每种物品,直到背包装不下为止。

totalValue = 0;
remainingCapacity = capacity;for i = 1:length(sortedWeights)if remainingCapacity == 0break;endif sortedWeights(i) <= remainingCapacity% 如果当前物品可以完全装入背包totalValue = totalValue + sortedValues(i);remainingCapacity = remainingCapacity - sortedWeights(i);else% 如果当前物品只能装入一部分totalValue = totalValue + valuePerWeight(i) * remainingCapacity;break;end
end
步骤 4: 输出结果

        显示背包中物品的总价值。

disp(['Total value in the knapsack: ', num2str(totalValue)]);

案例分析:最小生成树的贪心算法——Kruskal算法

        Kruskal算法是解决最小生成树问题的一种贪心算法。该算法按照边的权重(成本)顺序,从最小的开始选择,只要这条边不会与已选择的边形成环。

步骤 1: 定义图

        首先定义图的节点和边,以及每条边的权重。

% 示例数据 - 每个元素表示一条边和其两个节点和权重
edges = [1 2 7; 1 3 5; 2 3 9; 2 4 8; 2 5 7; 3 4 15; 3 5 6; 4 5 8; 4 6 9; 5 6 11];
% 边由其两个端点和权重组成
步骤 2: 对边按权重排序

        为了应用贪心策略,我们需要按边的权重升序排序。

% 按权重排序边
[sortedEdges, index] = sortrows(edges, 3);
步骤 3: 使用Kruskal算法构建最小生成树

        使用并查集数据结构来检测环。

% 初始化并查集
numNodes = max(max(edges(:,1:2)));  % 获取节点数
parent = 1:numNodes;% 查找根节点函数
function p = find(parent, i)while parent(i) ~= ii = parent(i);endp = i;
end% 并查集合并函数
function parent = union(parent, x, y)rootX = find(parent, x);rootY = find(parent, y);if rootX ~= rootYparent(rootY) = rootX;end
end% Kruskal主算法
mst = [];  % 存储MST中的边
for i = 1:size(sortedEdges, 1)if find(parent, sortedEdges(i, 1)) ~= find(parent, sortedEdges(i, 2))mst = [mst; sortedEdges(i, :)];  % 添加边到MSTparent = union(parent, sortedEdges(i, 1), sortedEdges(i, 2));end
end
步骤 4: 输出最小生成树和总成本

        显示构建的最小生成树和其总权重。

disp('Edges in the Minimum Spanning Tree:');
disp(mst);
totalCost = sum(mst(:,3));
disp(['Total cost of the Minimum Spanning Tree: ', num2str(totalCost)]);

案例分析:活动选择问题

        假设你有多个活动,每个活动都有一个开始时间和结束时间。任务是选择最大集合的相互兼容活动(即它们不重叠)。这是一个典型的贪心算法应用场景,通常通过选择结束时间最早的活动来实现。

步骤 1: 定义活动

        首先定义一组活动及其开始和结束时间。

% 示例数据:每行一个活动,第一列为开始时间,第二列为结束时间
activities = [1, 4;3, 5;0, 6;5, 7;3, 9;5, 9;6, 10;8, 11;8, 12;2, 14;12, 16;
];% 对活动按结束时间排序
sortedActivities = sortrows(activities, 2);
步骤 2: 应用贪心策略选择活动

        选择结束时间最早的活动,然后选择下一个与已选择活动不冲突的结束时间最早的活动。

% 选择活动
selectedActivities = [];
lastEndTime = -inf;for i = 1:size(sortedActivities, 1)if sortedActivities(i, 1) >= lastEndTimeselectedActivities = [selectedActivities; sortedActivities(i, :)];lastEndTime = sortedActivities(i, 2);end
end
步骤 3: 输出结果

        展示选定的活动以及总数。

disp('Selected activities (start time, end time):');
disp(selectedActivities);
disp(['Total number of selected activities: ', num2str(size(selectedActivities, 1))]);

结论

(1)在这个分数背包问题的例子中,贪心算法提供了一种有效的方法来快速求解,并通常能得到非常接近最优解的结果。此案例显示了贪心算法在解决优化问题中的实用性,特别是当问题允许采取“分数解”时,贪心策略特别有效。
        贪心算法虽然简单且易于实现,但它有时可能不会提供一个全局最优解,特别是在要求得到全局最优解的问题中。因此,在应用贪心算法时,需要仔细考虑问题的特性和对解的要求。在一些问题中,可能还需要与其他算法(如动态规划或回溯算法)结合使用,以达到更好的效果。

(2)通过此案例,Kruskal算法成功解决了最小生成树问题,展示了贪心算法在网络设计和优化中的实用性。此算法不仅适用于电信或计算机网络的设计,还广泛应用于其他需要高效连接多个点的场景,如交通规划、供电网络等。Kruskal算法以其简单和高效的特点,在工程和科学计算中非常有用。此外,MATLAB提供的矩阵和数组操作功能使得实现此类算法变得直接和高效。

(3)在这个活动选择问题中,我们利用贪心算法成功地选择了最大数量的互不冲突的活动。此案例表明贪心算法在解决调度和规划问题中的高效性,特别是在需要做出一系列优化选择时。贪心策略通常简单易实现,且在许多情况下可以提供最优或接近最优的解决方案。此外,由于算法的直观性和效率,它广泛应用于实时系统和其他需要快速决策的应用中。
        此类贪心算法不仅适用于会议或活动安排,也可以扩展到资源分配、工作调度等其他领域,为这些领域中的优化问题提供了有效的解决策略。通过探索和实施这些策略,可以优化决策过程,提高系统的整体效率和效果。

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

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

相关文章

CWDM/DWDM系统应用解决方案

波分复用(WDM)包括粗波分复用(CWDM)和密集波分复用(DWDM)。 它是指在一根光纤上同时传输多个不同波长的信号。 主要目的 WDM就是增加光纤的可用带宽&#xff0c;无需铺设额外的光缆即可进行扩容。 因此&#xff0c;被电信公司广泛采用。 CWDM 和 DWDM 有什么区别&#xff1f; …

充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言 很多充电器&#xff0c;为了能控制电流输出&#xff0c;也就是充电时需要有小电流、大电流的情况&#xff0c;都会用副边及单片机进行控制&#xff0c;但因为是副边控制&#xff0c;需要一个比较器、一个二极管、若干电阻、若干电容&#xff0c;整体BOM成本可能多了三毛钱…

小红书护肤行业笔记怎么写?纯干货!

小红书上都是年轻爱美的用户群体&#xff0c;所以护肤行业在小红书上做推广很吃香&#xff0c;小红书护肤行业笔记怎么写&#xff1f;接下来&#xff0c;伯乐网络传媒将从护肤行业笔记文案的特点和写作技巧两个方面给大家讲一讲。 一、护肤行业笔记文案特点 1. 突出个人情况 …

【Qcom Camera】DumpDebugInfo分析

DumpDebugInfo&#xff1a; DumpDebugInfo主要包括Session::DumpDebugInfo、Pipeline::Dumpdebuginfo、Node::Dumpdebuginfo、DRQ::Dumpdebuginfo、Usecase::DumpDebugInfo log&#xff1a;Hit SOF threshold of [xx] consecutive frames CamX: [ERROR][CORE ] camxpip…

Spring Boot入门(20):轻松搞定多数据源配置,Spring Boot与Mybatis-Plus的完美结合!

前言 本文将介绍如何在Spring Boot框架下使用mybatis-plus实现多数据源配置。多数据源配置是一个常见的需求&#xff0c;在实际项目中也经常遇到&#xff0c;因此掌握多数据源配置的技巧是非常重要的。 摘要 本文将为大家介绍如何使用Spring Boot和mybatis-plus实现多数据源…

路由过滤,策略实验

1配置ip [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 192.168.0.1 32 [r1-LoopBack0]int l1 [r1-LoopBack1]ip add 192.168.1.1 32 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 100.1.1.2 24 [r…

掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

自动化测试的三种测试报告模板

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

java中多线程的创建方式及常用的方法

目录 概述 继承Thread类&#xff1a; 实现Runnable接口&#xff1a; 实现Callable接口&#xff1a; 示例代码 继承Thread类示例 实现Runnable接口示例 实现Callable接口示例 调用三种线程测试示例 线程常用的成员方法 概述 常见的创建线程的方式包括&#xff1a;继承…

Axure糖尿病健康管理APP原型图,医疗保健血糖监测饮食控制

作品概况 页面数量&#xff1a;共 50 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图&#xff0c;设计规范内容清晰…

浏览器跨标签页通信的方式都有哪些

跨标签页的实际应用场景&#xff1a; 1. 共享登录状态&#xff1a; 用户登录后&#xff0c;多个标签页中需要及时获取到登录状态&#xff0c;以保持一致的用户信息。这种情况&#xff0c;可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态&#xff0c;并通过…

difflib 标准库详解:Python 文本对比的利器

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 difflib 模块是 Python 标准库中的一个模块&#xff0c;用于比较文本之间的差异。它提供了一些函数和类&#xff0c;可以帮助你找到两个字符串或列表之间的…

“傻瓜”学计量——核密度估计KDE

提纲&#xff1a; 什么是核密度估计&#xff0c;是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知&#xff0c;这时&#xff0c;为了对样本数据进行建模&#xff0c;需要估计样本数据…

视频质量评价 FISM 算法详细介绍

FISM FSIM(Feature Similarity Index)是一种全参考图像质量评估(IQA)方法,它基于人类视觉系统(HVS)的特性,利用图像的底层特征来评估图像质量。 FSIM算法来自2011年一篇高引用论文{ FSIM: A Feature SIMilarity Index for Image Quality Assessment };SSIM算法一经提…

进阶C语言-文件操作

文件操作 &#x1f388;1.为什么使用文件&#x1f388;2.什么是文件&#x1f52d;2.1程序文件&#x1f52d;2.2数据文件&#x1f52d;2.3文件名 &#x1f388;3.文件的打开和关闭&#x1f52d;3.1文件指针&#x1f52d;3.2文件的打开和关闭 &#x1f388;1.为什么使用文件 ✅ 我…

标准解读|美国纽扣硬币电池新规UL 4200A-2023标准详解

深度解析美国新纽扣电池安全标准UL4200A-关注儿童安全,推动全行业提升 近年来,儿童不慎吞咽纽扣电池并导致严重伤害甚至死亡的事故时有发生,引起社会高度关注。为了降低此类安全隐患,美国权威安全认证机构UL于发布了新的纽扣电池安全标准UL 4200A,对相关电池和产品提出了更严格…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”&#xff0c;面对复杂多变的现实环境&#xff0c;multi-agent应运而生。相较于单打独斗的single-agent&#xff0c;multi-agent集结了多个功能各异的LLM&#xff0c;共同攻克难关。然而&#xff0c;这种协同作战的方式也带来了沉重的推理负担&#xff0c;限制了…

500道Python毕业设计题目推荐,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

React自定义Hook函数:高效组件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…