看开源项目源代码或者看项目源码的时候,常常觉得代码看起来比较啰嗦,总觉得有些的应该可以简化的。
比如:
1 过多的getter、setter 这些显然是没技术含量的,但是它夹杂在类的其他代码中,影响了阅读。我的做法是把去掉其getter、setter,然后它直接改为public 变量。——虽然这有违java封装原则,但是我想这却是有利于代码阅读的。。
2 过多的注释,一些开源项目往往就是大版大版的注释,注释多是好是坏姑且不论,但是有时候我们只是想看源码,不想看注释,这个时候它就非常讨嫌了!
3 过多的try catch 等异常扑捉。 这显然也是影响阅读的,试想,如果关键代码就那么一行一个方法20个字符之内,外面却包了3、4个try catch,多烦人啊,最后还有finally。。。 当然,如果想详细了解源码,彻底弄明白其功能,仔细阅读try catch是有必要的,但有时候,我们只想快速的、大致的阅读一下源码,这个时候也有必要简化一下那个类了。
4 日志,一般来说,日志只是处理调试信息、警告信息、异常信息等用的, 去掉它并不影响功能
5 注解 有些annotation并不是必须的,去掉完全不影响阅读,比如:@Override、@SuppressWarnings..等
众所周知,看源码并不是一件简单的事,因为,我们常常没有那个对应的UML图,功能说明啊等。(不知道为什么都这样。。。)
要是能简化代码,那么再来阅读就会轻松多了!本想这么个简单的功能,别人应该已经做出来了的。可是,我网上搜索却总也找不到。——难道大家都没有这方面的考虑吗??
困扰了我很久,今天有点时间,想起这事,于是自己写了一个简单实现:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Stack; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.luobk.po.VarObject; /** * 代码阅读优化器 CodeSimplifier或者也可以称为 CodePurifier吧 * goSimplifyProject 只针对 目录 * 若是 想直接的simplify一个java文件,则用simplifyFile即可 * */ public class CodeSimplifier { // public static String SOURCE_DIR = "D:\\WS\ABC\\src"; public static String SOURCE_DIR = "D:\\WS\\CodeSimplifier\\src"; public static String DEST_DIR = "D:\\WS\\CodeSimplifier\\src3"; public static String SOURCE_FOLDER = "src"; public static String LOGGER_NAME = "log"; public static boolean USE_SOURCE_FOLDER = false; /** * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub goSimplifyProject(SOURCE_DIR,DEST_DIR); // simplifyFile(new File(SOURCE_DIR), DEST_DIR); // System.out.println("sfasf".matches("[.]+")); // System.out.println("asf " + // "a\" f艾丝凡 f\nasf\nnnbbsa;\"aa".matches("a\"(.|\\s)*;\"aa")); // System.out.println("\n".matches("(\\s+)")); // System.out.println("sfasf".matches(".*asf")); // .+ 。* 是可以自动伸缩的 , 默认的 。。。 非贪婪模式?? // String ss = "System.out. println(\"sfas r asfa fas \");\n" + // "System.out. println(\"sfas + \n asfa fas \");"; // System.out.println("ss . replaceAll : "+ss. // replaceAll("\\s+System\\s*\\.\\s*out\\s*\\.\\s*print(ln)?\\s*\\(\\s*\"(.|\\s)*\"\\s*\\)\\s*;","")); // StringBuffer sb = new StringBuffer("abcdef\nxyz\n>"); // sb.deleteCharAt(sb.length()-1); // System.out.println("matches++ = "+"sfaaf".matches(".{6}"));// + 后面的 {n} 失效 // System.out.println("matches++ = "+"fasf \n}".matches(".+")); // 匹配任何字符包括' ',但是不包括 \n等 // System.out.println("sfaf>s]f[s.".replaceAll("]","A"));// 到底要不要转义 [] 啊!! // sb.reverse 有用的方法!是String 没有提供的! // String filePath = "D:\\iEMPWorkspaces\\CodePurifier\\src\\po\\"; // String projectPath = "D:\\iEMPWorkspaces\\CodePurifier\\src2\\Bootstrap.java"; // String destDir = "D:\\iEMPWorkspaces\\CodePurifier\\src3\\"; // System.out.println("ddasfasf aa\n = asf qwf".replaceAll("\\s{2}", "X")); // System.out.println("ddasfasf aa\n = 2asf qwf".replaceAll("\\s[2]", "X")); // System.out.println(capitalize("asfaf")); // File f = new File("D:\\iEMPWorkspaces\\CodePurifier\\src2\\sdaf.java"); // f.mkdir(); // FileOutputStream fos = new FileOutputStream(f); // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); // bw.write(destDir);// if we don't write sth , the file will never be created,just in mem. // bw.close(); // System.out.println("f.length()=="+f.length()+" f.exists();===+"+f.exists()); // System.out.println(" is DIR == "+ f.getCanonicalPath()+"\\"+f.getName()); } public static void goSimplifyProject(String projectPath,String destprojectPath) throws IOException { File destProjectDir = new File(destprojectPath); if(!destProjectDir.exists())destProjectDir.mkdir(); if(!projectPath.endsWith("\\")) projectPath = projectPath + "\\"; if(!destprojectPath.endsWith("\\")) destprojectPath = destprojectPath + "\\"; File sourceDir = null; if(USE_SOURCE_FOLDER)sourceDir = new File(projectPath+SOURCE_FOLDER+"\\"); else sourceDir = new File(projectPath); simplifyProject(sourceDir,destprojectPath,true); } public static void simplifyProject(File fileOrDir,String destDir,boolean isRoot) throws IOException { if(fileOrDir.isDirectory()) { /** 此种过滤行不通! FilenameFilter filter = new FilenameFilter() { private String type = ".java"; @Override public boolean accept(File dir, String name) { //return true; return name.endsWith(type); } };*/ File[] files = fileOrDir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; if(isRoot) { if(USE_SOURCE_FOLDER)destDir = destDir+SOURCE_FOLDER+"\\"; File destRootDir = new File(destDir); if(!destRootDir.exists())destRootDir.mkdir(); simplifyProject(file,destDir,false); }else { // Build the new directory,othewise we'll got: //"java.io.FileNotFoundException: D:\iEMPWorkspaces\CodePurifier\src2\po\Sdfa.java (系统找不到指定的路径。)" //System.out.println("lastDir=="+lastDir); String lastDir = fileOrDir.getName(); File directory = new File(destDir+lastDir); if(!directory.exists())directory.mkdir(); simplifyProject(file,destDir+lastDir+"\\",false); } } }else if(fileOrDir.isFile()){ if(fileOrDir.getName().endsWith(".java"))simplifyFile(fileOrDir,destDir); } } /** * * FOR JAVA FILE ONLY CURRENTLY * * REMOVE THE COMMENTS AND THE GETTER/SETTER, AND CHANGE THE MODIFIRE OF RALATED ONE TO 'PUBLIC' * * ASSUME THAT THE GETTER/SETTER USES PARAMETER AS THE SAME NAME OF THE VARAIBLE * * THATS ALL * * @param file * @throws IOException */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static void simplifyFile(File file,String destDir) throws IOException { FileInputStream fis = new FileInputStream(file); System.out.println(file.getAbsolutePath()); String outputFile = destDir+file.getName(); //System.out.println("output FIle Path"+outputFile); FileOutputStream fos = new FileOutputStream(new File(outputFile));// assume the outputFile is not the input one BufferedReader br = new BufferedReader(new InputStreamReader(fis)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); boolean isComments = false; boolean isEmptyRow = false; String line = ""; String oline = ""; List privateVars = new ArrayList(); StringBuffer sb = new StringBuffer(); while((line=br.readLine())!=null) { oline = line; line = line.trim().replaceAll("\\s+", " "); // white line if("".equals(line)) { continue; } // 去掉注释 //if(isComments&&!(line.endsWith("*/"))&&!line.endsWith("*/ "))continue; //TODO 暂不考虑 行中/*前面还有代码的情况 // 眼考虑 /* */在同一行的情况,—— 如果*/后面还有内容,则不管了 ! if(line.startsWith("/*")&&(line.endsWith("*/")||line.endsWith("*/ "))) { continue; } if(line.startsWith("/*")) { isComments = true; continue; } if(isComments&&!line.endsWith("*/")&&!line.endsWith("*/ ")) {//line.startsWith("*")&& //ifComments = true; continue; } //TODO 暂不考虑 行中*/后面还有代码的情况 if(line.endsWith("*/")||line.endsWith("*/ ")) { //System.out.println("line : "+line); isComments = false; continue; } if(line.startsWith("//")) { continue; } String[] strs = line.replace(';', ' ').trim().split(" "); if(line.startsWith("private ") &&strs.length==3 && line.endsWith(";")) { //line = line.replaceFirst("private", "public"); //oline = oline.replaceFirst("private", "public"); VarObject vo = new VarObject(); vo.setVar(strs[2]); vo.setType(strs[1]); privateVars.add(vo); } String regex = "\\s*[\\}\\)\\]>]\\s*"; if(oline.matches(regex)) { if(isEmptyRow) { sb.deleteCharAt(sb.length()-1); sb.append(line+"\n"); } else sb.append(oline+"\n"); isEmptyRow = true; }else { isEmptyRow = false; sb.append(oline+"\n"); } } br.close(); String ret = sb.toString(); System.out.println("Before:\n" + ret); //ret = ret.replaceAll("\\) ",")").replaceAll("\\s?\\(\\s+\\)\\s?", "()");//.replaceAll("\n", ""); ret = filterGetterSetters(ret, privateVars); ret = filterLogs(ret); ret = filterAnnotations(ret); ret = filterTryCatchs(ret); bw.write(ret); bw.close(); System.out.println("After:\n" + ret); } // 无止境的 CLRF 空字符。。。 \\s* 繁琐。。。 private static String filterAnnotations(String str) { String regex = "((@\\s*Override)|(@\\s*SuppressWarnings\\s*\\(.*\\)))\\s*"; str = str.replaceAll(regex, ""); return str; } private static String filterGetterSetters(String str,List privateVars) { for (Iterator iterator = privateVars.iterator(); iterator.hasNext();) { VarObject vo = (VarObject) iterator.next(); String getterRegEx = "\\s+public\\s+"+vo.getType()+"\\s+get"+capitalize(vo.getVar())+"\\s*\\(\\s*\\)\\s*\\{\\s*return\\s+"+vo.getVar()+"\\s*;\\s*\\}"; String setterRegEx = "\\s+public\\s+void\\s+set"+capitalize(vo.getVar())+"\\(\\s*" +vo.getType()+"\\s+\\w+\\s*\\)\\s*\\{\\s*(this\\.)?"+vo.getVar()+"\\s*=\\s*\\w+;\\s*\\}"; Matcher mgetter = Pattern.compile(setterRegEx).matcher(str); Matcher msetter = Pattern.compile(getterRegEx).matcher(str); if(mgetter.find() && msetter.find()){ str = mgetter.replaceAll(""); str = msetter.replaceAll(""); str = str.replaceFirst("private\\s+"+vo.getType()+"\\s+"+vo.getVar(), "public "+vo.getType()+" "+vo.getVar()); //oline = oline.replaceFirst("private", "public"); } } return str; } // TODO 要考虑 log 里面内容换行的情况 。 // TODO 要考虑 System.out.println 里面内容换行的情况 ,但是 如果 是 System.\n out\n .println的情况就不管了,实在太繁琐。。。。。 private static String filterLogs(String str) { String regexLog = "\\s+((private)|(public))\\s+.+log\\s+=\\s+Logger\\.getLogger.+;"; String regex = LOGGER_NAME+"\\s*\\.\\s*((debug)|(warn)|(error)|(fatal)|(finest)|(finer)|(fine)|(warning)|(severe))\\s*\\(\\s*\".*\"\\s*\\)\\s*;\\s*"; //String regex = "log\\s*\\.\\s*[(fine)|(severe)]"; //String regex4Javalog = "^log\\s*\\.\\s*[(finest)(finer)(fine)(warning)(severe)]\\s*\\(\\s*\".*\"\\s*\\)\\s*;"; str = str.replaceAll(regexLog, "").replaceAll(regex, ""); //if(Pattern.compile(regex).matcher(str).find()) { //} // TODO (.|\\s)*此处引起异常 //str = str.replaceAll("\\s+System\\s*\\.\\s*out\\s*\\.\\s*print(ln)?\\s*\\(\\s*\"(.|\\s)*\"\\s*\\)\\s*;", ""); return str; } // 太复杂, 而且可能影响原功能,所以,只做简单处理。。 这显然是会影响原有功能的!! private static String filterTryCatchs(String str) { // TODO String regexTry = "";//"try\\s*\\{\\s*";// 暂不处理 String regexCatch = "\\}\\s*catch\\s*\\(\\s*\\w+\\s+\\w+\\s*\\)\\s*\\{\\s*.+\\s*"; String regexFinally = "";//"\\s*\\}\\s*finally\\s*\\{\\s*.+\\s*\\}";// 暂不处理 //str = str.replaceAll(regexTry, "").replaceAll(regexCatch, "").replaceAll(regexFinally, ""); // if(Pattern.compile(regexCatch).matcher(str).find()) { str = str.replaceAll(regexCatch, " }catch(Exception e){e.printStackTrace();"); } return str; } // 将 }\n } \n ) \n) ... 的情况合并成 } } ) )... private static String foldEmptyRow(String str) { // TODO return str; } public static String capitalize(String str) { if(str==null)return ""; if(str.length()==1)return str.toUpperCase(); Character firstLetter = str.charAt(0); return Character.toUpperCase(firstLetter)+str.substring(1); } @SuppressWarnings("unchecked") public static boolean checkParetheis(String str) { Matcher matcher = Pattern.compile("[\\(\\{\\[<\\)\\}\\]>\"\']").matcher(str); Pattern p = Pattern.compile("[\\)\\}\\]>\"\']"); Stack stack = new Stack<>(); while(matcher.find()) { String c = matcher.group(); if(p.matcher(c).matches()) { if(stack.size()>0){ char top = ((String) stack.peek()).charAt(0); if(c.charAt(0)==converseChar(top)) { stack.pop(); }else { stack.push(c); } }else { stack.push(c); } }else { stack.push(c); } } System.out.println("stack remains :" +stack.toString()); if(stack.size()>0)return false; return true; } @SuppressWarnings("unchecked") public static boolean checkParetheis(File f) { if(f.exists()) { FileInputStream fis = null; try { fis = new FileInputStream(f); char c = 'a'; int ifEnd = 0; Stack stack = new Stack<>(); while((ifEnd=fis.read())!=-1) {// -1 是可以转换为char的,但是 转换之后 c 已经不再是 -1 !!! c = (char)ifEnd; System.out.print(c); if(c=='('||c=='{'||c=='<'||c=='[')stack.push(c); else if(c==')'||c=='}'||c=='>'||c==']') { char top = (char) stack.peek(); if(c==converseChar(top)) { stack.pop(); }else { stack.push(c); } }else if(c=='"'||c=='\'') { if(stack.size()>0){ char top = (char) stack.peek(); if(c==converseChar(top)) { stack.pop(); }else { stack.push(c); } }else { stack.push(c); } } } System.out.println("ifEnd :"+ifEnd+" c :"+ (char)(-1)); if(stack.size()==0)return true; System.out.println("stack remains :" +stack.toString()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return false; } public static char converseChar(char c) { if(c=='(')return ')'; if(c=='{')return '}'; if(c=='<')return '>'; if(c=='[')return ']'; if(c=='"')return '"'; if(c=='\'')return '\''; return ' '; } }
VarObject是一个简单javaBean:
package com.luobk.po; /** * * @author LBK * */ public class VarObject { public String getVar() { return var; } public void setVar(String var) //dsfs { this.var = var; } public String getType( ) { return type; } public void setType(String v) { type = v; } // var name private String var; // var type private String type; }
写是写出来了,但是还是有很多问题。 比如对try catch块到底如何处理比较好? 对于简单行(单字符行)的处理的处理怎么样才好?而且,程序本身有bug,有些地方只是做了简单处理,复杂情况下则引发bug。而且,没有考虑对其他的类的影响...
相关推荐
"Comsol完美吸收器:可见光薄膜与金环宽带吸收器的二维斜入射研究",Comsol完美吸收器。 包含可见光薄膜完美吸收器,涉及二维斜入射。 包含金环宽带完美吸收器。 ,Comsol完美吸收器; 可见光薄膜完美吸收器; 二维斜入射; 金环宽带完美吸收器,"Comsol二维斜入射完美吸收器:可见光薄膜与金环宽带吸收技术"
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
,西门子S7-200smart型PLC使用profinet通讯控制G120变频器程序, 可以实现速度设定与读取,启停和故障复位等功能。
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
,大众斯柯达 免玻璃车道保持新方案
基于PFC5.0的岩石循环加卸载试验的3D实现技术,PFC5.0 3D实现岩石的循环加卸载试验, ,PFC5.0; 3D岩石; 循环加卸载试验; 岩石循环; 岩石加卸载模拟,"PFC5.0三维岩石循环加卸载试验研究"
nodejs010-nodejs-boom-0.4.2-2.el6.centos.alt.noarch.rpm
小学元旦晚会PPT 模版
STEP7-MicroWIN-SMART-V3.0测试版(2025.02最新)安装包-链接地址
内容概要:卷积神经网络(CNN)是一种特殊的神经网络模型,尤其适用于处理图像类的任务,如检测任务、分类与检索、超分辨率重构、医学任务、无人驾驶、人脸识别等。与传统神经网络输入一组向量值不同,CNN能够接受更为复杂的三维输入(深度、高度、宽度),从而有效地降低输入参数量并提高图像处理效率。文中介绍了卷积操作的基本原理及其在图像中的运用,例如通过设置合适的卷积核大小、步幅和零填充等手段,控制特征图的数量和尺度,进而达到优化网络性能的目的。此外还提及了卷积参数共享的概念以及池化层的作用。经典案例包括了AlexNet、VGG网路和残差网络的设计思想和结构特性,尤其是残差网络解决了非常深网络难以训练的问题,并提升了模型的表现力。感受野的介绍则强调了深层网络中的局部感知的重要性。 适合人群:从事计算机视觉领域的研究人员和技术人员,特别是关注图像识别和高级图像处理的研究人员或开发者。 使用场景及目标:①理解并掌握CNN的基本组成单元,如卷积层、池化层的工作机制;②深入探讨经典CNN架构背后的思路及其应用场景,帮助读者提升模型构建能力,以便更好地应用于实际项目中。
nodejs010-1.2-29.el6.centos.alt.x86_64.rpm
COMSOL注浆技术:浆液扩散模型及其应用研究,comsol注浆,浆液扩散模型 ,comsol注浆; 浆液扩散模型,"Comsol注浆技术下的浆液扩散模型研究"
"Modbus全功能调试工具:RTU、ASCII支持,主站调试必备,界面简洁易操作,数据记录与转换,串口助手功能齐备,自动应答及批量连续发送功能强大,学习测试必备利器",MobbusRTU ModbusASCII Modbus调试工具Modbus主站调试工具ModbusMaster支持所有Modbus设备调试; 功能强大,是学习测试的必备工具; 1.界面简洁 2.数据记录功能 3.串口助手功能 4.数据转功能 5.自动应答功能 5.批量发送功能 6.连续发送功能 ,ModbusRTU; ModbusASCII; 调试工具; 主站调试工具; ModbusMaster; 全部设备调试; 功能强大; 界面简洁; 数据记录; 串口助手; 数据转换; 自动应答; 批量发送; 连续发送。,"多功能Modbus调试工具:支持RTU/ASCII,主站必备,功能全面,操作简洁"
一个使用 C++ 结合 DeepSeek 模型进行文本相似度计算的源码。该实例会接收两段文本,借助 DeepSeek 模型提取文本特征,然后通过余弦相似度来衡量两段文本的相似程度。
内容概要:本文详细介绍了传统RNN网络存在的问题及其局限性,进而引出了Transformer模型的核心优势及其结构原理。传统RNN由于串行计算和无法有效处理长距离依赖等问题限制了其应用效果,尤其在自然语言处理领域表现不佳。相比之下,Transformer通过引入自注意力机制(self-attention mechanism)和平行化的架构解决了这些问题。自注意力机制允许模型在同一时间处理完整的输入序列,在计算每个位置的表征时不仅考虑到该位置的元素也综合了其他所有位置的相关度。此外,文章还具体讲解了多头注意力机制(multi-head attention),以及为何引入多头能够捕获更为丰富的语义特征;位置编码(positional encoding)的作用是为了赋予模型区分相同字符在不同顺序组合的意义能力;并在末尾提到了BERT这一基于Transformer的预训练模型及其两种主要训练方式——掩码语言模型(masked language model)和下一个句子预测(next sentence prediction)。总体而言,本文揭示了Transformers架构相对于以往序列建模方法的优势所在。 适合人群:对深度学习尤其是自然语言处理技术有一定基础的理解的研究人员和技术爱好者。 使用场景及目标:帮助读者深入理解为何传统递归神经网络受限于自身的设计无法很好地应对复杂的NLP任务,如翻译或文本摘要,并展示了Transformer是如何克服这些问题的;同时也旨在让有兴趣探索最先进预训练模型如BERT背后逻辑的人群受益。 阅读建议:鉴于本文涉及到大量数学概念与公式推导,请确保自己拥有坚实的机器学习基础知识并且愿意投入足够的时间消化吸收这些新信息。建议配合代码实现一起学习,在实践中加深对各个组件作用的认知。
混合励磁爪极电机在Maxwell中的仿真分析与优化研究,爪极电机 (混合励磁爪极电机) maxwell ,核心关键词:爪极电机; 混合励磁; 爪极电机Maxwell;,混合励磁爪极电机在Maxwell中的仿真研究
内容概要:本文介绍了DeepSeek模型在不同平台上部署的方法。首先阐述了基于Ollama的本地部署,包括Ollama的安装、模型拉取以及交互模式的使用。接着讲解了DeepSeek在移动设备(iOS和Android)上的部署细节:iPhone需要通过Safari安装快捷指令,配置API Key并通过快捷指令测试运行;Android则借助Termux安装必要组件,并手动搭建Ollama环境以加载和测试模型。最后详细叙述了基于Open WebUI部署的方式,涉及Ollama、Docker Desktop及Open WebUI的安装流程及其之间的配合使用来最终达成模型的成功部署。 适用人群:面向有兴趣了解或者实际操作DeepSeek模型跨平台部署的技术开发者、研究人员以及AI爱好者。 使用场景及目标:适用于希望利用DeepSeek模型快速构建本地化应用程序、开展实验研究的用户;具体目标为掌握DeepSeek模型在桌面系统(如Linux、macOS、Windows)、iOS和Android智能手机以及云端WebUI界面上的不同部署手段和技术。 其他说明:对于每种类型的部署都提供了详细的步骤指导,旨在帮助使用者顺利完成所需工具和环境的安装,并确保模型能够正常工作。文中给出的具体链接和命令行脚本,有助于降低初次接触者的上手难度,提升部署效率和成功率。此外,还强调了一些重要的配置注意事项,例如正确输入API key以及对Ollama的初始化检查等。
交变磁场感应材料对沥青路面温度影响的研究,交变磁场下含感应材料沥青路面温度 ,交变磁场; 感应材料; 沥青路面; 温度; 变化; 加热效率,交变磁场对含感应材料沥青路面温度的影响研究
"深度探讨:利用主从博弈理论,结合双层模型与遗传算法及yalmip+cplex求解器实现代码复现的电热综合能源系统动态定价与能量管理",代码复现 《基于主从博弈的电热综合能源系统动态定价与能量管理》 采用双层模型求解 上层为主问题使用遗传算法 下层为子问题调用yalmip+cplex求解器求解 有需要的联系留邮箱 ,代码复现; 动态定价; 能量管理; 主从博弈; 双层模型; 遗传算法; cplex求解器; 联系邮箱,代码复现:双层模型求解电热综合能源系统动态定价与能量管理策略
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx