当前位置: 首页 > news >正文

常见的近似算法

前言

最近有个项目要用到近似算法,就到处摸了下,整理了一个小结。

近似算法统计

在Java中,你可以使用各种近似算法来解决不精确但接近于最优解的问题。以下是几种常见的近似算法的实现方法:

  1. 贪心算法(Greedy Algorithm):贪心算法在每一步选择中,都选择当前看起来最好的选择,以希望最终达到全局最优解。贪心算法通常很高效,但不能保证一定能得到最优解。在Java中,你可以通过循环和条件语句来实现贪心算法。

  2. 近似随机抽样(Approximate Random Sampling):近似随机抽样是通过在数据集中随机抽取样本来估计整个数据集的特征。在Java中,你可以使用随机数生成器来进行近似随机抽样,然后根据样本数据来估计整个数据集的特征。

  3. 近似动态规划(Approximate Dynamic Programming):动态规划是一种通过将问题划分为更小的子问题来求解最优解的方法。然而,在某些情况下,完全的动态规划解决方案可能会非常耗时。在这种情况下,可以使用近似动态规划算法来求得一个接近最优解的近似解。在Java中,你可以使用迭代和递归来实现近似动态规划算法。

  4. 近似启发式搜索(Approximate Heuristic Search):启发式搜索是一种通过评估可能的解决方案并选择具有最高评估值的方案来进行问题求解的方法。在近似启发式搜索中,你可以通过选择次优解或使用启发式评估函数来近似最优解。在Java中,你可以使用优先队列或其他数据结构来实现近似启发式搜索算法。

贪心算法(Greedy Algorithm)

实现步骤

要使用Java实现贪心算法(Greedy Algorithm),你可以按照以下步骤进行:

  1. 理解问题:首先,你需要理解所要解决的问题,并明确问题的约束条件和目标。

  2. 设计贪心策略:根据问题的特点,设计一个贪心策略。贪心策略意味着每一步都选择当前看起来最好的选择,以期望最终达到全局最优解。在设计贪心策略时,你需要考虑如何确定当前最好的选择,以及如何更新问题状态。

  3. 实现贪心算法:在Java中,你可以使用循环和条件语句来实现贪心算法。根据贪心策略,通过循环遍历问题的每一步,并根据当前状态选择最佳的动作。

代码示例

下面是一个简单的示例,演示了如何使用贪心算法来解决背包问题:

