动态规划算法-以中学排课管理系统为例

1.动态规划算法介绍 

1.算法思路

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

2.代码介绍

/private static boolean foundOptimal = false; // 用于全局控制是否找到// 优化课程安排,使用递归模拟动态规划过程private static void optimizeCourseScheduling(Scanner scanner, CourseService courseService) {System.out.print("输入可用教室数量:");int capacity = scanner.nextInt(); // 用户输入教室的容量scanner.nextLine();List<CourseEntity> courses = courseService.getAllCourses(); // 获取所有课程int n = courses.size(); // 课程总数int[] weights = new int[n]; // 每个课程占用的教室数量int[] values = new int[n]; // 每个课程的价值,这里使用教师ID// 为每门课程分配教师ID和教室资源System.out.println("正在为每门课程分配教师ID和教室资源...");for (int i = 0; i < n; i++) {weights[i] = 1; // 假设每个课程占用一个教室values[i] = courses.get(i).getTeacherId(); // 教师ID作为课程的价值}int maxValue = knapsack(0, weights, values, capacity, n);System.out.println("在可用教室数量为 " + capacity + " 的情况下,最大化的课程安排价值为:" + maxValue);// 初始化标记数组,所有课程初始为未选择boolean[] selected = new boolean[n];foundOptimal = false; // 重置全局变量printSelectedCourses(0, weights, values, capacity, n, selected, maxValue);if (!foundOptimal) {System.out.println("未找到符合条件的课程安排。");}}// 递归函数模拟动态规划解决背包问题
// 递归的深度为课程数量n,每层递归的复杂度与教室容量有关private static int knapsack(int index, int[] weights, int[] values, int capacity, int n) {// 基本情况:没有课程可选或背包容量为0if (index == n || capacity == 0) {return 0;}// 如果当前课程的重量大于背包容量,则不能选择该课程if (weights[index] > capacity) {return knapsack(index + 1, weights, values, capacity, n);}// 递归选择:选择包含当前课程或不包含当前课程的最大价值return Math.max(knapsack(index + 1, weights, values, capacity, n), // 不选择当前课程values[index] + knapsack(index + 1, weights, values, capacity - weights[index], n) // 选择当前课程);}// 递归回溯函数,意图是打印出被选中的课程和教师IDprivate static boolean printSelectedCourses(int index, int[] weights, int[] values, int currentCapacity, int n, boolean[] selected, int maxValue) {if (foundOptimal) {return true; // 如果已经找到最优解,直接返回}if (index == n) {int currentValue = 0;for (int i = 0; i < n; i++) {if (selected[i]) {currentValue += values[i];}}if (currentCapacity == 0 && currentValue == maxValue) {// 打印当前选择的课程for (int i = 0; i < n; i++) {if (selected[i]) {System.out.println("选择的课程教师ID: " + values[i]);}}foundOptimal = true; // 标记已找到最优解return true;}return false;}// 不选择当前课程selected[index] = false;printSelectedCourses(index + 1, weights, values, currentCapacity, n, selected, maxValue);// 尝试选择当前课程if (currentCapacity >= weights[index]) {selected[index] = true;printSelectedCourses(index + 1, weights, values, currentCapacity - weights[index], n, selected, maxValue);}return false;}

3.使用动态规划算法模拟课程安排优化

1. `optimizeCourseScheduling` 方法:

    作用:优化课程安排,使用递归模拟动态规划过程。

    参数列表:

      `Scanner scanner`:用于接收用户输入的扫描器。

      `CourseService courseService`:用于获取课程数据的服务类。

2. `knapsack` 方法:

    作用:模拟动态规划解决背包问题,计算最大化的课程安排价值。

    参数列表:

      `int index`:当前处理的课程索引。

      `int[] weights`:每个课程占用的教室数量。

      `int[] values`:每个课程的价值(教师ID)。

      `int capacity`:当前剩余的教室容量。

      `int n`:课程总数。

3. `printSelectedCourses` 方法:

    作用:递归回溯函数,意图是打印出被选中的课程和教师ID。

    参数列表:

      `int index`:当前处理的课程索引。

      `int[] weights`:每个课程占用的教室数量。

      `int[] values`:每个课程的价值(教师ID)。

      `int currentCapacity`:当前剩余的教室容量。

      `int n`:课程总数。

      `boolean[] selected`:标记数组,表示每个课程是否被选择。

      `int maxValue`:最大化的课程安排价值。

 详细描述

