OO第二单元博客总结

王嘉懿-21376344 学生 2024-04-20 16:50:54

第二单元博客总结

*:在三次电梯作业的实现中,三次架构的迭代关系较强,并未发生较为大规模的重构,所以以下关于三次作业的各种设计的分析将均以第三次作业的代码架构为准,不再赘述

同步块的设置和锁的选择以及其分析:

synchronized(MissionAllotment){
    ...
    void setEnd(...);
    void addRequest(...);
    boolean isEnd(...);
    boolean isEmpty(...);
    getOptimumRequest(...);
    void pushMission(...);
    ...
}

MissionAllotment中关于设定分配结束、判定分配结束、得到最最适应任务、分配最适应任务等方法均采用了同步块的设置,并将锁设置在了MA,这样做是为了防止读取数据和更新数据同时发生,从而导致无法正常同步的问题

synchronized(ElevatorThread){
    ...
    void addResetSignal(...);
    void addDoubleResetSignal(...);
    boolean isReady(...);
    void setEnd(...);
    void setPriorityKey(...);
    getMainMission(...);
    boolean isEnd(...);
    boolean isEmpty(...);
    void StrategyApply(...);
    ...
}
synchronized(SubElevator){
    ...
    boolean suitable(...);
    boolean limited1(...);
    boolean limited2(...);
    ...
}

关于对ElevatorThreadSubElevator的处理,有关于新任务的push和主任务、电梯状态的读取等,均采取了加锁的策略来保证其同步,并且在MissionAllotment中对于此类事项的处理亦是如此,其目的在于防止电梯相关信息的读取与电梯状态的转换同时进行,这样可能会导致电梯状态和数据的错乱

synchronized(Total){
    ...
    void addSum(...);
    void addFinishedRequest(...);
    boolean isDone(...);
    ...
}

Total一类是用于实现对输入任务的完成情况的判断判断和读取的,其功能类似于仪表盘,因此在实现中,有关于对Total中的任务数量和已完成任务数量以及任务完成情况的修改和读取均需要加锁,其原因在于该类将会被InputThread、SubElevator、ElevatorThread等类共享,在整个进程运行的过程中,有可能会发生以上不同对象对于此类数据同时修改+读取的情况,必须采用同步块来杜绝其发生

synchronized(TransferFloor){
    ...
    void occupy();
    void release();
    boolean isOccupied();
    ...
}

TransferFloor的设置是用于避免双桥厢电梯相撞的问题,因此其状态的改变和读取必须加锁,并且在StrategyMap中有关其状态的修改的语句也必须如此

调度器设计与结构分析:

  • UML类图


    img

  • UML协作图


    img

  • 内容变化性分析
    • 较为稳定的内容

      1. Main中对于各类线程的创建过程与链接组合

      2. MissionAllotment对任务的接受与分配,以及其关于捎带逻辑的判定和对适宜任务的挑拣

      3. InputThread中接收标准输入的逻辑与分别对6个MissionAllotment对象分配请求的逻辑

      4. ElevatorThread中电梯运行的基础逻辑基本维持不变

    • 易发生变动的内容

      1. InputThread对任务完成反馈情况的反应部分,在第二第三次作业中由于Reset和双桥厢电梯的存在,使得部分分配后的任务将无法直接实现,此时需要如Total类等措施来将未完成的任务再分配

      2. StrategyMap中对如Reset或双桥厢转换情况下的电梯变动策略,尤其是在第三次作业的迭代中,因为需要考虑到桥厢相撞的情况,此时甚至需要新设立一个TransferFloor的类并依赖于其occupy功能来避免相撞

对双桥厢电梯内部相撞的预防:

要想避免两个桥厢相撞,即是当其中有一个桥厢位于转运楼层时,另外一个电梯不可进入转运楼层,这也就意味着如果不借助外部条件的话,则必须要实现两个桥厢之间的同步通讯,在实现的过程中,我有尝试过利用直接建立二者的通讯,然而这也使得我们需要在一个桥厢进出转运楼层时候,需要给另一个桥厢加锁,这严重背离了常理判断和类与对象的实现原则,因此该想法被废除,最后我们实际上是建立了一个新的单类TransferFloor来实现这一功能,即每当电梯进入该楼层时,将会取得TF的锁并调用其occupy()方法,当isOccupied变量为True时,另一个桥厢自然无法正常进入,并且我修改了StrategyMap中电梯处于Closing时的状态转换逻辑,使得当电梯位于转运楼层时,会以最快的速度离开该楼层,并调用release()方法,避免了一个桥厢独占转运楼层的情况

BUG分享:

在实现过程中,最常出现的BUG便是CTLE,其大多是因为轮询,在前两次作业中,其主要出现形式是一直询问是否存在请求,这样的bug只需合理使用wait()方法并在合理的时间段释放电梯的锁以接收可能到来的请求即可避免,而第三次作业中出现的bug则较为特殊,其是因为我们在实现逻辑中,采用了MA和ET之间相互唤醒这一方式,这会使得我们在前文提到的已经设立好的wait()方法被频繁唤醒,进而使得轮询的再次发生,我们最后给出的解决方案是,设立好Total类与ET中的变量mark,从而保证当这种情况发生时,我们可以利用设立好的mark来保证这种互相唤醒的状态将会以有限的次数发生,并且有了Total类的参与,我们可以更加灵活地记录各个任务的完成情况,避免了死锁