import java.util.Arrays;public class Item implements Comparable<Item> {int weight;int value;public Item(int weight, int value) {this.weight = weight;this.value = value;}/*** 按照价值重量比降序排序** @param item 项目* @return int*/@Overridepublic int compareTo(Item item) {double ratio1 = (double) this.value / this.weight;double ratio2 = (double) item.value / item.weight;if (ratio1 > ratio2) {return -1;} else if (ratio1 < ratio2) {return 1;} else {return 0;}}
}/*** 贪婪算法示例** @author admin* @date 2023/11/17*/
public class GreedyAlgorithmExample {public static void main(String[] args) {Item[] items = new Item[4];items[0] = new Item(2, 50);items[1] = new Item(3, 30);items[2] = new Item(5, 60);items[3] = new Item(4, 40);Arrays.sort(items);// 按照价值重量比降序排序int capacity = 5;int totalValue = 0;for (Item item : items) {if (capacity >= item.weight) {capacity -= item.weight;totalValue += item.value;} else {// 部分装入背包double fraction = (double) capacity / item.weight;totalValue += fraction * item.value;break;}}System.out.println("背包能获取的最大价值为: " + totalValue);}
}

在上述示例中,我们创建了一个Item类表示背包中的物品,实现了Comparable接口以便进行排序。我们使用Arrays.sort()方法将物品按照价值重量比的降序排序。然后,我们使用贪心策略遍历每个物品,将尽可能多的物品放入背包,直到背包容量不足为止。最后,计算背包能获取的最大价值并打印出来。

请注意,贪心算法并不适用于所有问题,并且无法保证得到全局最优解。因此,在实际应用中,需要根据问题的特点来选择适当的算法。

近似随机抽样

近似随机抽样(Approximate Random Sampling)是一种通过在数据集中随机选择样本来估计整个数据集的特征的方法。在Java中,你可以使用随机数生成器来实现近似随机抽样。下面是一个使用

Java实现近似随机抽样的简单示例:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 近似随机抽样** @author admin* @date 2023/11/17*/
public class ApproximateRandomSampling {public static void main(String[] args) {List<Integer> dataset = new ArrayList<>();for (int i = 1; i <= 100; i++) {dataset.add(i);}int sampleSize = 10;List<Integer> sample = getRandomSample(dataset, sampleSize);System.out.println("随机样本:" + sample);}public static List<Integer> getRandomSample(List<Integer> dataset, int sampleSize) {List<Integer> sample = new ArrayList<>();Random random = new Random();int datasetSize = dataset.size();for (int i = 0; i < sampleSize; i++) {int randomIndex = random.nextInt(datasetSize);sample.add(dataset.get(randomIndex));}return sample;}
}

在上述示例中,我们首先创建一个包含1到100的整数的数据集。然后,我们指定样本大小为10,并使用getRandomSample()方法来获取随机样本。在getRandomSample()方法中,我们使用Random类生成一个随机数生成器,并使用nextInt()方法在数据集的索引范围内随机选择索引。然后,我们通过这些索引来获取数据集中对应的元素,并将其添加到样本中。最后,我们返回样本。

可以根据实际需求调整示例中的数据集和样本大小。请注意,这只是一个简单的示例,实际应用中可能需要更复杂的抽样算法来确保抽样的准确性和偏差控制。

近似动态规划(Approximate Dynamic Programming)

近似动态规划(Approximate Dynamic Programming)是一种通过将问题划分为更小的子问题来求解最优解的方法。在Java中,你可以使用迭代和递归来实现近似动态规划算法。下面是一个示例,演示了如何使用近似动态规划来解决背包问题:

/*** 近似动态规划** @author admin* @date 2023/11/17*/
public class ApproximateDynamicProgramming {public static void main(String[] args) {int[] weights = {2, 3, 5, 4};int[] values = {50, 30, 60, 40};int capacity = 5;int[][] memo = new int[weights.length + 1][capacity + 1];int maxTotalValue = knapsack(weights, values, capacity, memo);System.out.println("背包能获取的最大价值为:" + maxTotalValue);}public static int knapsack(int[] weights, int[] values, int capacity, int[][] memo) {int n = weights.length;for (int i = 0; i <= n; i++) {for (int w = 0; w <= capacity; w++) {if (i == 0 || w == 0) {memo[i][w] = 0;} else if (weights[i - 1] <= w) {memo[i][w] = Math.max(values[i - 1] + memo[i - 1][w - weights[i - 1]], memo[i - 1][w]);} else {memo[i][w] = memo[i - 1][w];}}}return memo[n][capacity];}
}

在上述示例中,我们有一个背包问题,其中给定了物品的重量和价值数组,以及背包的容量。我们使用knapsack()方法来实现近似动态规划算法。我们使用一个二维数组memo来存储子问题的结果,以避免重复计算。在knapsack()方法中,我们使用嵌套的循环来填充memo数组,计算出每个子问题的最优解。

memo[i][w]表示在有前i个物品和背包容量为w的情况下,可以获得的最大价值。我们使用递归的公式来计算memo[i][w]

  • 如果第i个物品的重量小于等于w,则可以选择将其放入背包或不放入背包,取两者中的最大值。