1. `optimizeCourseScheduling` 方法:

    该方法首先接收用户输入的教室容量,然后获取所有课程数据。

    为每门课程分配教师ID和教室资源,并初始化权重和价值数组。

    调用 `knapsack` 方法计算最大化的课程安排价值。

    初始化标记数组 `selected`,并调用 `printSelectedCourses` 方法打印出被选中的课程和教师ID。

    如果未找到符合条件的课程安排,则输出提示信息。

2. `knapsack` 方法:

    该方法是用于模拟动态规划解决背包问题。

    基本情况:如果没有课程可选或背包容量为0,则返回0。

    如果当前课程的重量大于背包容量,则不能选择该课程。

    递归选择:选择包含当前课程或不包含当前课程的最大价值。

3. `printSelectedCourses` 方法:

    该方法是递归回溯函数,用于打印出被选中的课程和教师ID。

    如果已经找到最优解,直接返回。

    递归终止条件:如果处理完所有课程,计算当前选择的课程价值,如果满足条件则打印选择的课程并标记已找到最优解。

    不选择当前课程,继续递归处理下一个课程。

    尝试选择当前课程,如果当前容量足够,继续递归处理下一个课程。

总结

这段代码的核心是一个简化的课程安排优化问题,模拟动态规划算法,以解决类似于背包问题的资源分配问题。程序的目标是在有限的教室资源下最大化课程的总价值,这里使用教师ID作为价值的代表。

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

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

相关文章

家里老人能操作的电视直播软件,目前能用的免费看直播的电视软件app,适合电视和手机使用!

2024年许多能看电视直播的软件都不能用了&#xff0c;家里的老人也不会手机投屏&#xff0c;平时什么娱乐都没有了&#xff0c;这真的太不方便了。 很多老人并不喜欢去买一个广电的机顶盒&#xff0c;或者花钱拉有线电视。 现在的电视大多数都是智能电视&#xff0c;所以许多电…

数据防泄密软件精选|6款好用的数据防泄漏软件强推

某科技公司会议室&#xff0c;CEO张总、CIO李总、信息安全主管王经理正围绕最近发生的一起数据泄露事件展开讨论。 张总&#xff08;忧虑&#xff09;: 大家&#xff0c;这次的数据泄露事件对我们来说是个沉重的打击。客户信息的外泄不仅损害了我们的信誉&#xff0c;还可能面…

lora/lycoris

Stable Diffusion 训练指南 (LyCORIS) | Coding HuskyStable Diffusion 文字生成图片的教程已经很多了。这篇文章是讲解如何用 Kohya Trainer 在 Google Colab 上训练一个 LyCORIS 模型。在读之前希望你已经至少玩过 Stable Diffusion。https://ericfu.me/stable-diffusion-fin…

2.硬盘和内存区别

2.2 磁盘比内存慢几万倍&#xff1f; 存储器方面的设备&#xff0c;分类比较多&#xff0c;那我们肯定不能只买一种存储器&#xff0c;比如你除了要买内存&#xff0c;还要买硬盘&#xff0c;而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。 相信大家都知道内存和硬盘都属…

常见的自动化工具开发必备的源代码!

随着科技的飞速发展&#xff0c;自动化工具已经成为我们日常工作中不可或缺的一部分&#xff0c;自动化工具不仅极大地提高了工作效率&#xff0c;还降低了人为错误的可能性。 然而&#xff0c;要想开发出高效、稳定的自动化工具&#xff0c;掌握一些常见的源代码技巧是至关重…

列式存储和行式存储

列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的&#xff0c;简单来说两者的区别就是如何组织表。 原文&#xff1a; Row-based storage stores atable in a sequence of rows. Column-based storage storesa table in …

方圆资源网,方圆资源官网

在当今这个信息化高速发展的时代&#xff0c;方圆资源网络已成为推动社会进步、促进经济发展的重要力量。方圆资源网不仅汇聚了海量的信息资源&#xff0c;更为我们提供了一个高效、便捷的信息交流平台。本文旨在详细介绍资源网的概念、特点、功能以及其在现代社会中的重要意义…

