首页 > 编程语言 >动态规划算法-以中学排班管理系统为例

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

时间:2024-07-07 11:56:32浏览次数:16  
标签:index capacity 管理系统 int values 为例 课程 weights 排班

1.动态规划算法介绍 

1.算法思路

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

2.代码介绍

// 优化课程安排,使用递归模拟动态规划过程
    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);

        // 打印选择的课程和对应的教师ID
        // 这里应该使用回溯算法来打印结果,但当前实现不正确
        printSelectedCourses(0, weights, values, capacity, n);
    }

    // 递归函数模拟动态规划解决背包问题
    // 递归的深度为课程数量n,每层递归的复杂度与教室容量有关
    private static int knapsack(int index, int[] weights, int[] values, int capacity, int n) {
        // 基本情况:没有课程可选或背包容量为0
        if (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) // 选择当前课程
        );
    }

    // 递归回溯函数,意图是打印出被选中的课程和教师ID
    private static void printSelectedCourses(int index, int[] weights, int[] values, int capacity, int n) {
        if (index == n) {
            return;
        }
        // 如果当前容量不足以包含当前课程,则只能不选择当前课程
        if (capacity < weights[index]) {
            printSelectedCourses(index + 1, weights, values, capacity, n);
            return;
        }
        // 尝试不选择当前课程
        printSelectedCourses(index + 1, weights, values, capacity, n);
        // 尝试选择当前课程
        if (knapsack(index + 1, weights, values, capacity - weights[index], n) < knapsack(index + 1, weights, values, capacity, n)) {
            System.out.println("选择的课程教师ID: " + values[index]);
            printSelectedCourses(index + 1, weights, values, capacity - weights[index], n);
        }
    }

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

optimizeCourseScheduling 方法
  • 作用:优化课程安排的主要方法。
    • 读取用户输入的可用教室数量。
    • 获取所有课程的详细信息,包括每门课程的教师ID。
    • 为每门课程分配一个固定的教室数量(这里简化为每个课程占用一个教室)。
    • 调用knapsack方法计算在给定教室数量下的最大课程安排价值。
    • 打印出最大价值,并尝试调用printSelectedCourses方法打印被选中的课程和教师ID。
knapsack 方法
  • 作用:实现的背包问题算法。
    • 模拟动态规划过程,尝试不同的课程组合来找到最大价值。
    • 基本情况:如果没有课程可选或背包容量为0,返回0。
    • 递归决策:对于每个课程,决策是否将其包含在内,以获得最大价值。
    • 返回在当前容量下,考虑前index个课程时的最大价值。
printSelectedCourses 方法
  • 作用:用于打印出被选中的课程和对应的教师ID。

总结

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

标签:index,capacity,管理系统,int,values,为例,课程,weights,排班
From: https://blog.csdn.net/weixin_64922330/article/details/140244001

相关文章

  • 基于SpringBoot+Vue的招生管理系统(带1w+文档)
    基于SpringBoot+Vue的招生管理系统(带1w+文档)通过招生管理系统的研究可以更好地理解系统开发的意义,而且也有利于发展更多的智能系统,解决了人才的供给和需求的平衡问题,招生管理系统的开发建设,由于其开发周期短,维护方便,所以它可以适应招生公告体系基本要求。项目简介基于......
  • [未公开0day]宏景HCM人力资源信息管理系统存在前台RCE
    如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。payload就放在星球了,欢迎各位师傅来白嫖,看上眼的话可以留下试试。漏洞简介宏景人力资源管理系统是一款由宏景软件研发的系统,主要功能包括人员、组织机构、档案、合同、薪资、保险......
  • Java计算机毕业设计疫情防控形势下的高校食堂订餐管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着新冠疫情的全球蔓延,公共卫生安全成为了前所未有的重大挑战。高校作为人员密集且流动性大的场所,其食堂管理面临着巨大的疫情防控压力。传统的食堂......
  • springboot长江航运管理系统-计算机毕业设计源码54774
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,长江航运公司当然也不例外。长江航运管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件......
  • 基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283
     摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......
  • 基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277
     摘    要在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对流浪动物信息管理的提升,也为了对流浪动物信息进行更好的维护,流浪动物管理系统的出现就变得水到渠成......
  • 基于java+springboot+vue实现的药店管理系统(文末源码+Lw)285
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,药品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的药店管理系统。本药店......
  • 基于java+springboot+vue实现的药店管理系统(文末源码+Lw)285
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,药品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的药店管理系统。本药店......
  • Java项目:基于SSM框架实现的中小企业人力资源管理系统【ssm+B/S架构+源码+数据库+开题
    一、项目简介本项目是一套基于SSM框架实现的中小企业人力资源管理系统包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值......
  • 基于微信小程序的外来人员管理系统设计和实现-UniApp(代码+文档+运行成功)
    本微信小程序分为移动端和PC端两个部分,移动端主要使用Uni-App技术进行开发,可以在微信开发者工具和HBuilder中运行,同时PC端主要是给管理员人员使用的,PC端使用Java语言和流行的SpringMVC框架进行开发,数据库方面使用的是MySQL数据进行数据相关信息的存储随着我国经济迅速发......