  • 如果第i个物品的重量大于w,则只能选择不放入背包。

最后,我们返回memo[n][capacity],其中n是物品的数量,capacity是背包的容量,即为近似动态规划算法的最优解。

请注意,这只是一个简单的示例,实际应用中可能需要根据问题的特点来设计更复杂的递归公式以及构建合适的记忆化数组。

近似动态规划(Approximate Dynamic Programming)

近似启发式搜索(Approximate Heuristic Search)是一种通过评估可能的解决方案并选择具有最高评估值的方案来进行问题求解的方法。在Java中,你可以使用优先队列(PriorityQueue)或其他数据结构来实现近似启发式搜索算法。以下是一个示例,演示了如何使用近似启发式搜索来解决旅行商问题(Traveling Salesman Problem):

import java.util.Arrays;
import java.util.PriorityQueue;/*** 近似启发式搜索** @author admin* @date 2023/11/17*/
public class ApproximateHeuristicSearch {public static void main(String[] args) {int[][] graph = {{0, 10, 15, 20}, {10, 0, 35, 25}, {15, 35, 0, 30}, {20, 25, 30, 0}};int startCity = 0;int[] path = approximateTSP(graph, startCity);System.out.println("近似最短路径为:" + Arrays.toString(path));}public static int[] approximateTSP(int[][] graph, int startCity) {int n = graph.length;boolean[] visited = new boolean[n];int[] path = new int[n];int pathIndex = 0;visited[startCity] = true;path[pathIndex++] = startCity;while (pathIndex < n) {PriorityQueue<Edge> priorityQueue = new PriorityQueue<>();for (int i = 0; i < n; i++) {if (!visited[i]) {priorityQueue.offer(new Edge(startCity, i, graph[startCity][i]));}}Edge minEdge = priorityQueue.poll();int nextCity = minEdge.to;visited[nextCity] = true;path[pathIndex++] = nextCity;startCity = nextCity;}return path;}static class Edge implements Comparable<Edge> {int from;int to;int weight;public Edge(int from, int to, int weight) {this.from = from;this.to = to;this.weight = weight;}@Overridepublic int compareTo(Edge edge) {return this.weight - edge.weight;}}
}

在上述示例中,我们有一个带权重的无向图,表示旅行商问题中的城市距离。我们使用近似启发式搜索来找到近似的最短路径。我们首先选择一个起始城市,然后不断选择下一个距离最近的未访问城市。我们使用优先队列来存储待选择的边,并按照边的权重进行排序。每次从优先队列中选择权重最小的边,并记录下一个城市作为路径的一部分。

最后,我们返回路径数组,其中指示了经过的城市顺序。

请注意,这只是一个简单的示例,实际应用中可能需要根据问题的特点来设计适当的评估函数和启发式策略,选择合适的数据结构来进行状态管理,以及实现其他相应的算法逻辑。

总结

近似算法的具体实现方法与问题本身紧密相关。对于特定的问题,你需要根据其特征和要求来选择合适的近似算法,并在Java中进行具体的实现。

相关文章:

常见的近似算法

前言 最近有个项目要用到近似算法&#xff0c;就到处摸了下&#xff0c;整理了一个小结。 近似算法统计 在Java中&#xff0c;你可以使用各种近似算法来解决不精确但接近于最优解的问题。以下是几种常见的近似算法的实现方法&#xff1a; 贪心算法&#xff08;Greedy Algori…...

【完整详细】IntelliJ IDEA中使用Docker插件一键部署前后端分离项目

前言:在使用Docker部署我们的前后端分离项目的时候,会涉及到一堆且重复的Docker命令,久而久之就会被这些重复性的操作感到繁琐,本篇博客教学大家如何通过IDEA自带的一款插件就可以实现一键部署前后端分离项目的操作,从头到尾我写的非常详细,大家逐步阅读即可。 博主的其他…...

ubuntu20.04 安装TensorRT,解决依赖问题

1.下载Tensor RT对应的deb包 先要确保cuda和cudnn安装好&#xff0c;https://blog.csdn.net/qq_41246375/article/details/115597025 下载tensor RT&#xff0c;注意版本对应关系 https://developer.nvidia.com/nvidia-tensorrt-8x-download 2.安装 按照官方步骤 https://d…...

你知道如何科学的学习吗?-关于个人成长的思考

背景 最近在翻看自己工作后的笔记&#xff0c;从有道云笔记到印象笔记&#xff0c;到本地笔记&#xff0c;到自己使用github搭建的博客&#xff0c;到语雀笔记&#xff0c;使用了不同的平台工具&#xff1b;零零总总记录了许多学习笔记、个人成长笔记、职业规划等内容。现在看…...

Java学习之路 —— 多线程

文章目录 1. 线程创建方式1.1 继承Thread1.2 声明一个实现Runnable接口的类1.3 利用Callable接口、FutureTask类来实现 2. 线程同步2.1 同步代码块2.2 同步方法2.3 Lock锁 3. 线程同步4. 线程池 1. 线程创建方式 1.1 继承Thread 定义子类&#xff0c;继承Thread&#xff0c;创…...

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷&#xff1f;1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir&#xff08;临时存储卷&#xff09;1.3.2 hostPath&#xff08;节点存储卷&#xff09;1.3.3 nfs1.3.4 cephfs 二、…...

二层、三层交换机之间到底有什么区别?

简单地说 二层交换机&#xff0c;没有充当三层网关角色的能力&#xff08;Capability&#xff09;。三层交换机&#xff0c;首先也是二层交换机。但是&#xff0c;它有一个额外的能力&#xff08;Capability&#xff09;&#xff0c;软件配置一下&#xff0c;可以充当三层网关…...

【论文阅读】2736. 最大和查询-2023.11.17

题目&#xff1a; 2736. 最大和查询 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j]…...

2. zk集群部署

简介 上一篇文章我们已经把环境准备好了&#xff0c;jdk也配置好了&#xff0c;下面我们开始把zk部署起来 hadoop环境准备 创建zk用户 useradd zk -d /home/zk echo "1q1w1e1r" | passwd --stdin zk上传zk包 拷贝zk包到/home/zk目录,这里的zk版本为 3.6.3 scp…...

抖音快手判断性别、年龄自动关注脚本,按键精灵开源代码!

这个是支持抖音和快手两个平台的&#xff0c;可以进入对方主页然后判断对方年龄和性别&#xff0c;符合条件的关注&#xff0c;不符合条件的跳过下一个ID&#xff0c;所以比较精准&#xff0c;当然你可以二次开发加入更多的平台&#xff0c;小红书之类的&#xff0c;仅供学习&a…...

IDEA软件使用步骤

1.IDEA概述 IDEA全称InelliJ IDEA,是用于java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试扽过多种功能综合到一起的开发工具。 下载&#xff1a;https…...

设计模式-11-模板模式

经典的设计模式有23种&#xff0c;但是常用的设计模式一般情况下不会到一半&#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析&#xff0c;方便大家更加容易理解和使用设计模式。 1-什么是模板模式 模板模式&#xff0c;全称是模板方法设计模式&#xff0c;英…...

【技术分享】EIGRP stub实验

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 拓扑图&#xff1a; R1配置&#xff1a; route…...

Python 爬虫 AES DES加密反爬

当你遇到需要处理 AES 或 DES 加密的反爬虫机制时&#xff0c;Python 可以通过使用相应的库来解决这类问题。首先&#xff0c;我们需要理解 AES 和 DES 加密是什么&#xff1a; AES (Advanced Encryption Standard)&#xff1a;一种广泛使用的对称加密算法&#xff0c;它使用相…...

(论文阅读30/100)Convolutional Pose Machines

30.文献阅读笔记CPMs 简介 题目 Convolutional Pose Machines 作者 Shih-En Wei, Varun Ramakrishna, Takeo Kanade, and Yaser Sheikh, CVPR, 2016. 原文链接 https://arxiv.org/pdf/1602.00134.pdf 关键词 Convolutional Pose Machines&#xff08;CPMs&#xff09;…...

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…...

WPF显示3D图形

C# 中的 WPF (Windows Presentation Foundation) 支持显示3D图形。WPF 使用 DirectX 作为底层图形引擎&#xff0c;这意味着它可以处理包括3D图形在内的复杂渲染任务。 在 WPF 中&#xff0c;你可以使用一些内置的类和控件来创建和显示3D对象。这包括 Viewport3D, Camera, Mod…...

Xrdp+Cpolar实现远程访问Linux Kali桌面

XrdpCpolar实现远程访问Linux Kali桌面 文章目录 XrdpCpolar实现远程访问Linux Kali桌面前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于…...

赚钱

《赚钱》 作者&#xff0f;罗光记 赚钱劳身影未安&#xff0c; 岁月匆匆易逝难。 银钱到手笑颜开&#xff0c; 酒醉灯昏影独寒。 花前月下欢声起&#xff0c; 万金财富待来年。 诗酒飘香梦中笑&#xff0c; 人生何求更多钱。...

Django command执行脚本

python web项目中经常会使用到脚本&#xff0c;一般来说有两种很简单的方法&#xff0c;一种是直接python function&#xff0c;另一种就是 django 自定义command。 对比常规脚本 这里举个简单的例子&#xff0c;比如初始化数据、文件名称为initialize_data.py &#xff08;1…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...