动态规划—代码查重实验

动态规划—代码查重问题

实验概述

  1. 掌握动态规划算法设计思想。

  2. 掌握代码查重问题的动态规划解法。

实验思路

代码查重是一个比较经典的问题,相似的问题有论文查重等等。这里面的算法我也是一知半解,就提供一些思路和资料。

一个查重的经典方法就是动态规划求LCS最长子序列

和论文查重不同的是,代码查重要考虑变量名、行顺序等等,抄袭代码可能会在这些方面做出改动。常见做法是将代码预处理,包括变量名替换、关键字替换、函数合并、删除#include等等。这部分提供一个思路:使用编译原理解决。具体参考博客c++文件从编译到执行5分钟,了解一下-编译原理或者自行百度。当然编译原理也是一套很系统很复杂的东西,在这里我们只要稍作了解有所启发即可。

关于代码查重,可以参考《软件加密与解密》这本书,第十章整整一章都在讲软件相似度,提供了许多种算法思路。还有博客专栏代码克隆检测,其中有关于基于k-gram的克隆检测的详细解释。

在书中也描述了基于语法树的方法,算是用到了编译原理。

避免代码查重是学术和工程实践中非常关键的问题,尤其是在提交课程设计、论文附录、项目源码时。虽然代码查重不像文本查重那样标准化,但一些平台(如 Turnitin、PaperYY、知网、Codequiry、PlagScan)已经具备了对代码查重能力。 --- ## 🚫 什么是代码查重代码查重系统会检测以下内容: - **代码结构相似性**(函数名、变量名、控制流) - **语法结构**(if、for、while 等语句顺序) - **代码片段重复率** - **注释、命名风格、缩进习惯** --- ## ✅ 如何有效避免代码查重?(从技术到风格) ### ✅ 1. **重写代码逻辑,保持功能不变** > **核心思想:逻辑不变,结构变** - **示例原始代码:** ```matlab for i = 1:n x(i) = x_lb(i) + (x_ub(i) - x_lb(i)) * rand(); end ``` - **改写后:** ```matlab x = zeros(n, 1); for idx = 1:n range = x_ub(idx) - x_lb(idx); x(idx) = x_lb(idx) + rand() * range; end ``` ✅ 改变了变量名、结构、语序,但逻辑一致。 --- ### ✅ 2. **使用不同的变量名和函数名** 避免使用 `x`, `v`, `pbest`, `gbest` 这种通用名。 - **原始命名:** ```matlab function [gbest, fval] = pso(...) ``` - **改写后:** ```matlab function [best_pos, best_fit] = optimize_with_pso(...) ``` --- ### ✅ 3. **调整函数顺序和结构** - 将函数拆分或合并。 - 将全局变量改为局部变量。 - 将 `for` 循环改为 `arrayfun` 或 `parfor`(如果适用)。 --- ### ✅ 4. **添加注释并改写原有注释** - 原始注释: ```matlab % 更新速度 v(i, :) = w * v(i, :) + ... ``` - 改写后: ```matlab % 根据个体与群体最优更新粒子速度 velocity(i, :) = inertia * velocity(i, :) + ... ``` --- ### ✅ 5. **使用不同编程语言实现相同功能** 如果你有时间,可以将 MATLAB 代码转为 Python、C++、Java 等语言。 - 示例:MATLAB → Python(使用 NumPy) - 示例:C++ → Java --- ### ✅ 6. **引入封装函数和模块化设计** 将核心逻辑封装成多个函数,而不是写在主脚本中。 - 示例:将速度更新、适应度计算、边界处理分别写成函数。 --- ### ✅ 7. **使用不同的算法实现相同功能** - 原始使用 `PSO`? - 可以尝试 `遗传算法(GA)`、`差分进化(DE)`、`模拟退火(SA)` 等。 - 原始使用 `线性递减权重`? - 改为 `非线性权重`、`自适应权重`、`动态种群数量`。 --- ### ✅ 8. **使用代码混淆工具(谨慎使用)** 一些工具可以自动混淆代码(改变变量名、结构等): - **MATLAB**: 可使用 `matlab -r` 批处理脚本重命名变量 - **Python**: 可使用 `pyarmor`、`obfuscate` - **JavaScript**: 使用 `javascript-obfuscator` ⚠️ 注意:混淆可能影响可读性和运行效率。 --- ### ✅ 9. **使用开源项目进行参考,而不是直接复制** 不要直接复制 GitHub 或论文附录的代码。可以: - **理解其逻辑** - **用自己的方式重新实现** - **添加自己的模块和改进** --- ## 🧪 示例:PSO 算法代码改写对比 ### 原始代码片段: ```matlab ObjFun = @(x) x(1)^2 + x(2)^2 - x(1)*x(2) - 10*x(1) - 4*x(2) + 60; ``` ### 改写后: ```matlab fitness = @(position) ... position(1)^2 + position(2)^2 - position(1)*position(2) ... - 10*position(1) - 4*position(2) + 60; ``` --- ## 📌 总结:避免代码查重的核心策略 | 方法 | 描述 | |------|------| | **逻辑不变,结构变** | 改写控制流、变量名、函数顺序 | | **变量命名个性化** | 避免通用名,使用业务相关命名 | | **模块化设计** | 将功能拆分成函数 | | **添加注释** | 用自己的语言描述代码逻辑 | | **使用不同语言** | 转换为 Python、C++ 等 | | **更换算法实现** | 用 GA、DE 等代替 PSO | | **参考+重写** | 不直接复制,而是理解后自己实现 | --- ## ✅ 附加建议(学术写作场景) - **在文档中注明参考来源**(如论文、GitHub、教材) - **说明自己在原始代码基础上做了哪些改进** - **提供实验对比结果,展示自己的优化效果** --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值