C#写的winform项目无法打包发布?谈谈思路

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

单片机学习(17)--AD/DA

AD/DA 16.1AD/DA的基础知识1.AD/DA介绍2.硬件电路模型3.硬件电路4.运算放大器5.运放电路6.DA原理6.AD原理7.AD/DA性能指标8.XPT2046 16.2AD模数转换&DA数模转换1.AD模数转换&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09…

Springboot实战:AI大模型+亮数据代理助力短视频时代

目录 前言1.如何入门亮数据1.1、注册登录1.2、注册账号1.3、登录1.4、购买静态住宅代理1.5、展示购买的代理 2. 使用Springboot、AI大模型构建系统2.1 使用Springboot、AI大模型构建爬虫2.2、在Springboot项目添加工具 3、编写代码&#xff0c;爬取视频素材3.1、代码里使用代理…

电脑选购全解析!你需要知道的一切!

在选择电脑类型时&#xff0c;你可以考虑以下因素&#xff1a; 你的主要用途是什么&#xff1f; 你是否需要携带电脑&#xff1f; 你的预算是多少&#xff1f; 你对性能和图形要求有多高&#xff1f; 你是否需要特定的软硬件功能&#xff1f;根据这些因素&#xff0c;你可以…

音频demo:使用fdk-aac将PCM数据编码成aac数据

1、README a. 编译 编译demo 本demo是使用的开源项目fdk-aac将PCM数据编码成aac音频文件。由于提供的.a静态库是在x86_64的机器上编译的&#xff0c;所以默认情况下仅支持该架构的主机上编译运行。 $ make编译fdk-aac&#xff08;可选&#xff09; 如果想要在其他架构的CP…

权力之望怎么下载客户端 权力之望一键下载

《权力之望》是一款由NX3 Games开发、Smilegate发行的多人在线动作MMORPG游戏。这款游戏最大的特点是高度的自由度和丰富的角色定制选项。我们在游戏中不仅可以自由更换武器&#xff0c;而且游戏还提供了54种能力和60多种职业选择&#xff0c;让我们可以根据自己的游戏风格和喜…

YOLOv9报错:AttributeError: ‘list‘ object has no attribute ‘view‘

报错信息如下&#xff1a; red_distri, pred_scores torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split( AttributeError: ‘list’ object has no attribute ‘view’ 解决方法&#xff1a; 去yolov9/utils/loss_tal.py把167行代码更改&#…

人工智能音乐软件Suno上架App Store;Meta 推出 3D 内容生成 AI 模型

&#x1f989; AI新闻 &#x1f680; 人工智能音乐软件Suno上架App Store 摘要&#xff1a;IT之家消息&#xff0c;Suno是一款AI音乐生成软件&#xff0c;已登陆苹果App Store&#xff08;国区暂未上架&#xff09;。用户可通过文字描述或录音创建音乐&#xff0c;并生成4分钟…

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…

【Linux系列2】Cmake安装记录

方法一 1. 查看当前cmake版本 [rootlocalhost ~]# cmake -version cmake version 2.8.12.22. 进行卸载 [rootlocalhost ~]# yum remove -y cmake3. 进行安装包的下载&#xff0c;也可以下载好安装包后传至相应的目录 [rootlocalhost ~]# mkdir /opt/cmake [rootlocalhost ~…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时&#xff0c;遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行&#xff0c;并且导致应用强制关闭。 一…

算法训练营day26--455.分发饼干+376. 摆动序列+53. 最大子序和

一、455.分发饼干 题目链接&#xff1a;https://leetcode.cn/problems/assign-cookies/ 文章讲解&#xff1a;https://www.programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1MM411b7cq 1.1 初见思…

在PyTorch中使用TensorBoard

文章目录 在PyTorch中使用TensorBoard1.安装2.TensorBoard使用2.1创建SummaryWriter实例2.2利用add_scalar()记录metrics2.3关闭Writer2.4启动TensorBoard 3.本地连接服务器使用TensorBoard3.1方法一&#xff1a;使用SSH命令进行本地端口转发3.2方法二&#xff1a;启动TensorBo…