心得体会:

在该单元中,我们学习了多线程的各类概念与多线程问题的解决方式,可以说是OO系列课程中最难的一单元,而在这个月中,OS课也刚好位于进程与线程这一部分,可以说二者知识层面的结合与交互,切实让我受益匪浅,使得我能同时从理论和应用的角度去真正意义上学习解决多线程问题,我相信这对我未来的编程方面的学习来说也是意义非凡的,最后我希望感谢这一单元的助教团队和课程组教师的辛勤付出,谢谢你们共同奉献了如此优质的教学内容,故余虽愚,卒获有所闻

...全文
55 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文聚焦于【SCI一区复现】基于配电网韧性提升的应急移动电源(MPS)动态调度的Matlab代码实现,旨在通过仿真手段优化灾害或突发事件下配电网的恢复能力。研究在前期MPS预配置的基础上,进一步构建动态调度模型,综合考虑负荷优先级、网络拓扑变化、MPS移动路径与供电时序等因素,实现灾后关键负荷的快速、持续恢复。文中提供了完整的Matlab仿真资源,包含YALMIP等优化工具包,以支持复杂的数学规划问题求解。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及电力行业从业者。; 使用场景及目标:① 复现高水平期刊(SCI一区)关于配电网韧性的研究成果;② 学习和掌握应急移动电源(如移动储能车)在灾后配电网恢复中的优化调度建模与求解方法;③ 利用提供的Matlab代码进行二次开发,研究不同灾害场景下的配电网应急响应策略。; 阅读建议:此资源以复现SCI一区论文为核心,不仅提供代码,更侧重于先进优化思想的应用。学习者应结合配电网、运筹学等相关知识,深入理解模型构建逻辑,并利用所提供的网盘资源进行代码调试与仿真分析,从而掌握解决实际工程问题的高级方法。
内容概要:本文档详细介绍了一种针对梯级水光互补系统的短期优化调度模型,旨在最大化可再生能源的可消纳电量期望值。该模型通过Matlab代码实现,综合考虑了梯级水电站与光伏发电的协同运行特性,充分结合水资源利用效率与光照条件的时空变化规律,以提升清洁能源的整体利用水平。文档不仅阐述了完整的数学建模过程,还引入智能优化算法求解这一复杂非线性调度问题,并提供了详尽的Matlab代码实例,便于研究人员复现和验证。此外,文中提及了该模型在新能源、电力系统优化、智能算法应用等领域的广泛关联性,为相关研究提供了技术支撑与理论参考。; 适合人群:具备一定编程基础,特别是熟练掌握Matlab环境的科研人员;从事新能源系统规划、电力系统调度、自动化控制及相关领域的硕士、博士研究生及工程技术人员。; 使用场景及目标:①为梯级水电与光伏电站的协同优化运行提供理论依据与实用的技术框架;②帮助科研人员快速掌握并应用智能优化算法解决实际工程中的多目标、多约束调度问题;③推动清洁能源的高效利用,减少弃水弃光现象,提升能源系统的经济性与环境效益。; 阅读建议:此资源以Matlab代码为核心载体,融合了理论建模与实践仿真,建议读者在学习过程中不仅要深入理解其背后的优化原理与数学模型,还需动手调试代码,结合不同场景进行实验,从而真正掌握该调度模型的设计思想与实现方法,为后续的科研与工程应用打下坚实基础。
内容概要:本文提出了一种融合鱼鹰优化算法(OOA)与柯西变异策略的改进型麻雀搜索算法(OCSSA),旨在克服传统麻雀优化算法在求解复杂优化问题时易陷入局部最优、收敛速度慢及寻优精度不足等问题。通过引入鱼鹰捕食机制增强算法的全局探索能力,同时结合柯西变异策略提升种群多样性与局部开发能力,从而有效提高算法的整体优化性能。文中系统阐述了算法的数学模型与改进策略的设计原理,并通过多个标准基准测试函数验证了所提算法在收敛性、稳定性和寻优精度方面的优越性,进一步将该算法应用于典型工程优化问题中,充分展示了其在实际场景中的可行性和有效性。; 适合人群:具备一定智能优化算法理论基础,从事人工智能、运筹优化、电力系统、自动化、智能制造等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 改进现有群智能优化算法,提升求解高维、非线性、多峰值复杂优化问题的能力;② 应用于电力系统调度、参数辨识、路径规划、机器学习超参数调优、结构设计优化等需要高效优化技术的工程实践;③ 作为学术研究参考,推动新型混合智能优化算法的创新与发展。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法的实现细节与迭代机制,重点关注鱼鹰捕食行为的建模方式与柯西变异的触发条件,通过对比实验分析各改进策略对算法性能的影响,并尝试将其迁移至不同类型的优化问题中进行测试与调参,以全面掌握算法的应用技巧与适应性。

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