├── tests ├── __init__.py ├── testPDF │ ├── AIGC.pdf │ ├── AIGC-100.pdf │ ├── refs.bib │ └── AIGC.typ └── test_scramblepdf.py ├── .streamlit └── config.toml ├── scramblepdf ├── cli.py ├── __main__.py └── __init__.py ├── .flake8 ├── img └── logo.png ├── gui └── web │ ├── README.md │ ├── app.py │ └── images │ └── recommended_reference_line_plot.svg ├── .github └── workflows │ ├── test-on-edit.yml │ └── publish.yml ├── LICENSE ├── README.md ├── .gitignore └── pyproject.toml /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.streamlit/config.toml: -------------------------------------------------------------------------------- 1 | [server] 2 | maxUploadSize = 20 -------------------------------------------------------------------------------- /scramblepdf/cli.py: -------------------------------------------------------------------------------- 1 | def cli(): 2 | from .__main__ import main as _ 3 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 88 3 | extend-ignore = W291 E704 E266 -------------------------------------------------------------------------------- /img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VermiIIi0n/scramble-pdf/HEAD/img/logo.png -------------------------------------------------------------------------------- /gui/web/README.md: -------------------------------------------------------------------------------- 1 | ```bash 2 | streamlit run app.py 3 | ``` 4 | 5 | http://localhost:8501 6 | -------------------------------------------------------------------------------- /tests/testPDF/AIGC.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VermiIIi0n/scramble-pdf/HEAD/tests/testPDF/AIGC.pdf -------------------------------------------------------------------------------- /tests/testPDF/AIGC-100.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VermiIIi0n/scramble-pdf/HEAD/tests/testPDF/AIGC-100.pdf -------------------------------------------------------------------------------- /.github/workflows/test-on-edit.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests on Python File Edits 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**/*.py' 7 | pull_request: 8 | paths: 9 | - '**/*.py' 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v3 18 | 19 | - name: Set up Python 20 | uses: actions/setup-python@v4 21 | with: 22 | python-version: '3.12' 23 | 24 | - name: Install dependencies 25 | run: | 26 | python -m pip install --upgrade pip 27 | pip install poetry 28 | poetry install 29 | 30 | - name: Run tests 31 | run: | 32 | poetry run pytest --disable-warnings -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Upload Python Package 2 | 3 | on: 4 | push: 5 | tags: 6 | - v*.*.* 7 | 8 | jobs: 9 | pypi-publish: 10 | name: upload release to PyPI 11 | runs-on: ubuntu-latest 12 | permissions: 13 | id-token: write 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Set up Python 17 | uses: actions/setup-python@v5 18 | with: 19 | python-version: "3.12" 20 | - name: Install dependencies 21 | run: | 22 | python -m pip install -U pip 23 | pip install -U poetry 24 | poetry install 25 | - name: Build Package 26 | run: | 27 | poetry build 28 | - name: Publish package distributions to PyPI 29 | uses: pypa/gh-action-pypi-publish@release/v1 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) VermiIIi0n 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Scramble PDF Text Encodings 2 | 3 |

4 | logo 5 |

6 | 7 | Make your essay unreadable to simple programs. Still readable by humans and OCR. 8 | 9 | If you think this is a terrible idea, I know it is, and it's probably not for you. 10 | 11 | [DEMO WEBSITE](http://103.38.80.82/) 12 | 13 | ## Usage Guide 14 | 15 | ### `pip` Install 16 | 17 | ```shell 18 | pip install scramblepdf 19 | ``` 20 | 21 | or with webui support: 22 | 23 | ```shell 24 | pip install "scramblepdf[webui]" 25 | ``` 26 | 27 | ### Local Install 28 | 29 | #### Install Poetry 30 | 31 | ```shell 32 | curl -sSL https://install.python-poetry.org | python3 - 33 | # or follow the instructions on Poetry’s official site. 34 | ``` 35 | 36 | #### Clone the Repository 37 | 38 | ```shell 39 | git clone https://github.com/VermiIIi0n/scramble-pdf.git 40 | cd scramble-pdf 41 | ``` 42 | 43 | #### Install Dependencies 44 | 45 | ```shell 46 | poetry install 47 | ``` 48 | 49 | #### Activate the Virtual Environment 50 | 51 | ```shell 52 | poetry env activate 53 | # poetry shell 54 | ``` 55 | 56 | ### Run in CLI 57 | 58 | ```shell 59 | python -m scramblepdf input_pdf output_pdf --ratio 0.3 60 | # choose ratio between 0 and 1.0, default: 1.0 61 | ``` 62 | 63 | ### Run in WebGUI 64 | 65 | ```shell 66 | streamlit run gui/web/app.py 67 | ``` 68 | -------------------------------------------------------------------------------- /scramblepdf/__main__.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import argparse 3 | import json 4 | import os 5 | import re 6 | import unicodedata 7 | from pikepdf import Pdf 8 | from scramblepdf import scramble_pdf 9 | 10 | 11 | def main() -> int: 12 | parser = argparse.ArgumentParser( 13 | description="Obfuscate PDF text by scrambling each font’s /ToUnicode mapping" 14 | ) 15 | parser.add_argument("input_pdf", help="Source PDF path") 16 | parser.add_argument("output_pdf", help="Scrambled PDF output path") 17 | parser.add_argument( 18 | "--mapping", default=None, 19 | help="Where to read/write the old→new codepoint mappings" 20 | ) 21 | parser.add_argument("-r", "--ratio", type=float, default=1.0, 22 | help="Ratio of encoding mappings to scramble (0.0-1.0)") 23 | parser.add_argument("-l", "--letters", action="store_true", default=False, 24 | help="Select letters to skip or scramble") 25 | parser.add_argument("-L", "--non-letters", action="store_true", default=False, 26 | help="Select non-letters to skip or scramble") 27 | parser.add_argument("-s", "--selectregex", type=str, default=None, 28 | help="Regex to select codepoints to skip or scramble") 29 | parser.add_argument("-w", "--whitelist", action="store_true", default=False, 30 | help="Whitelist all selections (default: blacklist)") 31 | args = parser.parse_args() 32 | 33 | ratio = max(0.0, min(1.0, args.ratio)) 34 | 35 | if args.selectregex is not None: 36 | # compile the regex 37 | try: 38 | selre = re.compile(args.selectregex) 39 | except re.error as e: 40 | print(f"Invalid regex: {e}") 41 | return 1 42 | 43 | def selector_func(c: str) -> bool: 44 | ret = False 45 | if args.selectregex is not None: 46 | ret = bool(selre.match(c)) 47 | if args.letters: 48 | ret = ret or not unicodedata.category(c).startswith("L") 49 | if args.non_letters: 50 | ret = ret or not unicodedata.category(c).startswith("L") 51 | return ret 52 | 53 | # load or init the mapping store 54 | if args.mapping is not None and os.path.exists(args.mapping): 55 | with open(args.mapping, 'r') as f: 56 | font_mappings = json.load(f) 57 | else: 58 | font_mappings = None 59 | 60 | pdf = Pdf.open(args.input_pdf) 61 | 62 | scramble_pdf( 63 | pdf, 64 | ratio, 65 | font_mappings=font_mappings, 66 | selector=selector_func, 67 | select_as_blacklist=not args.whitelist, 68 | ) 69 | 70 | # write back the mapping so you can repeat the same scramble 71 | if args.mapping is not None: 72 | with open(args.mapping, 'w') as f: 73 | json.dump(font_mappings, f, indent=2) 74 | 75 | # save the scrambled PDF 76 | pdf.save(args.output_pdf) 77 | print(f"Written scrambled PDF to {args.output_pdf}") 78 | return 0 79 | 80 | 81 | if __name__ == "__main__": 82 | sys.exit(main()) 83 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | noupload 2 | workflow.* 3 | **/logs 4 | *.json 5 | /savedpdf 6 | log.csv 7 | *.pdf 8 | *.pdf.zip 9 | !tests/testPDF/AIGC.pdf 10 | !tests/testPDF/AIGC-100.pdf 11 | !demo_config.json 12 | exports/ 13 | **/test.* 14 | 15 | # Byte-compiled / optimized / DLL files 16 | __pycache__/ 17 | *.py[cod] 18 | *$py.class 19 | 20 | # C extensions 21 | *.so 22 | 23 | # Distribution / packaging 24 | .Python 25 | build/ 26 | develop-eggs/ 27 | dist/ 28 | downloads/ 29 | eggs/ 30 | .eggs/ 31 | lib/ 32 | lib64/ 33 | parts/ 34 | sdist/ 35 | var/ 36 | wheels/ 37 | pip-wheel-metadata/ 38 | share/python-wheels/ 39 | *.egg-info/ 40 | .installed.cfg 41 | *.egg 42 | MANIFEST 43 | 44 | # PyInstaller 45 | # Usually these files are written by a python script from a template 46 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 47 | *.manifest 48 | *.spec 49 | 50 | # Installer logs 51 | pip-log.txt 52 | pip-delete-this-directory.txt 53 | 54 | # Unit test / coverage reports 55 | htmlcov/ 56 | .tox/ 57 | .nox/ 58 | .coverage 59 | .coverage.* 60 | .cache 61 | nosetests.xml 62 | coverage.xml 63 | *.cover 64 | *.py,cover 65 | .hypothesis/ 66 | .pytest_cache/ 67 | 68 | # Translations 69 | *.mo 70 | *.pot 71 | 72 | # Django stuff: 73 | *.log 74 | local_settings.py 75 | db.sqlite3 76 | db.sqlite3-journal 77 | 78 | # Flask stuff: 79 | instance/ 80 | .webassets-cache 81 | 82 | # Scrapy stuff: 83 | .scrapy 84 | 85 | # Sphinx documentation 86 | docs/_build/ 87 | 88 | # PyBuilder 89 | target/ 90 | 91 | # Jupyter Notebook 92 | .ipynb_checkpoints 93 | 94 | # IPython 95 | profile_default/ 96 | ipython_config.py 97 | 98 | # pyenv 99 | .python-version 100 | 101 | # pipenv 102 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 103 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 104 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 105 | # install all needed dependencies. 106 | #Pipfile.lock 107 | 108 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 109 | __pypackages__/ 110 | 111 | # Celery stuff 112 | celerybeat-schedule 113 | celerybeat.pid 114 | 115 | # SageMath parsed files 116 | *.sage.py 117 | 118 | # Environments 119 | .env 120 | .venv 121 | env/ 122 | venv/ 123 | ENV/ 124 | env.bak/ 125 | venv.bak/ 126 | 127 | # Spyder project settings 128 | .spyderproject 129 | .spyproject 130 | 131 | # Rope project settings 132 | .ropeproject 133 | 134 | # mkdocs documentation 135 | /site 136 | 137 | # mypy 138 | .mypy_cache/ 139 | .dmypy.json 140 | dmypy.json 141 | 142 | # Pyre type checker 143 | .pyre/ 144 | 145 | # macOS system files 146 | .DS_Store 147 | .AppleDouble 148 | .LSOverride 149 | 150 | # macOS Thumbnails 151 | ._* 152 | 153 | # macOS Files that might appear in the root of a volume 154 | .DocumentRevisions-V100 155 | .fseventsd 156 | .Spotlight-V100 157 | .TemporaryItems 158 | .Trashes 159 | .VolumeIcon.icns 160 | .com.apple.timemachine.donotpresent 161 | 162 | # macOS Directories potentially created on remote AFP share 163 | .AppleDB 164 | .AppleDesktop 165 | Network Trash Folder 166 | Temporary Items 167 | .apdisk 168 | 169 | # Experiments directory 170 | experiments/ 171 | -------------------------------------------------------------------------------- /tests/testPDF/refs.bib: -------------------------------------------------------------------------------- 1 | @article{wang2022deep, 2 | title={深度学习在智能制造系统中的应用研究}, 3 | author={王明 and 李华}, 4 | journal={系统工程理论与实践}, 5 | volume={42}, 6 | number={3}, 7 | pages={45--58}, 8 | year={2022} 9 | } 10 | 11 | @inproceedings{zhang2021cloud, 12 | title={基于云计算的工业物联网系统架构设计}, 13 | author={张伟 and 刘强}, 14 | booktitle={中国自动化大会论文集}, 15 | pages={234--239}, 16 | year={2021} 17 | } 18 | 19 | @article{liu2023ai, 20 | title={人工智能驱动的复杂系统优化方法研究}, 21 | author={刘芳 and 陈明}, 22 | journal={计算机科学}, 23 | volume={50}, 24 | number={4}, 25 | pages={89--97}, 26 | year={2023} 27 | } 28 | 29 | @book{chen2022system, 30 | title={系统工程方法与实践}, 31 | author={陈光 and 王红}, 32 | publisher={科学出版社}, 33 | address={北京}, 34 | year={2022} 35 | } 36 | 37 | @article{huang2023edge, 38 | title={边缘计算在智能交通系统中的应用}, 39 | author={黄伟 and 赵明}, 40 | journal={计算机工程}, 41 | volume={49}, 42 | number={2}, 43 | pages={112--121}, 44 | year={2023} 45 | } 46 | 47 | @inproceedings{li2022blockchain, 48 | title={区块链技术在供应链系统中的创新应用}, 49 | author={李强 and 张华}, 50 | booktitle={系统工程与电子技术会议论文集}, 51 | pages={567--573}, 52 | year={2022} 53 | } 54 | 55 | @article{zhao2023smart, 56 | title={智慧城市系统集成关键技术研究}, 57 | author={赵峰 and 王伟}, 58 | journal={系统仿真学报}, 59 | volume={35}, 60 | number={5}, 61 | pages={78--86}, 62 | year={2023} 63 | } 64 | 65 | @book{wu2021software, 66 | title={软件系统工程实践指南}, 67 | author={吴刚 and 李明}, 68 | publisher={电子工业出版社}, 69 | address={北京}, 70 | year={2021} 71 | } 72 | 73 | @article{sun2022data, 74 | title={大数据驱动的智能决策系统研究}, 75 | author={孙华 and 张强}, 76 | journal={计算机应用研究}, 77 | volume={39}, 78 | number={6}, 79 | pages={156--164}, 80 | year={2022} 81 | } 82 | 83 | @inproceedings{yang2023network, 84 | title={网络安全系统架构优化研究}, 85 | author={杨光 and 李华}, 86 | booktitle={信息安全学术会议论文集}, 87 | pages={345--352}, 88 | year={2023} 89 | } 90 | 91 | @article{lin2022optimization, 92 | title={复杂工程系统优化算法研究}, 93 | author={林峰 and 王明}, 94 | journal={系统工程学报}, 95 | volume={37}, 96 | number={4}, 97 | pages={67--75}, 98 | year={2022} 99 | } 100 | 101 | @book{zhang2023digital, 102 | title={数字化转型与系统工程}, 103 | author={张明 and 陈华}, 104 | publisher={机械工业出版社}, 105 | address={北京}, 106 | year={2023} 107 | } 108 | 109 | @article{wang2023intelligent, 110 | title={智能制造系统集成技术研究}, 111 | author={王强 and 李伟}, 112 | journal={计算机集成制造系统}, 113 | volume={29}, 114 | number={3}, 115 | pages={123--132}, 116 | year={2023} 117 | } 118 | 119 | @inproceedings{chen2022cloud, 120 | title={云计算环境下的系统可靠性分析}, 121 | author={陈伟 and 张强}, 122 | booktitle={可靠性工程学术会议论文集}, 123 | pages={234--241}, 124 | year={2022} 125 | } 126 | 127 | @article{liu2023distributed, 128 | title={分布式系统协同优化方法研究}, 129 | author={刘明 and 王华}, 130 | journal={软件学报}, 131 | volume={34}, 132 | number={5}, 133 | pages={89--98}, 134 | year={2023} 135 | } 136 | 137 | @book{zhou2022modern, 138 | title={现代系统工程方法论}, 139 | author={周强 and 李明}, 140 | publisher={高等教育出版社}, 141 | address={北京}, 142 | year={2022} 143 | } 144 | 145 | @article{tang2023ai, 146 | title={人工智能在系统故障诊断中的应用}, 147 | author={唐华 and 张伟}, 148 | journal={控制与决策}, 149 | volume={38}, 150 | number={4}, 151 | pages={145--154}, 152 | year={2023} 153 | } 154 | 155 | @inproceedings{ma2022iot, 156 | title={物联网系统安全防护技术研究}, 157 | author={马强 and 王峰}, 158 | booktitle={网络安全技术研讨会论文集}, 159 | pages={456--463}, 160 | year={2022} 161 | } 162 | 163 | @article{feng2023quantum, 164 | title={量子计算在系统优化中的应用前景}, 165 | author={冯明 and 李强}, 166 | journal={计算机研究与发展}, 167 | volume={60}, 168 | number={2}, 169 | pages={234--243}, 170 | year={2023} 171 | } 172 | 173 | @book{guo2022system, 174 | title={系统工程与项目管理}, 175 | author={郭华 and 张明}, 176 | publisher={清华大学出版社}, 177 | address={北京}, 178 | year={2022} 179 | } 180 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "scramblepdf" 3 | version = "0.3.5" 4 | description = "" 5 | authors = ["VermiIIi0n "] 6 | readme = "README.md" 7 | packages = [{ include = "scramblepdf" }] 8 | license = "MIT" 9 | homepage = "https://github.com/VermiIIi0n/scramble-pdf" 10 | 11 | keywords = [ 12 | "utilities", 13 | ] 14 | 15 | classifiers = [ 16 | "Development Status :: 4 - Beta", 17 | "Framework :: Pytest", 18 | "Intended Audience :: Developers", 19 | "License :: OSI Approved :: MIT License", 20 | "Topic :: Utilities", 21 | "Programming Language :: Python :: 3", 22 | "Programming Language :: Python :: 3.12", 23 | "Programming Language :: Python :: Implementation :: CPython", 24 | "Programming Language :: Python :: Implementation :: PyPy", 25 | "Operating System :: OS Independent", 26 | "Typing :: Typed", 27 | ] 28 | 29 | [tool.poetry.dependencies] 30 | python = "^3.12" 31 | pikepdf = "^9.7.0" 32 | fonttools = "^4.57.0" 33 | 34 | [tool.poetry.extras] 35 | "webui" = ["streamlit"] 36 | 37 | [tool.poetry.group.dev.dependencies] 38 | 39 | # coveralls = ">3.3.1" 40 | # sphinx-autoapi = "^2.1.0" 41 | # sphinx-autodoc-typehints = "^1.22" 42 | toml = "^0.10.2" 43 | pytest = "^8.0.0" 44 | pytest-asyncio = "^0.23.5" 45 | pytest-cov = "^4.1.0" 46 | coverage = { extras = ["toml"], version = "^7.4.1" } 47 | mypy = "^1.8.0" 48 | types-toml = "^0.10.8.7" 49 | autopep8 = "^2.0.4" 50 | 51 | 52 | 53 | [tool.poetry.group.webui.dependencies] 54 | streamlit = "^1.44.1" 55 | 56 | [tool.coverage.run] 57 | branch = true 58 | 59 | [tool.coverage.report] 60 | exclude_lines = [ 61 | "pragma: no cover", 62 | "raise NotImplementedError.*", 63 | "return NotImplemented", 64 | "warnings\\.warn.*", 65 | "def main()", 66 | "if __name__ == .__main__.:", 67 | "if TYPE_CHECKING:", 68 | "except ImportError", 69 | "@overload", 70 | "@abstractmethod", 71 | ] 72 | include = ["scramblepdf/*"] 73 | 74 | [tool.pytest.ini_options] 75 | asyncio_mode = "auto" 76 | addopts = "--verbose --cov-append --cov-report term --cov scramblepdf" 77 | 78 | [tool.mypy] 79 | enable_error_code = [ 80 | "type-var", 81 | "call-overload", 82 | "abstract", 83 | "override", 84 | "unused-awaitable", 85 | "unused-coroutine", 86 | "var-annotated", 87 | "index", 88 | "assignment", 89 | "var-annotated", 90 | "misc", 91 | "redundant-cast", 92 | "comparison-overlap", 93 | "redundant-expr", 94 | "truthy-bool", 95 | ] 96 | disable_error_code = [ 97 | "type-arg", 98 | "no-untyped-def", 99 | "no-untyped-call", 100 | "no-redef", 101 | ] 102 | # plugins = "pydantic.mypy" 103 | ignore_missing_imports = true 104 | no_implicit_optional = false 105 | warn_redundant_casts = true 106 | warn_unused_ignores = true 107 | show_column_numbers = true 108 | show_error_context = true 109 | check_untyped_defs = true 110 | warn_unreachable = false 111 | show_error_codes = true 112 | warn_return_any = false 113 | warn_no_return = true 114 | show_traceback = false 115 | color_output = true 116 | pretty = true 117 | 118 | # [tool.pydantic-mypy] 119 | # #init_forbid_extra = true 120 | # #init_typed = true 121 | # #warn_required_dynamic_aliases = true 122 | # warn_untyped_fields = true 123 | 124 | [[tool.mypy.overrides]] 125 | module = "tests.*" 126 | ignore_errors = true 127 | 128 | [tool.sphinx-autodoc] 129 | # Display the docstring of modules, classes, and functions 130 | # even if they don't have a docstring 131 | # Possible values: True, False (default: False) 132 | # Set to True to display the docstring even if it is empty 133 | # or if the module/class/function doesn't have a docstring. 134 | member-order = "bysource" 135 | show-inheritance = true 136 | undoc-members = true 137 | 138 | [tool.poetry.urls] 139 | "Issues" = "https://github.com/VermiIIi0n/scramble-pdf/issues" 140 | 141 | [build-system] 142 | requires = ["poetry-core"] 143 | build-backend = "poetry.core.masonry.api" 144 | 145 | [tool.poetry.scripts] 146 | scramblepdf = "scramblepdf.cli:cli" 147 | -------------------------------------------------------------------------------- /tests/test_scramblepdf.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from scramblepdf import parse_cmap, build_cmap, scramble_pdf 3 | from unittest.mock import patch, MagicMock, ANY 4 | from typing import BinaryIO 5 | from pikepdf import Pdf 6 | import sys 7 | from scramblepdf import __main__ 8 | from scramblepdf.cli import cli 9 | import tempfile 10 | 11 | def test_parse_cmap(): 12 | # Test parse_cmap with a valid beginbfchar / endbfchar block 13 | cmap_bytes = b"beginbfchar\n<0000> <0020>\n<0001> <0021>\nendbfchar" 14 | expected = [("0000", "0020"), ("0001", "0021")] 15 | result = list(parse_cmap(cmap_bytes)) 16 | assert result == expected 17 | 18 | # Additional coverage for beginbfrange parsing (both direct and array forms) 19 | def test_parse_cmap_bfrange(): 20 | # Direct range form 21 | cmap_bytes = ( 22 | b"beginbfrange\n" 23 | b"<0000> <0002> <0020>\n" # maps 0000,0001,0002 -> 0020,0021,0022 24 | b"endbfrange" 25 | ) 26 | expected_direct = [("0000", "0020"), ("0001", "0021"), ("0002", "0022")] 27 | assert list(parse_cmap(cmap_bytes)) == expected_direct 28 | 29 | # Array form 30 | cmap_array_bytes = ( 31 | b"beginbfrange\n" 32 | b"<0003> <0005> [<0030> <0031> <0032>]\n" # explicit dst list 33 | b"endbfrange" 34 | ) 35 | expected_array = [("0003", "0030"), ("0004", "0031"), ("0005", "0032")] 36 | assert list(parse_cmap(cmap_array_bytes)) == expected_array 37 | 38 | def test_build_cmap(): 39 | # Test build_cmap function 40 | mapping = {"0000": "0020", "0001": "0021"} 41 | cmap_string = build_cmap(mapping) 42 | # Should include correct count and mappings 43 | assert f"{len(mapping)} beginbfchar" in cmap_string 44 | assert "<0000> <0020>" in cmap_string 45 | assert "<0001> <0021>" in cmap_string 46 | assert "endcmap" in cmap_string 47 | 48 | def test_scramble_pdf(): 49 | # Test scramble_pdf function using mock 50 | pdf_mock = MagicMock(spec=Pdf) 51 | font_mappings = {} 52 | selector = lambda x: x == "A" 53 | scramble_pdf(pdf_mock, 0.5, font_mappings=font_mappings, selector=selector) 54 | 55 | # New tests for error cases and selector container 56 | def test_invalid_ratio(): 57 | with pytest.raises(ValueError): 58 | scramble_pdf(MagicMock(spec=Pdf, pages=[]), -0.1) 59 | with pytest.raises(ValueError): 60 | scramble_pdf(MagicMock(spec=Pdf, pages=[]), 1.1) 61 | 62 | def test_zero_ratio_no_changes(): 63 | pdf_mock = MagicMock(spec=Pdf) 64 | pdf_mock.pages = [] 65 | assert scramble_pdf(pdf_mock, 0.0) is None 66 | 67 | def test_selector_as_container(): 68 | pdf_mock = MagicMock(spec=Pdf) 69 | pdf_mock.pages = [] 70 | scramble_pdf(pdf_mock, 1.0, selector={'A', 'B'}) 71 | 72 | # Revised test_main 73 | def test_main(): 74 | with patch('argparse.ArgumentParser.parse_args', return_value=MagicMock( 75 | input_pdf='in.pdf', output_pdf='out.pdf', mapping=None, 76 | ratio=0.5, letters=False, non_letters=False, 77 | selectregex=None, whitelist=False)), \ 78 | patch('pikepdf.Pdf.open', return_value=MagicMock(spec=Pdf)) as open_mock, \ 79 | patch('scramblepdf.__main__.scramble_pdf') as scramble_mock: 80 | pdf_instance = open_mock.return_value 81 | result = __main__.main() 82 | assert result == 0 83 | open_mock.assert_called_once_with('in.pdf') 84 | scramble_mock.assert_called_once_with( 85 | pdf_instance, 0.5, font_mappings=None, 86 | selector=ANY, select_as_blacklist=True) 87 | pdf_instance.save.assert_called_once_with('out.pdf') 88 | 89 | # Tests for selector_func behavior via main 90 | def test_selector_func_regex(): 91 | with patch('argparse.ArgumentParser.parse_args', return_value=MagicMock( 92 | input_pdf='in.pdf', output_pdf='out.pdf', mapping=None, 93 | ratio=1.0, letters=False, non_letters=False, 94 | selectregex='[A-Z]', whitelist=False)), \ 95 | patch('pikepdf.Pdf.open', return_value=MagicMock(spec=Pdf)), \ 96 | patch('scramblepdf.__main__.scramble_pdf') as scramble_mock: 97 | __main__.main() 98 | scramble_mock.assert_called_once() 99 | args, kwargs = scramble_mock.call_args 100 | selector = kwargs['selector'] 101 | assert selector('A') is True 102 | assert selector('Z') is True 103 | assert selector('a') is False 104 | assert selector('0') is False 105 | 106 | def test_selector_func_letters_flag(): 107 | with patch('argparse.ArgumentParser.parse_args', return_value=MagicMock( 108 | input_pdf='in.pdf', output_pdf='out.pdf', mapping=None, 109 | ratio=1.0, letters=True, non_letters=False, 110 | selectregex=None, whitelist=False)), \ 111 | patch('pikepdf.Pdf.open', return_value=MagicMock(spec=Pdf)), \ 112 | patch('scramblepdf.__main__.scramble_pdf') as scramble_mock: 113 | __main__.main() 114 | scramble_mock.assert_called_once() 115 | args, kwargs = scramble_mock.call_args 116 | selector = kwargs['selector'] 117 | # letters flag: non-letters selected, letters skipped 118 | assert selector('A') is False 119 | assert selector('1') is True 120 | 121 | def test_selector_func_non_letters_flag(): 122 | with patch('argparse.ArgumentParser.parse_args', return_value=MagicMock( 123 | input_pdf='in.pdf', output_pdf='out.pdf', mapping=None, 124 | ratio=1.0, letters=False, non_letters=True, 125 | selectregex=None, whitelist=False)), \ 126 | patch('pikepdf.Pdf.open', return_value=MagicMock(spec=Pdf)), \ 127 | patch('scramblepdf.__main__.scramble_pdf') as scramble_mock: 128 | __main__.main() 129 | scramble_mock.assert_called_once() 130 | args, kwargs = scramble_mock.call_args 131 | selector = kwargs['selector'] 132 | # non_letters flag: same behavior as letters 133 | assert selector('A') is False 134 | assert selector('1') is True 135 | 136 | def test_cli(): 137 | # cli should not error and return None 138 | assert cli() is None 139 | 140 | def test_scramble_pdf_with_aigc(): 141 | # Test scramble_pdf with AIGC.pdf using a temporary file 142 | input_pdf_path = 'tests/testPDF/AIGC.pdf' 143 | 144 | with tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) as temp_output: 145 | try: 146 | pdf = Pdf.open(input_pdf_path) 147 | scramble_pdf(pdf, ratio=1.0) 148 | pdf.save(temp_output.name) 149 | except Exception as e: 150 | pytest.fail(f"scramble_pdf raised an exception: {e}") 151 | 152 | def test_build_cmap_large_mapping(): 153 | # Build a mapping larger than 100 items to trigger multiple beginbfchar blocks 154 | mapping = {f"{i:04X}": f"{(i+0x20):04X}" for i in range(150)} 155 | cmap_text = build_cmap(mapping) 156 | # There should be at least two beginbfchar blocks (first 100, then 50) 157 | assert cmap_text.count("beginbfchar") == 2 158 | assert cmap_text.count("endbfchar") == 2 159 | # Spot-check a couple of mappings 160 | assert "<0000> <0020>" in cmap_text 161 | assert "<0076> <0096>" in cmap_text 162 | -------------------------------------------------------------------------------- /scramblepdf/__init__.py: -------------------------------------------------------------------------------- 1 | import random 2 | import re 3 | from itertools import chain 4 | from typing import Container, Callable, Generator 5 | from pikepdf import Pdf 6 | 7 | 8 | def parse_cmap(cmap_bytes: bytes) -> Generator[tuple[str, str], None, None]: 9 | text = cmap_bytes.decode("utf-8", errors="ignore") 10 | mappings: dict[str, str] = {} 11 | 12 | # --- beginbfchar ------------------------------------------------------- 13 | for block in re.finditer(r"beginbfchar\s*(.*?)\s*endbfchar", text, flags=re.DOTALL): 14 | content = block.group(1) 15 | for match in re.finditer(r"<([0-9A-Fa-f]+)>\s+<([0-9A-Fa-f]+)>", content): 16 | src, dst = match.group(1), match.group(2) 17 | if src not in mappings: 18 | mappings[src] = dst 19 | 20 | # --- beginbfrange ------------------------------------------------------ 21 | for block in re.finditer(r"beginbfrange\s*(.*?)\s*endbfrange", text, flags=re.DOTALL): 22 | content = block.group(1) 23 | 24 | for line in content.splitlines(): 25 | line = line.strip() 26 | if not line: 27 | continue 28 | 29 | # 1. Array form: [ ...] 30 | if '[' in line: 31 | m = re.match(r"<([0-9A-Fa-f]+)>\s+<([0-9A-Fa-f]+)>\s+\[(.*)\]", line) 32 | if not m: 33 | continue 34 | start = int(m.group(1), 16) 35 | end = int(m.group(2), 16) 36 | dsts = re.findall(r"<([0-9A-Fa-f]+)>", m.group(3)) 37 | for i, code in enumerate(range(start, end + 1)): 38 | if i < len(dsts): 39 | src_hex = f"{code:0{len(m.group(1))}X}" 40 | if src_hex not in mappings: 41 | mappings[src_hex] = dsts[i] 42 | else: 43 | # 2. Direct range form: 44 | m = re.match( 45 | r"<([0-9A-Fa-f]+)>\s+<([0-9A-Fa-f]+)>\s+<([0-9A-Fa-f]+)>", line) 46 | if not m: 47 | continue 48 | start = int(m.group(1), 16) 49 | end = int(m.group(2), 16) 50 | dst_start = int(m.group(3), 16) 51 | for i, code in enumerate(range(start, end + 1)): 52 | src_hex = f"{code:0{len(m.group(1))}X}" 53 | if src_hex not in mappings: 54 | dst_hex = f"{dst_start + i:0{len(m.group(3))}X}" 55 | mappings[src_hex] = dst_hex 56 | 57 | # Yield in insertion order to keep deterministic behaviour 58 | for src, dst in mappings.items(): 59 | yield src, dst 60 | 61 | 62 | def build_cmap(mapping: dict[str, str]) -> str: 63 | max_len = max(len(src) for src in mapping) 64 | byte_len = max_len // 2 65 | min_code = '0' * (2*byte_len) 66 | max_code = 'F' * (2*byte_len) 67 | 68 | lines = [ 69 | "%!PS-Adobe-3.0 Resource-CMap", 70 | "%%DocumentNeededResources: procset CIDInit", 71 | "%%IncludeResource: procset CIDInit", 72 | "%%BeginResource: CMap Custom", 73 | "%%Title: (Custom Adobe Identity 0)", 74 | "%%Version: 1", 75 | "%%EndComments", 76 | "/CIDInit /ProcSet findresource begin", 77 | "12 dict begin", 78 | "begincmap", 79 | "/CIDSystemInfo 3 dict dup begin", 80 | " /Registry (Adobe) def", 81 | " /Ordering (Identity) def", 82 | " /Supplement 0 def", 83 | "end def", 84 | "/CMapName /Custom def", 85 | "/CMapVersion 1 def", 86 | "/CMapType 0 def", 87 | "/WMode 0 def", 88 | "1 begincodespacerange", 89 | f"<{min_code}> <{max_code}>", 90 | "endcodespacerange", 91 | f"{min(100, len(mapping))} beginbfchar", 92 | ] 93 | for i, (src, dst) in enumerate(mapping.items()): 94 | if i and i % 100 == 0 and i != len(mapping)-1: 95 | lines.append("endbfchar") 96 | lines.append(f"{min(100, len(mapping)-i)} beginbfchar") 97 | lines.append(f"<{src}> <{dst}>") 98 | lines += [ 99 | "endbfchar", 100 | "endcmap", 101 | "CMapName currentdict /CMap defineresource pop", 102 | "end", 103 | "end", 104 | "%%EndResource", 105 | "%%EOF" 106 | ] 107 | return "\n".join(lines) 108 | 109 | 110 | def scramble_pdf( 111 | pdf: Pdf, 112 | ratio: float = 1.0, 113 | *, 114 | font_mappings: dict[str, dict[str, str]] | None = None, 115 | selector: Callable[[str], bool] | Container[str] | None = None, 116 | select_as_blacklist: bool = True, 117 | ) -> None: 118 | if font_mappings is None: 119 | font_mappings = {} 120 | if ratio < 0.0 or ratio > 1.0: 121 | raise ValueError("Ratio must be between 0.0 and 1.0") 122 | if ratio == 0.0: 123 | return 124 | if selector is not None and not callable(selector): 125 | if isinstance(selector, Container): 126 | sel_ctn = selector 127 | def selector(x): return x in sel_ctn 128 | else: 129 | raise ValueError("Selector must be callable or a container") 130 | 131 | # walk every page, every font, randomize its ToUnicode 132 | for page in pdf.pages: 133 | resources = page.get('/Resources', None) 134 | if resources is None: 135 | continue 136 | fonts = resources.get('/Font', None) 137 | if fonts is None: 138 | continue 139 | for font_ref, font_obj in fonts.items(): 140 | if '/ToUnicode' not in font_obj: 141 | continue 142 | 143 | basefont = str(font_obj.get('/BaseFont')) 144 | # either reuse a previous shuffle... 145 | if basefont in font_mappings: 146 | mapping = font_mappings[basefont] 147 | else: 148 | # parse original ToUnicode CMap 149 | cmap_stream = font_obj['/ToUnicode'] 150 | raw = cmap_stream.read_bytes() 151 | entries = parse_cmap(raw) 152 | to_keep = list[tuple[str, str]]() 153 | to_scramble = list[tuple[str, str]]() 154 | for src, dst in entries: 155 | dstc = bytes.fromhex(dst).decode( 156 | 'utf-16be', errors='ignore').strip('\x00') 157 | if ( 158 | len(dstc) == 1 and 159 | ( 160 | selector is None 161 | or (selector(dstc) != select_as_blacklist) 162 | ) 163 | and random.random() <= ratio 164 | ): 165 | to_scramble.append((src, dst)) 166 | else: 167 | to_keep.append((src, dst)) 168 | srcs, dsts = zip(*to_scramble) if to_scramble else ([], []) 169 | ndsts = list(dsts) 170 | random.shuffle(ndsts) 171 | mapping = dict(chain(zip(srcs, ndsts), to_keep)) 172 | font_mappings[basefont] = mapping 173 | 174 | # build a new CMap and replace the stream 175 | new_cmap_text = build_cmap(mapping) 176 | new_stream = pdf.make_stream(new_cmap_text.encode('utf-8')) 177 | font_obj['/ToUnicode'] = new_stream 178 | -------------------------------------------------------------------------------- /gui/web/app.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import os 3 | import tempfile 4 | import unicodedata 5 | import csv 6 | import datetime 7 | import time 8 | import random 9 | from pikepdf import Pdf 10 | from scramblepdf import scramble_pdf 11 | 12 | # 定义日志文件路径 13 | LOG_FILE = "savedpdf/log.csv" 14 | SAVED_PDF_DIR = "savedpdf" 15 | 16 | # 定义最大文件大小(MB) 17 | MAX_FILE_SIZE_MB = 20 18 | 19 | # 默认启用处理延迟(模拟处理耗时),但会被UI选项覆盖 20 | enable_processing_delay = True 21 | 22 | def log_pdf_processing(original_filename, saved_filename, file_size_mb, scramble_ratio, protected_chars=None): 23 | """将PDF处理信息记录到CSV日志文件中""" 24 | timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 25 | 26 | # 确保savedpdf目录存在 27 | os.makedirs(SAVED_PDF_DIR, exist_ok=True) 28 | 29 | # 检查日志文件是否存在,不存在则创建并写入表头 30 | file_exists = os.path.isfile(LOG_FILE) 31 | 32 | with open(LOG_FILE, mode='a', newline='', encoding='utf-8') as file: 33 | fieldnames = ['时间戳', '原文件名', '保存文件名', '文件大小(MB)', '处理比例', '保护字符'] 34 | writer = csv.DictWriter(file, fieldnames=fieldnames) 35 | 36 | if not file_exists: 37 | writer.writeheader() 38 | 39 | writer.writerow({ 40 | '时间戳': timestamp, 41 | '原文件名': original_filename, 42 | '保存文件名': saved_filename, 43 | '文件大小(MB)': f"{file_size_mb:.2f}", 44 | '处理比例': scramble_ratio, 45 | '保护字符': protected_chars or "" 46 | }) 47 | 48 | print(f"INFO: 已记录PDF处理信息 - 原文件名:{original_filename},保存为:{saved_filename}") 49 | 50 | 51 | 52 | st.set_page_config( 53 | page_title="抗AI检测", 54 | page_icon="🥳", 55 | layout="centered" 56 | ) 57 | 58 | st.title("PDF抗AI检测工具") 59 | st.write("出于网络文本著作内容的保护目的而开发") 60 | 61 | st.markdown(""" 62 | 63 | > ### ⚠️免责声明 64 | > 65 | > 本技术仅供学习与学术交流之用,旨在探索网络文本著作内容的保护机制。 66 | 请用户在合法、合理的范围内使用本工具,严禁用于侵犯他人权益或规避内容审核等不当用途。 67 | 若因不当使用(即出于非正当目的的使用)而产生任何法律后果,责任概由使用者自行承担,开发者不对此承担任何责任。 68 | """) 69 | 70 | # 增加文件大小限制提示 71 | # st.info(f"文件大小限制:{MAX_FILE_SIZE_MB}MB。较大的PDF文件处理可能需要较长时间。") 72 | 73 | uploaded_file = st.file_uploader( 74 | label="上传 PDF 文件并设置处理比例", 75 | type=['pdf'], 76 | accept_multiple_files=False, 77 | help=f"请上传单个PDF文件,大小不超过{MAX_FILE_SIZE_MB}MB" 78 | ) 79 | 80 | # 添加自定义保护字符输入框 81 | st.markdown( 82 | ''' 83 | --- 84 | 保护相关字符以不参与混淆,详情点击下框右侧帮助符号 85 | ''' 86 | ) 87 | protected_chars = st.text_input( 88 | "自定义保护字符(这些字符将不会被处理)", 89 | value="图表XX大学本科毕业论文设计IV", 90 | help="输入您希望保护的字符,字符间无需分隔。例如:图表东京大学本科毕业论文设计IV。本程序强制保护除各语言字母之外的符号(例如:\"您OK\"不受保护,\"123!,?!123\"受保护,不参与混淆),如有特殊需求请自行修改源码。" 91 | ) 92 | 93 | 94 | def select_func(c: str) -> bool: 95 | """选择要保护的字符 96 | 当 select_as_blacklist=True 时: 97 | - 返回True表示字符将被列入黑名单(保护,不被处理) 98 | - 返回False表示字符可能被处理(取决于ratio) 99 | 100 | 注意:在scramble_pdf函数中,判断逻辑是: 101 | if selector(dstc) != select_as_blacklist: 102 | 字符可能被处理 103 | else: 104 | 字符被保护 105 | """ 106 | # 对于用户自定义的保护字符或非字母类字符,返回True保护它们 107 | if c in protected_chars or not unicodedata.category(c).startswith("L"): 108 | return True 109 | 110 | # 对于其他字符(主要是字母类),返回False允许处理 111 | return False 112 | 113 | 114 | if uploaded_file is not None: 115 | # 检查文件大小 116 | file_size = len(uploaded_file.getvalue()) / (1024 * 1024) # 转换为 MB 117 | if file_size > MAX_FILE_SIZE_MB: 118 | st.error(f"文件大小({file_size:.1f}MB)超过{MAX_FILE_SIZE_MB}MB限制,请上传更小的文件。") 119 | else: 120 | scramble_ratio = st.slider("处理比例", min_value=0.0, 121 | max_value=1.0, value=0.3, step=0.05) 122 | 123 | # 创建三列布局,使按钮居中且宽度为50% 124 | col1, col2, col3 = st.columns([1, 2, 1]) 125 | with col2: 126 | start_button = st.button("开始处理", type="secondary", use_container_width=True) 127 | 128 | # 修正缩进,确保只有在点击按钮时才处理PDF 129 | if start_button: 130 | with st.spinner("正在处理..."): 131 | # 创建临时文件来处理上传的PDF 132 | with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_input: 133 | tmp_input.write(uploaded_file.getvalue()) 134 | input_path = tmp_input.name 135 | 136 | # 创建临时文件用于输出 137 | with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_output: 138 | output_path = tmp_output.name 139 | 140 | try: 141 | # 生成时间戳文件名并保存原始PDF 142 | timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") 143 | saved_filename = f"{timestamp}.pdf" 144 | saved_path = os.path.join(SAVED_PDF_DIR, saved_filename) 145 | 146 | # 确保目录存在 147 | os.makedirs(SAVED_PDF_DIR, exist_ok=True) 148 | 149 | # 保存原始PDF 150 | with open(saved_path, "wb") as f: 151 | f.write(uploaded_file.getvalue()) 152 | 153 | # 记录日志 154 | log_pdf_processing( 155 | original_filename=uploaded_file.name, 156 | saved_filename=saved_filename, 157 | file_size_mb=file_size, 158 | scramble_ratio=scramble_ratio, 159 | protected_chars=protected_chars 160 | ) 161 | 162 | # 打开PDF并进行加扰 163 | pdf = Pdf.open(input_path) 164 | # 添加调试信息 165 | st.info(f"正在使用scramble_ratio={scramble_ratio}处理PDF...") 166 | 167 | # 添加随机延迟,模拟处理时间 168 | if enable_processing_delay: 169 | delay_seconds = random.uniform(2, 5) 170 | time.sleep(delay_seconds) 171 | 172 | try: 173 | scramble_pdf( 174 | pdf, 175 | scramble_ratio, 176 | selector=select_func, 177 | select_as_blacklist=True, 178 | ) 179 | pdf.save(output_path) 180 | except ValueError as e: 181 | if "not enough values to unpack" in str(e): 182 | st.warning("处理过程中没有找到符合条件的字符,尝试使用默认处理方式...") 183 | # 重新打开PDF 184 | pdf = Pdf.open(input_path) 185 | # 使用默认设置处理 186 | scramble_pdf(pdf, scramble_ratio) 187 | pdf.save(output_path) 188 | else: 189 | raise 190 | 191 | # 获取处理前后的文件大小以进行比较 192 | input_size = os.path.getsize(input_path) / 1024 # KB 193 | output_size = os.path.getsize(output_path) / 1024 # KB 194 | 195 | # 显示处理成功的信息 196 | st.success( 197 | f"PDF处理成功!处理前大小: {input_size:.2f}KB, 处理后大小: {output_size:.2f}KB") 198 | 199 | # 读取处理后的PDF并提供下载 200 | with open(output_path, 'rb') as file: 201 | output_pdf = file.read() 202 | # 创建三列布局使按钮居中 203 | col1, col2, col3 = st.columns([1, 2, 1]) 204 | with col2: 205 | st.download_button( 206 | label="下载处理后的PDF", 207 | data=output_pdf, 208 | file_name="processed.pdf", 209 | mime="application/pdf", 210 | use_container_width=True, 211 | type="primary" 212 | ) 213 | except Exception as e: 214 | st.error(f"处理过程中出现错误:{str(e)}") 215 | finally: 216 | # 清理临时文件 217 | os.unlink(input_path) 218 | os.unlink(output_path) 219 | else: 220 | scramble_ratio = st.slider("处理比例", min_value=0.0, 221 | max_value=1.0, value=0.3, step=0.05) 222 | 223 | # 显示参考图 224 | st.image("gui/web/images/recommended_reference_line_plot.svg", 225 | caption="本图表示了在测试数据上不同的处理比例对AIGC检测的影响,实验数据源于完全由AIGC编写的PDF文档,处理前的paperYY-AI检测率为92%") 226 | 227 | # 添加测试文件下载按钮 228 | col1, col2, col3 = st.columns(3) 229 | with col1: 230 | with open("tests/testPDF/AIGC.pdf", "rb") as file1: 231 | test_file1 = file1.read() 232 | st.container().download_button( 233 | label="下载测试文件:PDF[处理前]", 234 | data=test_file1, 235 | file_name="AIGC.pdf", 236 | mime="application/pdf", 237 | use_container_width=True 238 | ) 239 | st.caption("完全由AI生成主要内容的PDF文件") 240 | 241 | with col2: 242 | with open("tests/testPDF/AIGC.typ", "rb") as file2: 243 | test_file2 = file2.read() 244 | st.container().download_button( 245 | label="下载测试文件:typst源码", 246 | data=test_file2, 247 | file_name="AIGC.typ", 248 | mime="text/plain", 249 | use_container_width=True 250 | ) 251 | st.caption( 252 | "测试文件的Typst源文件,PDF使用[unofficial-sdu-thesis](https://github.com/GrooveWJH/unofficial-sdu-thesis)生成") 253 | 254 | with col3: 255 | with open("tests/testPDF/AIGC-100.pdf", "rb") as file1: 256 | test_file1 = file1.read() 257 | st.container().download_button( 258 | label="下载测试文件:PDF[55%扰乱处理后]", 259 | data=test_file1, 260 | file_name="AIGC-100.pdf", 261 | mime="application/pdf", 262 | use_container_width=True 263 | ) 264 | st.caption("已经处理过的PDF文件示例") 265 | 266 | 267 | st.markdown("---") 268 | st.markdown(""" 269 | ### 说明 270 | 1. 处理完毕后,用户应当自行使用各类检测服务完成各项指标检测。 271 | 2. 本程序确保布局与关键字格式上的前后一致,但对于内容不做保证。 272 | ### 来源 273 | 源码 274 | https://github.com/VermiIIi0n/scramble-pdf 275 | --> 276 | """) 277 | -------------------------------------------------------------------------------- /tests/testPDF/AIGC.typ: -------------------------------------------------------------------------------- 1 | #import "@preview/unofficial-sdu-thesis:0.2.2": * 2 | 3 | #let ( 4 | info, 5 | doc, 6 | cover, 7 | declare, 8 | appendix, 9 | outline, 10 | mainmatter, 11 | conclusion, 12 | abstract, 13 | bib, 14 | acknowledgement, 15 | under-cover, 16 | ) = documentclass( 17 | info: ( 18 | title: [ 19 | 系统工程与计算机科学的实践与结合 \ \ 20 | ], 21 | name: "AIGC", 22 | id: "AIGC.id", 23 | school: "AIGC.school", 24 | major: "AIGC.major", 25 | grade: "AIGC.grade", 26 | mentor: "AIGC.mentor", 27 | time: "CYPHER年CYPHER月CYPHER日", 28 | ), 29 | ) 30 | 31 | #show: doc 32 | #cover() 33 | #abstract( 34 | body: [ 35 | 本文为AIGC百分百生成论文。 36 | 37 | 除基本格式中的必要符号外,其余内容均由LLM(claude-3.5-sonnot, claude-3.7-sonnot,gemini-2.5-flash,gemini-2.5-pro)生成,包括:摘要、大纲、正文、引用文献、致谢。 38 | 39 | 随着现代系统复杂性的日益增加,系统工程(Systems Engineering, SE)与计算机科学(Computer Science, CS)的深度融合已成为提升系统开发效率和质量的关键途径。本文旨在探讨SE与CS在理论与实践层面的结合点,研究两者融合的关键方法与技术。 40 | 41 | 首先,本文梳理了SE和CS的核心理论体系,包括系统生命周期模型、需求工程、基于模型的系统工程(MBSE)、软件工程原理、DevOps实践以及数据科学等。其次,重点研究了SE与CS的融合方法,例如MBSE与敏捷开发的集成、DevOps在复杂系统工程中的应用、以及结合数据科学进行系统分析与决策等。随后,通过分析大型分布式软件系统和智能网联汽车系统两个典型案例,验证了SE与CS融合方法在实践中的应用效果与价值。最后,本文总结了SE与CS结合的优势,探讨了面临的技术集成和组织文化等挑战,并展望了智能化系统工程、数字孪生等未来发展方向。 42 | 43 | 研究表明,系统工程与计算机科学的有效结合能够显著提升复杂系统的设计、开发、验证和运维效率,为应对未来系统工程挑战提供了重要思路和方法。 44 | ], 45 | keywords: ("系统工程", "计算机科学", "模型驱动系统工程", "DevOps", "复杂系统", "跨学科融合"), 46 | body-en: [ 47 | With the increasing complexity of modern systems, the deep integration of Systems Engineering (SE) and Computer Science (CS) has become a crucial pathway to enhance system development efficiency and quality. This dissertation aims to explore the convergence points of SE and CS at both theoretical and practical levels, investigating key methods and technologies for their integration. 48 | 49 | Firstly, this paper reviews the core theoretical frameworks of SE and CS, including system lifecycle models, requirements engineering, Model-Based Systems Engineering (MBSE), software engineering principles, DevOps practices, and data science. Secondly, it focuses on researching the fusion methods of SE and CS, such as the integration of MBSE with agile development, the application of DevOps in complex systems engineering, and system analysis and decision-making combined with data science. Subsequently, through the analysis of two typical case studies—a large-scale distributed software system and an intelligent connected vehicle system—the practical application effects and value of SE and CS integration methods are validated. Finally, this paper summarizes the advantages of combining SE and CS, discusses challenges such as technical integration and organizational culture, and looks forward to future development directions like intelligent systems engineering and digital twins. 50 | 51 | The research indicates that the effective integration of Systems Engineering and Computer Science can significantly improve the efficiency of designing, developing, verifying, and operating complex systems, providing important insights and methodologies for addressing future systems engineering challenges. 52 | ], 53 | keywords-en: ( 54 | "Systems Engineering", 55 | "Computer Science", 56 | "Model-Based Systems Engineering", 57 | "DevOps", 58 | "Complex Systems", 59 | "Interdisciplinary Integration", 60 | ), 61 | ) 62 | #outline() 63 | 64 | // ================= Outline Start ================= 65 | 66 | #show: mainmatter 67 | 68 | = 引言 69 | // 引入系统工程(SE)与计算机科学(CS)交叉融合的时代背景,强调现代复杂系统(如航空航天、智能制造、智慧城市等)对跨学科知识整合的迫切需求 70 | // 阐明将系统工程的整体观、生命周期管理思想与计算机科学的计算能力、软件技术、数据智能相结合的理论意义和巨大的实践价值 71 | // 概述本研究旨在弥合两个领域间的鸿沟,探索有效的融合策略与方法,以应对日益增长的系统复杂性挑战 72 | // 简要介绍论文后续章节的组织结构和主要研究内容 73 | 74 | 随着科技的快速发展,现代系统的复杂性呈指数级增长。从航空航天系统到智能制造平台,从智慧城市到物联网应用,这些系统不仅规模庞大,而且涉及多个技术领域的深度融合。在这样的背景下,传统的单一学科方法已经难以应对日益增长的系统复杂性挑战。系统工程(Systems Engineering,SE)与计算机科学(Computer Science,CS)的交叉融合,已成为一个迫切需要研究的重要课题。 75 | 76 | 系统工程为复杂系统的开发提供了全局性的视角和系统化的方法论,强调从整体出发,协调各个子系统之间的关系,确保系统目标的实现。而计算机科学则提供了强大的技术支撑,包括高性能计算、大数据分析、人工智能等先进技术,这些技术能够显著提升系统的智能化水平和自动化程度。将这两个领域的优势相结合,不仅能够提高系统开发的效率和质量,还能催生新的技术创新和应用模式。 77 | 78 | 本研究致力于探索系统工程与计算机科学的有效融合方法,旨在构建一个统一的理论框架,指导实际工程实践。通过深入分析两个领域的核心理论和关键技术,研究它们的结合点和互补性,提出切实可行的融合策略和方法论。这对于提升复杂系统的开发效率、保证系统质量、降低开发风险具有重要的理论和实践意义。 79 | 80 | == 研究背景与意义 81 | // 分析现代系统的特征演变,包括规模扩大、结构复杂、功能多样、动态变化等特点 82 | // 探讨传统单一学科方法在应对这些特征时遇到的挑战和局限性 83 | // 阐述SE与CS结合的必然性,强调两个领域优势互补的重要性 84 | // 分析这种融合对提升国家创新能力和产业竞争力的战略意义 85 | 86 | 现代系统呈现出前所未有的复杂性。这种复杂性不仅体现在系统规模的不断扩大,更体现在系统结构的日益复杂化、功能的多样化,以及系统运行环境的动态多变性。特别是在数字化转型的大背景下,传统的物理系统正在与信息系统深度融合,形成网络化、智能化的复杂系统。这些系统往往需要处理海量数据,实现实时响应,并具备自适应能力。 87 | 88 | 传统的单一学科方法在面对这些挑战时显得力不从心。纯粹的系统工程方法虽然能够提供系统性的思维和方法论,但在实现具体功能和处理复杂计算时存在局限。而单纯的计算机科学方法虽然能够提供强大的技术支持,但往往缺乏整体视角,难以确保系统级目标的实现。这种局限性日益成为制约系统发展的瓶颈。 89 | 90 | 系统工程与计算机科学的融合已成为必然趋势。系统工程提供的整体观、生命周期管理思想可以指导复杂系统的规划和设计,而计算机科学的先进技术则可以为系统实现提供强大支撑。这种融合不仅能够提升系统开发的效率和质量,还能促进技术创新,推动产业升级。从国家战略层面来看,这种融合对于提升核心竞争力、推动数字化转型具有重要意义。 91 | 92 | == 国内外研究现状 93 | // 全面回顾系统工程学科的发展历程,总结其在不同时期的理论突破和实践成果 94 | // 系统梳理计算机科学的技术进步,特别是在云计算、大数据、人工智能等领域的最新发展 95 | // 详细分析国内外在SE与CS融合方面的研究进展,包括理论研究和实践应用 96 | // 深入探讨现有研究中存在的问题和不足,为本文研究提供切入点 97 | 98 | 系统工程学科自二战以来经历了显著发展。从早期的军事工程应用,到后来在航空航天、制造业等领域的广泛应用,系统工程的理论体系不断完善,方法论不断创新。特别是近年来,随着模型驱动系统工程(MBSE)的兴起,系统工程的实践方式发生了革命性的变化。这些进展为处理复杂系统问题提供了重要的理论指导和方法支持。 99 | 100 | 计算机科学在过去几十年中取得了革命性的进步。云计算技术实现了计算资源的弹性供给,大数据技术使得海量数据的处理和分析成为可能,人工智能技术则带来了智能化决策的新范式。这些技术进步不仅改变了传统产业的面貌,还催生了新的商业模式和应用场景。 101 | 102 | 在SE与CS融合方面,国内外学者已开展了大量研究。一些研究聚焦于如何将MBSE与软件工程方法结合,另一些则探索如何将人工智能技术应用于系统工程实践。然而,现有研究仍存在一些不足:理论体系尚不完善,工具链集成度不高,跨学科实践案例有限,缺乏标准化的方法论等。这些问题亟待解决。 103 | 104 | == 本文研究目标与内容 105 | // 明确定义研究目标,包括理论层面和实践层面的具体目标 106 | // 详细说明研究内容的范围和深度,包括理论研究、技术探索和实践验证等方面 107 | // 阐述采用的研究方法和技术路线,确保研究的科学性和可行性 108 | // 预期研究成果的具体形式和应用价值 109 | 110 | 本研究的主要目标是构建一个系统的理论框架,指导SE与CS的有效融合。在理论层面,旨在厘清两个领域的核心概念和方法,找出它们的结合点和互补性;在实践层面,致力于提出可操作的融合方法和工具,并通过实际案例验证其有效性。 111 | 112 | 研究内容涵盖三个主要方面:首先,深入分析SE与CS的核心理论,包括系统生命周期管理、需求工程、软件工程等;其次,重点研究关键融合技术,如MBSE与敏捷开发的结合、DevOps在系统工程中的应用等;最后,通过典型案例分析验证所提方法的实际效果。 113 | 114 | 本研究采用多种研究方法,包括文献研究、理论分析、建模仿真、案例研究等。通过系统的文献综述掌握研究现状,通过理论分析提出创新性观点,通过建模仿真验证方法可行性,通过案例研究检验实际效果。 115 | 116 | == 论文结构安排 117 | // 详细说明每一章节的主要内容和逻辑关系 118 | // 阐述各章节之间的衔接和递进关系 119 | // 解释每个章节对实现研究目标的具体贡献 120 | // 说明论文结构安排的合理性和完整性 121 | 122 | 本论文共分为六章,各章内容紧密相连,逻辑递进。第一章引言阐述研究背景和意义,明确研究目标和内容。第二章系统梳理SE和CS的核心理论,为后续研究奠定基础。第三章重点探讨SE与CS的融合方法,是论文的核心创新部分。第四章通过两个典型案例验证所提方法的实际效果。第五章分析研究成果,探讨未来发展方向。第六章总结全文,提出主要结论。 123 | 124 | 这种结构安排符合学术论文的规范要求,能够清晰地展示研究工作的完整过程。从理论到方法,从方法到实践,从实践到总结,形成了一个完整的研究闭环。每一章都针对特定的研究目标,共同构成了一个系统的研究框架。 125 | 126 | 论文的这种结构安排确保了研究工作的系统性和完整性。通过理论研究、方法探索、实践验证和总结展望四个层面,全面展示了研究成果,为后续研究提供了有益的参考。 127 | = 系统工程与计算机科学核心理论 128 | // 本章旨在为后续深入探讨系统工程与计算机科学的有效融合奠定坚实的理论基础。 129 | // 系统工程与计算机科学作为现代复杂系统开发的两大支柱学科,各自拥有独特的理论体系、方法论和实践经验。 130 | // 理解它们的核心概念、发展历程以及在解决工程问题中的作用,是构建融合框架的前提。 131 | // 本章将分别对这两个学科的核心理论进行系统性梳理和阐述,为后续章节的融合研究提供必要的知识背景。 132 | 133 | 在深入探讨系统工程与计算机科学如何有效融合之前,理解这两个学科各自的核心理论与方法至关重要。系统工程提供了一种整体的、跨学科的视角,关注系统从概念提出到最终退役的全生命周期管理,强调需求、架构、集成与验证等关键环节。它旨在确保构建的系统能够满足所有利益相关者的需求,并在预期的环境和约束下可靠运行。 134 | 135 | 与此同时,计算机科学作为研究计算、信息和自动化的学科,为现代系统的实现提供了强大的技术支撑。它涵盖了从基础的算法设计、数据结构,到复杂的软件工程、人工智能、网络通信等广泛领域。计算机科学的进步极大地提升了系统处理信息、执行复杂逻辑和实现智能化功能的能力。 136 | 137 | 本章将首先系统地介绍系统工程的基本原理、生命周期思想、需求工程、建模方法以及验证与确认等核心实践。随后,将概述计算机科学在软件、数据、算法、智能等方面的关键技术,特别是与系统实现紧密相关的软件工程原理、敏捷开发方法和DevOps实践。通过对这两个学科核心理论的深入剖析,旨在为后续章节提出的融合方法和框架提供坚实的理论基础。 138 | 139 | == 系统工程理论与方法 140 | // 本节将系统地介绍系统工程学科的基本原理、核心概念和常用方法论。 141 | // 重点阐述系统工程在应对现代复杂系统挑战中的独特作用和价值。 142 | // 将详细讲解系统生命周期管理思想,以及需求工程、系统建模、验证与确认等关键实践活动。 143 | // 理解这些系统工程的核心要素,对于后续探讨其与计算机科学的结合至关重要。 144 | 145 | 系统工程是一门跨学科的工程和管理学科,其核心目标是设计、实现、部署和维护复杂系统,确保系统在整个生命周期内满足用户和利益相关者的需求。它强调从整体视角出发,综合考虑系统的各个组成部分、它们之间的相互作用以及系统与外部环境的关系。系统工程提供了一套结构化的方法论,用于管理系统开发的复杂性、降低风险并优化系统性能。 146 | 147 | 系统工程的关键实践贯穿于系统的整个生命周期。这包括但不限于:对系统需求进行全面的获取、分析、规约和管理,确保系统构建的正确方向;运用系统建模语言和工具对系统架构、行为和接口进行清晰、精确的描述,促进跨学科团队的沟通与协作;以及在系统开发的各个阶段进行严格的验证(Verification)和确认(Validation)活动,以确保系统符合规格并真正满足用户需求。 148 | 149 | 通过系统工程的方法,工程师和项目管理者能够更好地理解和定义问题空间,权衡不同的设计方案,协调不同专业领域的贡献,并有效地管理项目进度和资源。它为复杂系统的成功交付提供了一个坚实的基础框架,是应对当前技术挑战和市场需求的不可或缺的学科。 150 | 151 | === 系统生命周期模型 152 | // 本小节将详细介绍几种在系统工程实践中广泛应用的经典系统生命周期模型。 153 | // 分析不同模型的特点、优势、局限性以及它们适用的项目类型和场景。 154 | // 重点阐述瀑布模型、V模型、螺旋模型以及增量与迭代模型等代表性模型。 155 | // 理解这些模型有助于认识系统开发过程的不同组织方式及其对项目管理和风险控制的影响。 156 | 157 | 系统生命周期模型是对系统从概念产生到最终退役整个过程的抽象和规范化描述。它将复杂的系统开发过程划分为一系列有序或迭代的阶段,并规定了每个阶段的主要活动、产出物以及阶段之间的转换关系。选择合适的生命周期模型对于项目的成功至关重要,因为它直接影响到项目的规划、执行、监控和风险管理方式。 158 | 159 | 经典的系统生命周期模型包括瀑布模型、V模型和螺旋模型。瀑布模型是一种线性的、顺序的模型,强调阶段的严格划分和文档驱动,适用于需求明确且稳定的项目,但其缺点是缺乏灵活性和早期反馈。V模型则在瀑布模型的基础上,突出了开发阶段与测试验证阶段的对应关系,强调了在开发早期进行验证和确认活动的重要性,有助于提高系统质量。螺旋模型则引入了风险分析和迭代的思想,通过多次迭代逐步完善系统,适用于大型、复杂、高风险的项目。 160 | 161 | 随着对快速变化需求和持续交付的追求,增量与迭代模型变得越来越流行,并成为敏捷开发方法的基础。这类模型将系统分解为多个增量或通过多次迭代逐步构建和完善系统,每次迭代都产生一个可工作的系统版本。这种方式强调快速反馈、适应变化和持续改进,更适用于需求不确定或需要快速响应市场变化的项目。理解这些不同的生命周期模型,有助于根据项目特点选择最适合的开发流程。 162 | 163 | === 需求工程 164 | // 本小节将深入探讨需求工程在系统工程中的核心地位和关键作用。 165 | // 详细阐述需求工程的各个主要活动,包括需求的获取、分析、规约、验证和管理。 166 | // 强调确保系统满足用户和利益相关者真实需求的重要性,以及需求质量对系统成功的决定性影响。 167 | // 介绍常用的需求工程技术和方法,旨在将模糊的用户意愿转化为清晰、可执行的系统规格。 168 | 169 | 需求工程是系统工程中最关键、最具挑战性的活动之一,其目标是准确地理解、定义和管理系统应具备的功能和非功能特性,以确保最终构建的系统能够满足用户和所有利益相关者的真实需求。需求是系统开发的起点和基础,需求的不准确、不完整或不稳定是导致项目失败的主要原因之一。因此,高效的需求工程是系统成功的基石。 170 | 171 | 需求工程通常包括以下主要活动:需求获取(Elicitation),即通过访谈、问卷、观察、原型法等技术从用户和利益相关者那里收集原始需求信息;需求分析与规约(Analysis and Specification),即将收集到的原始需求进行整理、分析、澄清和组织,消除歧义和冲突,并以清晰、完整、一致、可验证的方式形成正式的需求规格说明文档;需求验证(Validation),即确保规约的需求是正确的、完整的,并且真正反映了用户的意愿;以及需求管理(Management),即在系统开发过程中对需求进行跟踪、变更控制和版本管理,确保需求的稳定性和可追溯性。 172 | 173 | 有效的需求工程不仅需要掌握各种技术和工具,更需要良好的沟通和协作能力。需求工程师需要与用户、开发团队、测试团队以及其他利益相关者紧密合作,建立共同的理解。通过严格的需求工程实践,可以显著降低项目风险,减少返工,提高开发效率,并最终交付高质量、满足用户期望的系统。 174 | === 系统建模方法 175 | // 本小节将论述系统建模在理解复杂系统、促进跨学科团队沟通、支持系统分析与设计中的核心作用。 176 | // 重点介绍系统建模语言(SysML)的基本概念、语法和应用场景,它作为UML的扩展,专为系统工程应用而设计。 177 | // 详细讲解SysML的主要图类型及其用途,包括需求图、用例图、块定义图、内部块图、参数图、状态机图、活动图等。 178 | // 探讨统一建模语言(UML)在软件密集型系统建模中的应用价值及其与SysML的关系与区别,以及两者在实际项目中的协同使用。 179 | 180 | 系统建模是系统工程中不可或缺的核心活动,它通过创建系统的抽象表示,帮助工程师和利益相关者理解、分析和设计复杂系统。在现代系统日益复杂的背景下,有效的建模方法能够显著降低认知负担,提供清晰的系统视图,并支持系统的各个方面(结构、行为、需求、参数等)的形式化描述。系统模型作为一种通用语言,促进了不同学科背景的专家之间的沟通与协作,减少了误解和信息丢失。 181 | 182 | 系统建模的价值不仅体现在沟通层面,更重要的是它支持系统的分析、验证和优化。通过建立系统模型,工程师可以在实际构建系统之前,对系统的性能、可靠性、安全性等关键属性进行评估和预测。这种"虚拟原型"方法大大降低了后期发现问题的风险和成本。此外,系统模型还可以作为系统文档的核心,提供比传统文本文档更精确、更一致的系统描述,并且能够随着系统的演化而持续更新。 183 | 184 | 在众多系统建模方法中,基于模型的系统工程(MBSE)已成为主流方法论,而系统建模语言(SysML)和统一建模语言(UML)则是最广泛使用的建模语言。这些语言提供了标准化的符号和语法,使工程师能够创建结构化、规范化的系统模型。下面将详细介绍这些关键的建模语言及其在系统工程中的应用。 185 | 186 | ==== SysML建模 187 | // 本小节将深入讲解SysML作为一种国际标准化的系统建模语言,如何全面支持系统工程的各个核心活动。 188 | // 详细分析SysML的结构图(如块定义图、内部块图)在描述系统的静态结构、组成部分和接口定义方面的应用方法和最佳实践。 189 | // 系统地介绍SysML的行为图(如用例图、活动图、状态机图、序列图)如何有效地表达系统的功能、流程、状态转换和动态交互行为。 190 | // 重点探讨SysML特有的需求图和参数图在需求规约、需求跟踪以及工程分析(如性能、可靠性、安全性分析)中的独特价值和具体应用技术。 191 | 192 | 系统建模语言(Systems Modeling Language,SysML)是一种基于UML的图形化建模语言,专门为系统工程领域设计,旨在支持复杂系统的规约、分析、设计、验证和确认。SysML于2007年由OMG(Object Management Group)正式发布,目前已成为系统工程领域的国际标准建模语言。与主要面向软件的UML相比,SysML更适合描述包含硬件、软件、信息、流程、人员和设施在内的复杂系统。 193 | 194 | SysML提供了九种图类型,可分为三大类:结构图、行为图和需求/参数图。结构图包括块定义图(Block Definition Diagram,BDD)和内部块图(Internal Block Diagram,IBD),用于描述系统的静态结构。块定义图定义了系统的组成部分(块)及其关系,如组合、继承、关联等;内部块图则详细描述了块的内部结构,包括部件、连接器和端口,展示了系统内部的连接和流动关系。这些图有助于工程师清晰地定义系统的物理和逻辑架构,识别系统边界和接口。 195 | 196 | SysML的行为图包括用例图、活动图、序列图和状态机图,用于描述系统的动态行为和功能。用例图展示了系统与外部参与者(如用户、外部系统)之间的交互,帮助识别系统功能需求;活动图描述了系统的工作流程和控制流,支持功能分析和流程优化;序列图展示了系统组件之间的消息交换序列,有助于理解交互逻辑;状态机图则描述了系统或组件的状态转换和响应事件的行为,对于理解系统的动态特性至关重要。 197 | 198 | SysML的一个重要创新是引入了需求图和参数图,这是UML中没有的。需求图用于可视化地表示需求及其关系(如包含、派生、验证等),支持需求的组织、分析和跟踪;参数图则支持工程分析和约束求解,允许工程师定义系统参数之间的数学关系,进行性能、可靠性、成本等方面的分析和优化。这些特有图类型使SysML成为一种全面的系统工程语言,能够支持从需求到设计再到分析的完整系统工程过程。 199 | 200 | ==== UML在系统工程中的应用 201 | // 本小节将全面探讨统一建模语言(UML)虽然主要面向软件开发,但在系统工程领域,特别是软件密集型系统的建模中,仍然发挥着不可替代的重要作用。 202 | // 深入分析UML的核心图类型(如用例图、类图、顺序图、状态图、组件图、部署图等)如何在系统层面帮助理解功能交互、软件架构设计和组件部署关系。 203 | // 系统比较UML与SysML的联系与区别,阐述两种语言各自的优势领域,并提供在实际工程项目中如何结合使用两者进行系统和软件的协同建模的具体策略和方法。 204 | // 客观指出UML在描述纯硬件系统、物理约束或非功能性系统特性方面的局限性,以及如何通过与其他建模技术的结合来弥补这些不足。 205 | 206 | 统一建模语言(Unified Modeling Language,UML)作为软件工程领域的标准建模语言,在系统工程中,特别是软件密集型系统的开发中,仍然扮演着重要角色。UML由Grady Booch、James Rumbaugh和Ivar Jacobson(被称为"三剑客")在1990年代创建,现已发展成为OMG维护的国际标准。虽然UML主要关注软件系统的建模,但随着现代系统中软件比重的不断增加,UML的应用范围也相应扩大到系统工程领域。 207 | 208 | UML提供了丰富的图类型来描述系统的不同视图。在系统工程中,用例图常用于捕获系统功能需求和用户交互;类图和对象图用于描述系统的静态结构和数据模型;顺序图和通信图展示系统组件之间的动态交互;状态图描述系统状态转换;活动图表示业务流程和算法;组件图和部署图则用于描述系统的物理架构和部署拓扑。这些图类型共同提供了系统的多维视图,支持从需求分析到架构设计再到实现的全过程。 209 | 210 | UML与SysML有着密切的关系,SysML实际上是UML的一个子集和扩展。UML专注于软件系统建模,而SysML则扩展了UML以支持更广泛的系统工程应用。两者共享许多相同的图类型和概念,但SysML增加了需求图和参数图,并修改了某些UML元素以更好地适应系统工程需求。在实际项目中,工程师通常会结合使用两种语言:SysML用于系统级建模,定义整体架构和需求;UML则用于详细的软件设计。这种协同使用方式能够实现从系统需求到软件实现的无缝过渡。 211 | 212 | 尽管UML在系统工程中有广泛应用,但它也存在一些局限性。UML主要面向软件系统,在描述硬件组件、物理约束、连续行为或非功能性需求(如性能、可靠性)方面相对较弱。此外,UML缺乏直接支持需求管理和工程分析的机制。为弥补这些不足,工程师通常会将UML与其他专业工具和方法结合使用,如CAD工具用于硬件设计,仿真工具用于性能分析,需求管理工具用于需求跟踪等。通过这种集成方式,UML可以作为系统工程工具箱中的重要组成部分,与其他工具协同工作,支持复杂系统的开发。 213 | 214 | === 系统验证与确认(V&V) 215 | // 本小节将明确区分验证(Verification)与确认(Validation)这两个关键概念:验证是确保"正确地构建系统"(符合规格和标准),而确认是确保"构建了正确的系统"(满足用户真实需求和期望)。 216 | // 系统地强调V&V活动必须贯穿系统整个生命周期的重要性,从需求阶段到设计、实现、集成和部署,是保证系统质量、降低开发风险和减少后期修改成本的关键环节。 217 | // 全面介绍系统工程中常用的V&V技术和方法,包括各类评审(需求评审、设计评审、代码评审)、静态分析(接口分析、性能分析、安全性分析)、动态测试(单元测试、集成测试、系统测试、验收测试)以及建模与仿真等。 218 | // 深入讨论如何在系统工程流程中科学规划和有效实施V&V策略,包括V&V计划的制定、资源分配、进度安排、工具选择、结果评估和问题跟踪等关键环节。 219 | 220 | 系统验证与确认(Verification and Validation,V&V)是系统工程中至关重要的质量保证活动,旨在确保开发的系统既符合规格说明(验证),又满足用户的实际需求(确认)。这两个概念虽然相关但有明显区别:验证(Verification)回答的是"我们是否正确地构建了系统?",关注系统是否符合规格说明、标准和合同要求;确认(Validation)则回答"我们是否构建了正确的系统?",关注系统是否真正满足用户需求和期望,能否在实际环境中有效运行。 221 | 222 | V&V活动贯穿系统生命周期的各个阶段,而不仅仅是在开发后期进行。在需求阶段,V&V活动包括需求评审和分析,确保需求的完整性、一致性和可验证性;在设计阶段,包括设计评审、模型检查和原型验证,确保设计满足需求并具有可行性;在实现阶段,包括代码审查、单元测试和静态分析,确保实现符合设计规范;在集成和系统测试阶段,验证系统组件的正确集成和整体功能;最后在部署阶段,通过验收测试和现场试运行确认系统在实际环境中的表现。这种全生命周期的V&V方法能够尽早发现并解决问题,降低项目风险和成本。 223 | 224 | 系统工程中常用的V&V技术多种多样,可分为静态方法和动态方法。静态方法不需要执行系统,包括各类评审(如同行评审、技术评审、走查)、静态分析(如代码分析、接口分析)和形式化方法(如模型检查、定理证明)。这些方法有助于早期发现设计缺陷和潜在问题。动态方法则需要执行系统或其部分,包括各级测试(单元测试、集成测试、系统测试、验收测试)、原型验证和仿真。特别是在复杂系统中,建模与仿真技术变得越来越重要,它允许在实际构建系统之前对系统行为进行预测和分析,降低开发风险。 225 | 226 | 有效的V&V策略需要系统化的规划和实施。这包括制定详细的V&V计划,明确验证与确认的目标、范围、方法、标准、进度和资源;建立适当的组织结构,确保V&V活动的独立性和客观性;选择合适的工具和技术,提高V&V活动的效率和有效性;建立完善的问题报告和跟踪机制,确保发现的问题得到及时解决;以及定期评估V&V活动的有效性,持续改进V&V过程。通过这些措施,可以确保V&V活动不仅能够发现系统中的缺陷和不足,还能为系统质量提供客观的度量和评估,支持项目决策和风险管理。 227 | == 计算机科学核心技术 228 | // 本节将全面概述计算机科学作为研究计算、信息和自动化的学科,如何为现代复杂系统提供核心技术支撑和理论基础。 229 | // 系统介绍算法设计与分析的基础原理和方法论,作为解决各类计算问题的核心,包括算法复杂度、设计范式和优化策略。 230 | // 重点阐述软件工程的原理与实践,包括软件开发生命周期、设计模式、质量保证和项目管理方法,是构建可靠、高效、可维护软件系统的关键。 231 | // 详细简述数据库技术、网络通信协议和架构在信息存储、管理、传输和交互中的基本原理和关键作用。 232 | // 深入探讨人工智能与机器学习作为计算机科学前沿技术,在数据分析、模式识别、智能决策、自动化控制等方面的基本理论和应用潜力。 233 | 234 | 计算机科学作为研究计算、信息处理和自动化的学科,为现代系统工程提供了强大的理论基础和技术支撑。随着系统复杂性的不断提高,计算机科学的核心技术已成为解决复杂问题、提升系统效能和实现智能化的关键驱动力。计算机科学涵盖了从理论计算模型到实用软件工具的广泛领域,为系统工程的各个环节提供了方法论和技术手段。 235 | 236 | 算法作为计算机科学的核心,为解决各类计算问题提供了系统化的方法。算法设计与分析关注如何设计高效的问题求解步骤,以及评估这些步骤的时间和空间复杂度。常见的算法设计范式包括分治法、动态规划、贪心算法和回溯法等,这些方法为系统工程中的优化问题、资源分配、路径规划等提供了解决方案。在系统工程中,算法不仅用于软件组件的实现,还广泛应用于系统建模、仿真分析和决策支持等环节。 237 | 238 | 软件工程作为计算机科学的重要分支,提供了构建大型、复杂软件系统的方法论和实践指南。它涵盖了需求分析、系统设计、编码实现、测试验证和维护演进等软件生命周期的各个阶段。现代软件工程强调迭代开发、持续集成、自动化测试和敏捷方法,这些实践大大提高了软件开发的效率和质量。在系统工程中,软件已成为连接各个物理组件、实现系统功能和智能的关键要素,软件工程的原则和实践对整个系统的成功至关重要。 239 | 240 | 数据管理与网络通信是现代系统的基础设施。数据库技术提供了结构化存储、高效查询和事务处理能力,支持系统中的数据持久化和信息管理需求。从传统的关系型数据库到新兴的NoSQL和NewSQL数据库,不同的数据管理技术适应了各种数据模型和应用场景。网络通信则提供了系统组件之间的互联互通能力,从低层的物理传输协议到高层的应用协议,构成了分布式系统的通信基础。在物联网和网络物理系统中,网络通信更是实现感知、控制和协同的关键技术。 241 | 242 | 人工智能与机器学习作为计算机科学的前沿领域,正在为系统工程带来革命性的变化。通过从数据中学习模式和规律,机器学习算法能够执行分类、预测、优化等任务,为系统提供智能决策支持。深度学习、强化学习等技术进一步拓展了AI的能力边界,使系统能够处理更复杂的感知和认知任务。在系统工程中,AI技术正被应用于需求分析、设计优化、故障预测、自主控制等多个环节,推动系统向更高水平的智能化和自动化发展。 243 | 244 | === 软件工程原理 245 | // 本小节将系统介绍软件工程的基本原则和核心概念,如模块化、抽象、信息隐藏、关注点分离等,这些原则如何指导软件系统的设计与实现,以及它们对系统质量的影响。 246 | // 深入讨论现代软件开发范式的演进和特点,从瀑布模型到迭代增量开发,特别聚焦于敏捷开发方法(如Scrum, Kanban, XP)及其核心价值观、实践和在不同项目环境中的适用性。 247 | // 全面阐述DevOps文化与实践的本质,它如何通过自动化、持续集成/交付、监控和反馈循环,打破开发与运维之间的壁垒,实现快速、可靠的软件交付和持续改进。 248 | // 重点强调软件架构设计在软件工程中的核心地位,探讨不同架构风格(如分层、微服务、事件驱动)的特点、优缺点及适用场景,以及架构决策如何影响系统的整体结构、质量属性和长期可维护性。 249 | 250 | 软件工程是一门应用计算机科学理论和技术,以系统化、规范化、可量化的方法来开发、运行和维护软件的工程学科。它的核心目标是在有限的时间和资源约束下,开发出高质量、可靠、易于维护和满足用户需求的软件系统。软件工程的基本原则包括模块化、抽象、信息隐藏和关注点分离等,这些原则共同指导着软件系统的设计与实现。 251 | 252 | 模块化原则强调将复杂系统分解为相对独立的模块,每个模块负责特定的功能,通过明确定义的接口与其他模块交互。这种分解降低了系统复杂性,提高了代码的可理解性和可维护性,同时也支持团队的并行开发。抽象原则则关注于识别和表达问题的本质特征,忽略非本质细节,帮助开发者在适当的抽象层次上思考问题。信息隐藏原则要求模块内部的实现细节对外部不可见,只通过接口暴露必要的功能,这减少了模块间的依赖,提高了系统的灵活性和可修改性。关注点分离原则则建议将不同的系统关注点(如业务逻辑、用户界面、数据访问)分离处理,避免不同关注点的代码混杂在一起,提高代码的清晰度和可维护性。 253 | 254 | 软件开发过程模型描述了软件开发的组织方式和活动顺序。传统的瀑布模型将开发过程划分为线性的、顺序的阶段(需求、设计、实现、测试、部署、维护),每个阶段完成后才进入下一阶段。这种模型在需求稳定、技术成熟的项目中可能有效,但在需求变化频繁或技术不确定性高的环境中往往表现不佳。为应对这些挑战,迭代增量开发模型应运而生,它将开发过程分为多个短周期,每个周期都包含需求分析、设计、编码和测试等活动,并交付一个可工作的系统增量。这种方法允许更早获得反馈,更灵活地应对变化。敏捷开发方法如Scrum和Kanban进一步发展了迭代增量思想,强调个体与互动、工作的软件、客户合作和响应变化,通过短迭代、频繁交付、持续反馈和团队自组织等实践,提高开发效率和产品质量。 255 | 256 | DevOps(Development和Operations的组合词)是一种文化、实践和工具的集合,旨在打破开发团队和运维团队之间的壁垒,实现软件的快速、可靠交付。DevOps强调自动化和监控,覆盖了从集成、测试、发布到部署、运维的整个软件生命周期。其核心实践包括持续集成(CI)、持续交付/部署(CD)、基础设施即代码(IaC)、监控和日志管理等。通过这些实践,DevOps能够缩短开发周期,提高部署频率和可靠性,加快问题修复速度,并改善开发团队和运维团队之间的协作。在现代软件工程中,DevOps已成为提高软件交付效率和质量的关键方法论。 257 | 258 | 软件架构是软件系统的基础结构,它定义了系统的组件、组件之间的关系以及组件与外部环境的交互方式。良好的架构设计对于系统的质量属性(如性能、可靠性、安全性、可维护性、可扩展性)至关重要。常见的架构风格包括分层架构(将系统功能按层次组织,每层只依赖于下层)、客户端-服务器架构(将功能分为提供服务的服务器和请求服务的客户端)、微服务架构(将系统拆分为多个独立部署、松耦合的服务)、事件驱动架构(组件通过事件的发布与订阅进行通信)等。架构决策需要考虑系统的功能需求、质量属性、技术约束和业务目标,并在各种因素之间进行权衡。在软件工程实践中,架构设计通常是一个持续演进的过程,需要根据需求变化和技术发展不断调整和优化。 259 | 260 | ==== 敏捷开发方法 261 | // 本小节将深入探讨敏捷宣言的四大核心价值观(个体与互动高于流程和工具、可工作的软件高于详尽的文档、客户合作高于合同谈判、响应变化高于遵循计划)和十二条原则,分析它们如何改变了传统软件开发的思维模式和实践方式。 262 | // 系统介绍主流的敏捷框架及其具体实践:Scrum(产品负责人、Scrum主管、开发团队等角色;冲刺规划、每日站会、冲刺评审等事件;产品待办列表、冲刺待办列表等工件)、Kanban(可视化工作流、限制在制品数量、管理流动、明确流程策略、实施反馈循环)、极限编程XP(结对编程、测试驱动开发、持续集成、简单设计)等。 263 | // 全面比较不同敏捷方法的特点、适用场景和关键实践,如迭代开发、用户故事、持续集成、测试驱动开发(TDD)、行为驱动开发(BDD)、重构等,并讨论如何根据项目特性和团队情况选择或定制合适的敏捷方法。 264 | // 深入分析敏捷方法在提高软件开发响应速度、适应需求变化、增强团队协作、提升客户满意度和产品质量方面的优势,同时客观讨论敏捷方法在大型项目、分布式团队、高度监管环境等场景中面临的挑战及应对策略。 265 | 266 | 敏捷开发方法源于2001年发表的《敏捷宣言》,它代表了软件开发方法论的一次重大变革,从传统的计划驱动转向更加灵活、适应性强的开发模式。敏捷宣言提出了四个核心价值观:个体与互动高于流程和工具、可工作的软件高于详尽的文档、客户合作高于合同谈判、响应变化高于遵循计划。这些价值观强调了人的因素、实际成果、协作关系和灵活性在软件开发中的重要性。敏捷宣言还包含十二条原则,进一步阐述了敏捷开发的理念,如尽早并持续交付有价值的软件、欢迎需求变更、业务人员和开发人员必须在整个项目中每天一起工作、定期反思如何提高团队效能等。这些价值观和原则共同构成了敏捷开发的思想基础,指导着各种具体敏捷方法的实践。 267 | 268 | Scrum是最广泛采用的敏捷框架之一,它定义了一套角色、事件和工件。Scrum团队由产品负责人(Product Owner,负责定义产品愿景和优先级)、Scrum主管(Scrum Master,负责促进Scrum过程和移除障碍)和开发团队(跨职能的自组织团队)组成。Scrum的核心事件包括冲刺规划会议(Sprint Planning,计划下一个冲刺的工作)、每日站会(Daily Scrum,同步进度和识别障碍)、冲刺评审会议(Sprint Review,展示完成的工作并获取反馈)和冲刺回顾会议(Sprint Retrospective,反思并改进过程)。Scrum的主要工件有产品待办列表(Product Backlog,所有需求的优先级排序列表)和冲刺待办列表(Sprint Backlog,当前冲刺计划完成的工作项)。Scrum通过这些角色、事件和工件,在固定长度的冲刺(通常2-4周)中迭代开发产品。 269 | 270 | Kanban源自丰田生产系统,是另一种流行的敏捷方法,它强调可视化工作流、限制在制品数量(WIP)和管理流动。Kanban使用看板(一种可视化工作流工具)来跟踪工作项从开始到完成的整个过程,每个工作项在看板上以卡片形式表示,并在不同的列(代表不同的工作状态)之间移动。通过限制每个状态的在制品数量,Kanban帮助团队识别瓶颈、减少等待时间并提高流动效率。与Scrum的固定时间盒不同,Kanban是一种连续流动的方法,工作项可以随时添加到待办列表并开始处理,只要不超过WIP限制。极限编程(XP)则是另一种敏捷方法,它特别强调技术实践,如结对编程(两个程序员共同工作)、测试驱动开发(先写测试,再写代码)、持续集成(频繁集成代码变更)和简单设计(保持设计简单且适应当前需求)。 271 | 272 | 敏捷方法共享一些关键实践,但在具体实施和侧重点上有所不同。迭代开发是所有敏捷方法的基础,它将开发过程分解为短周期,每个周期都交付可工作的软件。用户故事是一种捕获需求的轻量级方式,它从用户视角描述功能,通常采用"作为[角色],我想要[功能],以便[价值]"的格式。持续集成要求开发人员频繁地将代码集成到共享仓库,并通过自动化构建和测试验证变更,这有助于早期发现集成问题。测试驱动开发(TDD)是一种先编写测试,再编写满足测试的代码的开发方法,它促进了更好的设计和更高的测试覆盖率。行为驱动开发(BDD)扩展了TDD,强调从业务视角定义系统行为,使用自然语言描述测试场景。重构是改进代码结构而不改变其外部行为的过程,它是保持代码质量的重要实践。 273 | 274 | 敏捷方法在提高软件开发效率和质量方面具有显著优势。通过短迭代和频繁交付,敏捷团队能够快速响应需求变化,减少浪费和风险。持续的客户参与确保产品符合实际需求,提高客户满意度。自组织团队和面对面沟通促进了团队协作和知识共享,提高了团队效能。然而,敏捷方法也面临一些挑战,特别是在大型项目、分布式团队或高度监管环境中。大型项目可能需要多个敏捷团队协同工作,这要求额外的协调机制,如Scrum of Scrums或规模化敏捷框架(如SAFe、LeSS)。分布式团队需要克服时区差异和沟通障碍,可能需要更多的文档和工具支持。高度监管环境可能要求更严格的文档和流程控制,需要将敏捷实践与合规要求相平衡。尽管存在这些挑战,但通过适当的调整和补充实践,敏捷方法仍然可以在各种环境中有效应用。 275 | 276 | ==== DevOps实践 277 | // 本小节将深入阐明DevOps的核心理念和三大支柱:文化(打破开发与运维之间的壁垒,促进跨团队协作、共同责任和持续学习)、自动化(构建完整的工具链,实现从代码提交到生产部署的自动化流程)、精益原则(优化价值流、减少浪费、缩短周期时间、建立快速反馈循环)、度量(全面监控系统性能和业务指标,数据驱动决策和持续改进)。 278 | // 系统重点讲解持续集成(CI)的核心实践和价值:频繁将代码集成到主干、每次集成触发自动化构建和测试、快速发现并修复集成问题、保持代码库的健康状态,以及实现CI的关键技术要素和最佳实践。 279 | // 全面讲解持续交付/部署(CD)的基本概念、实施步骤和关键技术:自动化构建流水线设计、环境管理、配置管理、部署策略(如蓝绿部署、金丝雀发布、特性开关)、自动化测试策略(单元测试、集成测试、性能测试、安全测试)、发布管理和回滚机制。 280 | // 详细介绍支撑CI/CD的关键技术和工具链,如版本控制系统(Git、SVN)、构建工具(Maven、Gradle、npm)、CI服务器(Jenkins、GitLab CI、GitHub Actions、CircleCI)、容器化技术(Docker)、容器编排平台(Kubernetes)、配置管理工具(Ansible、Chef、Puppet)、监控工具(Prometheus、Grafana、ELK Stack)等,并讨论如何根据项目需求选择和集成这些工具。 281 | 282 | DevOps是一种文化、实践和工具的集合,旨在打破传统开发(Dev)和运维(Ops)之间的壁垒,实现软件交付和基础设施变更的高速度、高质量和持续流动。DevOps的核心理念建立在四大支柱之上:文化、自动化、精益和度量(CALM)。文化方面,DevOps强调打破组织孤岛,建立共同责任感,鼓励协作、透明和信任,培养实验和学习的心态。自动化是DevOps的技术基础,通过自动化构建、测试、部署和监控等流程,减少手动操作,提高效率和一致性。精益原则源自制造业,在DevOps中体现为优化价值流、消除浪费、减少批量大小、缩短周期时间和建立快速反馈循环。度量则强调通过收集和分析关键指标(如部署频率、变更准备时间、平均恢复时间和变更失败率),实现数据驱动的决策和持续改进。 283 | 284 | 持续集成(Continuous Integration,CI)是DevOps的核心实践之一,它要求开发人员频繁地(通常是每天多次)将代码集成到共享仓库的主干分支。每次集成都会触发自动化构建和测试,以尽早发现并解决集成问题。CI的主要价值在于减少集成风险和复杂性,提高代码质量,加速反馈循环,并保持代码库的健康状态。实施CI的关键要素包括:使用版本控制系统管理所有源代码和配置;建立自动化构建过程,确保代码可以在任何环境中一致地构建;创建全面的自动化测试套件,包括单元测试、集成测试和功能测试;设置CI服务器,监控代码仓库并在代码变更时自动触发构建和测试;实施快速反馈机制,及时通知开发人员构建和测试结果;建立团队规范,要求开发人员在提交代码前在本地运行测试,并及时修复破坏构建的问题。 285 | 286 | 持续交付(Continuous Delivery,CD)是CI的自然延伸,它确保软件可以随时可靠地发布到生产环境。持续交付建立了一个完整的自动化流水线,从代码提交到生产就绪,包括构建、测试、打包和部署到各种环境(开发、测试、预生产等)。持续部署(Continuous Deployment)更进一步,将通过所有测试的变更自动部署到生产环境,实现真正的端到端自动化。CD的核心实践包括:构建流水线设计,定义从代码到生产的所有步骤和检查点;环境管理,确保所有环境(开发、测试、生产)的一致性和可重现性;配置管理,将环境配置与应用代码一样版本化和自动化;部署策略,如蓝绿部署(准备新环境并切换流量)、金丝雀发布(逐步将流量引导到新版本)和特性开关(动态启用或禁用功能);自动化测试策略,在流水线的不同阶段执行不同类型的测试;发布管理,包括版本控制、变更日志和回滚机制。 287 | 288 | 支撑CI/CD的工具链是实现DevOps自动化的技术基础。版本控制系统如Git是整个工具链的起点,它管理源代码和配置的版本历史,支持分支和合并工作流。构建工具如Maven(Java)、Gradle(Java/Kotlin)、npm(JavaScript)负责编译代码、管理依赖和打包应用。CI服务器如Jenkins、GitLab CI、GitHub Actions、CircleCI监控代码仓库,在代码变更时触发构建流水线,并协调各种自动化任务。容器化技术如Docker提供了一种打包应用及其依赖的轻量级方式,确保应用在不同环境中一致运行。容器编排平台如Kubernetes管理容器化应用的部署、扩展和运维,提供服务发现、负载均衡和自动恢复等功能。配置管理工具如Ansible、Chef、Puppet自动化服务器配置和应用部署,实现基础设施即代码(IaC)。监控工具如Prometheus(指标收集)、Grafana(可视化)、ELK Stack(日志管理)提供系统运行状态的实时可见性,支持问题诊断和性能优化。选择和集成这些工具时,需要考虑项目规模、团队技能、现有技术栈和特定需求,构建一个平衡、高效的工具链,避免工具过多导致的复杂性。 289 | === 数据管理与分析 290 | // 本小节将全面概述数据在现代系统中的核心地位和战略价值,分析有效的数据管理和分析如何成为系统成功的关键因素,以及数据驱动决策如何改变传统的系统工程实践。 291 | // 系统介绍关系型数据库(SQL)的基本原理、特点和核心概念(如关系模型、规范化、事务处理、ACID特性),以及主流关系型数据库系统(如MySQL、PostgreSQL、Oracle、SQL Server)的特点和适用场景。 292 | // 深入探讨非关系型数据库(NoSQL)的多种类型及其特性,包括键值存储(Redis、DynamoDB)、文档数据库(MongoDB、CouchDB)、列族存储(Cassandra、HBase)、图数据库(Neo4j、JanusGraph)等,分析它们各自的数据模型、查询能力、扩展性和一致性模型,以及在不同应用场景中的优势和局限性。 293 | // 全面阐述大数据处理技术的基本原理和关键组件,如分布式文件系统(HDFS)、分布式计算框架(MapReduce、Spark、Flink)、数据仓库和数据湖(Hive、Snowflake、Delta Lake)、流处理系统(Kafka Streams、Spark Streaming)等,讨论这些技术如何支持海量、多样化数据的存储、处理、分析和可视化。 294 | 295 | 数据管理与分析在现代系统工程中扮演着核心角色,已从传统的辅助功能转变为系统成功的关键驱动力。随着数字化转型的深入,几乎所有系统都在产生和消费海量数据,这些数据不仅记录了系统的运行状态,还蕴含着丰富的业务洞察和优化机会。有效的数据管理确保数据的可用性、一致性、完整性和安全性,而先进的数据分析则能从原始数据中提取有价值的信息,支持更明智的决策制定。数据驱动决策正在根本性地改变传统系统工程实践,从基于经验和直觉的决策模式转向基于证据和量化分析的科学方法。在这一范式转变中,系统工程师需要掌握数据管理和分析的核心技术,以充分发挥数据的战略价值。 296 | 297 | 关系型数据库(SQL数据库)是数据管理的基石,基于E.F. Codd提出的关系模型,将数据组织为相互关联的表格(关系)。关系模型的核心概念包括表(relation)、行(tuple)、列(attribute)、主键(primary key)、外键(foreign key)和索引(index)等。关系型数据库强调数据规范化,通过将数据分解为多个相关表,减少冗余,提高数据一致性。事务处理是关系型数据库的另一重要特性,它确保数据库操作的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即著名的ACID特性。主流关系型数据库系统各有特点:MySQL以易用性和性能平衡著称,广泛应用于Web应用;PostgreSQL提供强大的扩展性和高级特性,适合复杂数据处理;Oracle在企业级应用和大型事务处理系统中占据主导地位;SQL Server则与Microsoft生态系统深度集成,提供全面的商业智能功能。关系型数据库在结构化数据管理、复杂查询和事务处理方面表现出色,但在处理海量数据、高并发负载和非结构化数据时面临挑战。 298 | 299 | 非关系型数据库(NoSQL)应运而生,以应对关系型数据库的局限性,提供更灵活的数据模型和更高的可扩展性。NoSQL数据库通常放宽了ACID约束,采用最终一致性模型,以换取更好的性能和可用性,符合CAP定理(一致性、可用性、分区容错性不可兼得)的权衡。键值存储如Redis和DynamoDB是最简单的NoSQL类型,将数据存储为键值对,提供极高的读写性能和可扩展性,适用于缓存、会话管理和实时分析等场景。文档数据库如MongoDB和CouchDB将数据存储为灵活的JSON或BSON文档,无需预定义模式,适合处理半结构化数据和快速迭代开发。列族存储如Cassandra和HBase针对大规模写入和分析优化,将数据按列而非行组织,适用于时间序列数据、日志分析和物联网应用。图数据库如Neo4j和JanusGraph专门设计用于处理高度互联的数据,将关系作为一等公民,在社交网络分析、推荐系统和知识图谱等领域表现出色。选择合适的NoSQL解决方案需要考虑数据模型、查询模式、一致性需求、扩展性要求和开发团队熟悉度等因素。 300 | 301 | 大数据处理技术解决了传统数据管理系统在处理海量、高速、多样化数据时的局限性。分布式文件系统如Hadoop分布式文件系统(HDFS)提供了可靠、高吞吐量的数据存储基础,通过数据分片和复制实现可扩展性和容错性。分布式计算框架如MapReduce、Spark和Flink在此基础上提供了并行处理能力,使复杂分析任务可以分布在计算集群上执行。MapReduce通过简化的编程模型(映射和归约)处理批量数据;Spark引入了弹性分布式数据集(RDD)和内存计算,显著提高了性能;Flink则提供了统一的批处理和流处理API,支持事件时间语义和精确一次处理保证。数据仓库和数据湖解决了数据整合和分析的需求:传统数据仓库如Hive提供结构化的数据存储和SQL查询能力;现代云数据仓库如Snowflake分离存储和计算,实现弹性扩展;数据湖如Delta Lake则允许在原始格式存储各类数据,同时提供事务支持和模式演化。流处理系统如Kafka Streams和Spark Streaming处理实时数据流,支持窗口计算、状态管理和连续查询,适用于实时监控、欺诈检测和实时推荐等场景。这些大数据技术共同构成了现代数据处理架构,支持从数据采集、存储、处理到分析和可视化的完整流程。 302 | 303 | ==== 数据挖掘与知识发现 304 | // 本小节将系统阐述数据挖掘的基本概念、流程和主要技术,包括数据预处理(清洗、转换、规约)、特征工程(选择、提取、构造)、模式发现(聚类、分类、关联规则)和结果评估等关键步骤。 305 | // 深入探讨常用的数据挖掘算法及其应用场景,如分类算法(决策树、随机森林、支持向量机、神经网络)、聚类算法(K-means、层次聚类、DBSCAN)、关联规则挖掘(Apriori、FP-Growth)、异常检测和时间序列分析等。 306 | // 详细讨论知识发现的高级技术,如文本挖掘(自然语言处理、主题建模、情感分析)、图挖掘(社区发现、链接预测、影响力分析)、推荐系统(协同过滤、内容基础、混合方法)等,以及它们在不同领域的具体应用。 307 | // 全面分析数据挖掘项目的实施挑战和最佳实践,包括问题定义、数据质量管理、算法选择与调优、结果解释与可视化、模型部署与监控等方面,强调数据科学团队与领域专家协作的重要性。 308 | 309 | 数据挖掘是从大量数据中提取有价值模式和知识的过程,是数据分析的核心技术之一。数据挖掘流程通常包括几个关键步骤:首先是数据预处理,包括数据清洗(处理缺失值、异常值和不一致数据)、数据转换(标准化、归一化)和数据规约(降维、抽样);其次是特征工程,包括特征选择(识别最相关特征)、特征提取(创建新特征)和特征构造(组合现有特征);然后是模式发现,应用各种算法发现数据中的规律;最后是结果评估,验证发现的模式是否有效、有用且新颖。这一系统化流程确保了数据挖掘结果的可靠性和实用性,将原始数据转化为可操作的知识。在实际应用中,数据挖掘不是一次性的线性过程,而是一个迭代循环,需要根据评估结果不断调整和优化。 310 | 311 | 数据挖掘算法可根据任务类型分为几大类,每类都有其特定的应用场景和技术特点。分类算法用于预测离散类别标签,常用的有决策树(易于理解和解释)、随机森林(集成多个决策树,提高准确性和鲁棒性)、支持向量机(在高维空间中表现良好)和神经网络(适合复杂模式识别)。聚类算法用于发现数据中的自然分组,不需要预先标记的训练数据,主要包括K-means(基于距离的划分聚类,简单高效)、层次聚类(自底向上或自顶向下构建聚类层次)和DBSCAN(基于密度的聚类,能识别任意形状的簇)。关联规则挖掘发现数据项之间的频繁共现关系,如购物篮分析中的"尿布→啤酒"规则,常用算法有Apriori(基于频繁项集的迭代方法)和FP-Growth(基于频繁模式树的高效算法)。此外,异常检测算法识别与正常模式显著偏离的数据点,在欺诈检测、网络安全和设备监控中广泛应用;时间序列分析则处理按时间顺序收集的数据,用于趋势预测、季节性分析和异常检测。这些算法构成了数据挖掘的技术工具箱,可根据具体问题选择合适的工具。 312 | 313 | 知识发现的高级技术扩展了传统数据挖掘的范围,处理更复杂的数据类型和任务。文本挖掘应用自然语言处理技术分析非结构化文本数据,包括文本分类(如垃圾邮件过滤)、主题建模(如LDA算法提取文档主题)、情感分析(判断文本情感倾向)和命名实体识别(识别人名、地点、组织等)。图挖掘处理网络结构数据,如社交网络、交通网络和生物网络,主要任务包括社区发现(识别紧密连接的节点组)、链接预测(预测未来可能形成的连接)、中心性分析(识别网络中的重要节点)和图表示学习(将图结构转换为向量表示)。推荐系统是另一个重要应用领域,通过分析用户行为和项目特征,预测用户偏好并推荐相关内容,主要方法包括协同过滤(基于用户-项目交互)、基于内容的推荐(基于项目特征)和混合方法(结合多种技术)。这些高级技术在电子商务、社交媒体、医疗健康、金融服务和智能制造等领域有广泛应用,帮助组织从复杂数据中获取洞察,支持决策制定。 314 | 315 | 数据挖掘项目的成功实施面临多方面挑战,需要遵循一系列最佳实践。首先,明确的问题定义至关重要,需要将业务问题转化为可通过数据挖掘解决的技术问题,设定清晰的目标和成功标准。其次,数据质量管理是基础,包括建立数据治理框架、实施数据质量检查和改进措施,确保"垃圾进,垃圾出"的原则不会影响结果。第三,算法选择与调优需要考虑数据特性、问题类型和性能要求,通常需要尝试多种算法并通过交叉验证等技术优化参数。第四,结果解释与可视化对于将技术发现转化为业务洞察至关重要,需要使用适当的可视化技术和通俗易懂的语言向非技术利益相关者传达结果。第五,模型部署与监控确保数据挖掘成果能够实际应用并持续产生价值,包括模型集成、性能监控和定期更新。贯穿整个过程的是数据科学团队与领域专家的紧密协作,前者提供技术专长,后者提供业务背景和验证结果的实用性。成功的数据挖掘项目不仅需要先进的技术,还需要有效的项目管理、跨职能协作和组织变革管理,以确保发现的知识能够转化为实际行动和业务价值。 316 | 317 | ==== 数据可视化与决策支持 318 | // 本小节将系统阐述数据可视化的基本原理、设计准则和认知基础,探讨如何选择合适的可视化类型(如条形图、折线图、散点图、热图、树状图、网络图等)来有效传达不同类型的数据关系和洞察。 319 | // 深入分析高级数据可视化技术及其应用,包括多维数据可视化(平行坐标、雷达图)、时空数据可视化(地图、时间线)、层次数据可视化(树图、旭日图)、网络数据可视化(力导向图、桑基图)以及交互式可视化(过滤、缩放、钻取、链接与刷新)等。 320 | // 全面介绍现代数据可视化工具和平台的特点与适用场景,从编程库(如D3.js、Matplotlib、ggplot2)到商业智能平台(如Tableau、Power BI、Qlik)和专业可视化软件(如Gephi、Cytoscape),以及如何根据用户需求和技术能力选择合适的工具。 321 | // 详细探讨决策支持系统的架构、功能和实施方法,包括数据仓库、OLAP(联机分析处理)、仪表板设计、关键绩效指标(KPI)监控、预警机制、假设情景分析和预测分析等组件,以及如何将数据可视化与决策支持系统集成,支持各级决策者的信息需求。 322 | 323 | 数据可视化是将数据转化为视觉表示的过程,利用人类视觉系统的强大处理能力,帮助人们更快、更有效地理解数据中的模式、趋势和异常。有效的数据可视化基于视觉感知和认知心理学原理,如预注意处理(人们能在意识处理前快速感知某些视觉特征)、格式塔原则(人们倾向于将视觉元素组织为有意义的整体)和认知负荷理论(人类工作记忆容量有限)。数据可视化设计应遵循几个核心准则:首先是清晰性,确保可视化准确传达数据,避免误导;其次是简洁性,去除无关装饰,突出关键信息;第三是上下文性,提供必要背景使数据有意义;第四是适应性,根据目标受众和使用场景调整复杂度。选择合适的可视化类型取决于数据特性和分析目的:条形图适合比较离散类别的数值;折线图展示连续数据的趋势;散点图显示两个变量之间的关系;热图表示二维数据的密度或强度;树状图展示层次结构;网络图表示实体间的连接关系。每种可视化类型都有其优势和局限性,选择时需考虑数据维度、变量类型(分类、顺序、数值)和要传达的信息类型(比较、构成、分布、关系、趋势)。 324 | 325 | 高级数据可视化技术解决了复杂数据集的表示挑战,使人们能够探索和理解多维、动态和复杂结构的数据。多维数据可视化处理包含多个变量的数据集,常用技术包括平行坐标图(将多维空间中的点表示为折线,每个维度对应一条垂直坐标轴)和雷达图(在圆形坐标系中表示多个变量,适合比较多个实体的多维特征)。时空数据可视化结合时间和空间维度,包括各种地图可视化(如热力地图、符号地图、等值线图)和时间序列可视化(如时间线、堆叠面积图、动态地图)。层次数据可视化表示包含父子关系的数据结构,常用技术有树图(节点链接表示)、树状图(嵌套矩形表示空间划分)和旭日图(使用同心环表示层次)。网络数据可视化展示实体间的关系,主要方法包括力导向图(通过模拟物理力使图布局美观)、桑基图(表示流量或资源在系统中的流动)和弦图(显示群组间的关系)。交互式可视化超越了静态图表的局限,允许用户主动参与数据探索,常见交互技术包括过滤(选择性显示数据子集)、缩放(改变可视化的尺度)、钻取(从概览到细节的导航)、链接与刷新(在多个视图间协调选择)。这些高级技术使数据可视化从简单的数据展示工具发展为强大的数据探索和分析平台。 326 | 327 | 现代数据可视化工具和平台提供了从基础图表创建到复杂可视化分析的全方位支持,可根据用户需求和技术能力选择。编程库为开发人员和数据科学家提供了最大的灵活性和定制能力:D3.js是基于Web的可视化库,通过直接操作DOM创建动态、交互式可视化;Matplotlib是Python生态系统中的标准可视化库,提供全面的静态、动态和交互式可视化;ggplot2基于"图形语法"理念,在R语言中创建优雅、一致的可视化。商业智能平台面向业务分析师和决策者,提供用户友好的界面和强大的分析功能:Tableau以其直观的拖放界面和高质量可视化著称;Power BI与Microsoft生态系统深度集成,提供从数据连接到发布的端到端解决方案;Qlik强调关联数据模型和内存分析,支持自由形式的探索。专业可视化软件针对特定数据类型或领域优化:Gephi专注于大规模网络可视化和分析;Cytoscape最初为生物网络设计,现支持各种复杂网络可视化;RAWGraphs简化了创建非常规图表的过程。选择合适的工具需考虑多个因素:数据规模和复杂性、可视化需求(静态报告vs.交互式仪表板)、用户技术水平、集成需求(与现有系统的兼容性)、成本和可扩展性。 328 | 329 | 决策支持系统(DSS)是一类交互式计算机系统,旨在帮助决策者利用数据、文档、知识和模型解决半结构化或非结构化决策问题。现代DSS通常采用多层架构:数据层负责数据采集、存储和管理,通常包括数据仓库(集成多源数据的主题导向、集成的、时变的、非易失的数据集合)和数据集市(面向特定业务部门的小型数据仓库);分析层实现各种分析功能,包括OLAP(联机分析处理,支持多维数据分析和钻取)、数据挖掘(发现隐藏模式)和预测分析(基于历史数据预测未来趋势);表现层负责将分析结果以直观方式呈现给用户,主要通过仪表板和报表实现。仪表板设计是DSS的关键组成部分,有效的仪表板应遵循以下原则:关注关键绩效指标(KPI),确保显示的指标与业务目标一致;采用分层信息架构,从概览到细节;使用适当的可视化类型;提供上下文和比较基准;支持交互和个性化。DSS的高级功能包括预警机制(当指标超出预设阈值时自动通知)、假设情景分析("假如"分析,评估不同决策选项的潜在影响)和预测分析(使用统计模型和机器学习预测未来趋势)。将数据可视化与DSS集成可显著提升决策效率:战略层决策者需要高级别仪表板,显示关键业务指标和长期趋势;战术层管理者需要更详细的分析视图,支持资源分配和中期规划;操作层人员需要实时监控和异常检测,支持日常决策。成功的DSS实施需要技术和业务的紧密结合,确保系统不仅技术上先进,而且真正满足决策者的需求,提供可操作的洞察。 330 | === 人工智能与机器学习 331 | // 全面介绍人工智能和机器学习的基本概念、发展历史和主要分支,包括监督学习、无监督学习、半监督学习和强化学习等,以及各分支的特点、应用场景和典型算法。 332 | // 深入探讨机器学习的核心技术,包括特征工程、模型选择、参数优化、模型评估等关键环节,以及深度学习、迁移学习、联邦学习等前沿技术的原理和应用。 333 | // 系统分析AI/ML在系统工程各个阶段的应用潜力,如需求分析中的自然语言处理、系统设计中的智能优化、系统运维中的预测性维护、决策支持中的智能推荐等。 334 | // 详细讨论AI/ML在系统工程中面临的挑战,包括数据质量和可用性、算法可解释性、计算资源需求、模型部署和维护等问题,以及相应的解决方案和最佳实践。 335 | 336 | 人工智能(AI)和机器学习(ML)作为计算机科学的重要分支,正在深刻改变系统工程的实践方式。AI是研究和开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的一门新的技术科学,其核心是让机器具备学习、推理和解决问题的能力。机器学习是AI的核心技术之一,通过算法使计算机系统从数据中学习,不断改善性能。根据学习方式的不同,ML可分为几个主要分支:监督学习通过标记数据学习输入与输出之间的映射关系,常用于分类和回归任务;无监督学习从未标记数据中发现潜在的结构和模式,如聚类和降维;半监督学习结合标记和未标记数据,在标记数据有限的情况下提高学习效果;强化学习通过试错和奖励机制,学习在特定环境中做出最优决策。每种学习方式都有其特定的应用场景和算法工具,如监督学习中的支持向量机、随机森林和神经网络,无监督学习中的K-means聚类和主成分分析,强化学习中的Q-learning和策略梯度法等。 337 | 338 | 机器学习的实践涉及多个关键环节,每个环节都需要仔细考虑和优化。特征工程是机器学习的基础,包括特征选择(识别最相关的特征)、特征提取(创建新特征)和特征转换(标准化、归一化等),直接影响模型的性能。模型选择需要考虑数据特性、问题类型、计算资源和性能要求等因素,选择合适的算法和模型架构。参数优化通过交叉验证、网格搜索等技术调整模型参数,平衡模型的偏差和方差。模型评估使用准确率、精确率、召回率、F1分数等指标,全面评估模型性能。近年来,深度学习因其强大的特征学习能力成为ML的重要分支,在计算机视觉、自然语言处理、语音识别等领域取得突破性进展。迁移学习允许将在一个任务上学到的知识迁移到相关任务,减少数据需求和训练时间。联邦学习则提供了在保护数据隐私的前提下,实现多方协作学习的新范式。 339 | 340 | AI/ML在系统工程中有广泛的应用前景。在需求分析阶段,自然语言处理技术可以帮助分析和理解用户需求文档,提取关键信息,识别需求之间的依赖关系,并检测潜在的冲突和不一致。在系统设计阶段,智能优化算法可以辅助架构设计、性能优化和资源分配,通过多目标优化找到平衡各种约束和目标的最优解。在系统运维阶段,机器学习模型可以实现预测性维护,通过分析系统运行数据预测潜在故障,提前采取预防措施。在决策支持方面,AI可以通过分析历史数据、当前状态和外部环境,为决策者提供智能建议和风险评估。这些应用不仅提高了系统工程各个环节的效率和质量,还为创新解决方案提供了新的可能性。 341 | 342 | 然而,将AI/ML技术应用到系统工程实践中也面临诸多挑战。数据质量和可用性是首要问题,机器学习模型的性能严重依赖于训练数据的质量和数量,而在实际项目中,获取高质量的标记数据往往成本高昂。算法可解释性是另一个关键挑战,特别是在关键系统中,需要理解和解释模型的决策过程,确保其可靠性和可信性。计算资源需求也是一个实际问题,深度学习等高级AI技术通常需要大量的计算资源和专业化硬件支持。模型部署和维护涉及模型版本管理、性能监控、定期更新等复杂任务,需要建立完整的MLOps(机器学习运维)流程。此外,AI系统的伦理问题,如公平性、透明度和责任归属,也需要认真考虑和规范。解决这些挑战需要采用系统化的方法,包括建立数据治理框架、开发可解释AI技术、优化模型架构、采用云计算和边缘计算等技术,以及制定AI伦理准则和最佳实践指南。 343 | 344 | 在实施AI/ML项目时,需要遵循一些关键原则和最佳实践。首先,明确问题定义和成功标准,确保AI解决方案与业务目标一致。其次,采用迭代式开发方法,从简单模型开始,逐步增加复杂度。第三,重视数据质量管理,建立数据采集、清洗和验证的标准流程。第四,选择适当的评估指标和验证方法,确保模型在实际环境中的可靠性。第五,建立完整的模型生命周期管理流程,包括版本控制、部署自动化和性能监控。最后,加强跨职能团队协作,确保AI专家、领域专家和系统工程师之间的有效沟通和知识共享。通过这些实践,可以更好地发挥AI/ML在系统工程中的价值,推动创新和效率提升。 345 | === 人工智能与机器学习 346 | // 全面介绍人工智能和机器学习的基本概念、发展历史和主要分支,包括监督学习、无监督学习、半监督学习和强化学习等,以及各分支的特点、应用场景和典型算法 347 | // 深入探讨机器学习的核心技术,包括特征工程、模型选择、参数优化、模型评估等关键环节,以及深度学习、迁移学习、联邦学习等前沿技术的原理和应用 348 | // 分析人工智能和机器学习在系统工程中的典型应用场景,如故障预测与诊断、性能优化、异常检测、决策支持等,并讨论实施过程中的关键考虑因素 349 | // 探讨人工智能系统的可解释性、安全性、鲁棒性等质量属性,以及如何在实际应用中平衡这些要求 350 | 351 | 人工智能与机器学习已成为现代系统工程中不可或缺的技术支柱,为系统的智能化和自动化提供了强大的技术基础。人工智能经历了从符号主义到连接主义,再到当前深度学习主导的发展历程,各个阶段都对系统工程产生了深远影响。机器学习作为人工智能的核心技术,根据学习方式可分为几大类:监督学习通过标记数据学习输入输出映射关系,适用于分类和回归问题;无监督学习从未标记数据中发现潜在结构,常用于聚类和降维;半监督学习结合标记和未标记数据,在标记数据有限时特别有效;强化学习通过与环境交互学习最优策略,适合控制和决策问题。每种学习方式都有其特定的应用场景和算法工具,如监督学习中的支持向量机、随机森林和深度神经网络,无监督学习中的K-means聚类和主成分分析,强化学习中的Q-learning和策略梯度法等。 352 | 353 | 机器学习的实践过程涉及多个关键环节,每个环节都需要仔细考虑和优化。特征工程是机器学习成功的基础,包括特征提取、选择和转换,目标是创建能够充分表达问题本质的特征集。模型选择需要考虑数据特性、问题类型和性能要求,选择合适的算法和模型架构。参数优化通过交叉验证等技术调整模型参数,平衡模型的拟合程度和泛化能力。模型评估使用准确率、精确率、召回率等指标衡量模型性能,并通过混淆矩阵等工具深入分析模型行为。近年来,深度学习、迁移学习和联邦学习等新技术显著扩展了机器学习的能力边界:深度学习通过多层神经网络自动学习特征表示,在图像、语音和自然语言处理等领域取得突破性进展;迁移学习允许将一个领域学到的知识迁移到另一个相关领域,减少对目标领域数据的需求;联邦学习支持多方在保护数据隐私的前提下协作训练模型,特别适合分布式系统场景。 354 | 355 | 在系统工程中,人工智能和机器学习的应用已经渗透到各个环节。在系统运维方面,机器学习可以实现故障预测与诊断,通过分析系统运行数据预测潜在故障,并辅助定位故障原因。在性能优化方面,机器学习算法可以自动调整系统参数,优化资源利用和响应时间。在安全防护方面,异常检测算法可以识别潜在的安全威胁和异常行为。在决策支持方面,机器学习模型可以分析复杂数据,为系统优化和升级决策提供依据。实施这些应用时需要考虑多个因素:数据质量和可用性、算法选择和调优、计算资源需求、模型部署和维护等。特别重要的是,机器学习系统本身也是需要工程化管理的,包括版本控制、持续集成、监控和更新等环节。 356 | 357 | 人工智能系统的质量属性是实际应用中必须认真对待的问题。可解释性关注模型决策过程的透明度和可理解性,特别是在关键决策和高风险场景中,需要能够解释模型为什么做出特定决策。安全性涉及模型对抗攻击的防护能力,以及在面对恶意输入时的行为可控性。鲁棒性要求模型在面对噪声、异常和分布偏移时仍能保持稳定性能。这些质量属性往往存在相互制约,如提高模型复杂度可能提升性能但降低可解释性,增加防御机制可能影响模型效率等。在实际应用中,需要根据具体场景和要求,在这些质量属性之间找到合适的平衡点。同时,还需要建立相应的评估框架和监控机制,确保系统在运行过程中持续满足这些质量要求。 358 | 在实施AI/ML项目时,需要遵循一些关键原则和最佳实践。首先,明确问题定义和成功标准,确保AI解决方案与业务目标一致。其次,采用迭代式开发方法,从简单模型开始,逐步增加复杂度。第三,重视数据质量管理,建立数据采集、清洗和验证的标准流程。第四,选择适当的评估指标和验证方法,确保模型在实际环境中的可靠性。第五,建立完整的模型生命周期管理流程,包括版本控制、部署自动化和性能监控。最后,加强跨职能团队协作,确保AI专家、领域专家和系统工程师之间的有效沟通和知识共享。通过这些实践,可以更好地发挥AI/ML在系统工程中的价值,推动创新和效率提升。 359 | 360 | 在AI/ML项目的实施过程中,数据管理是一个核心挑战。需要建立完善的数据治理框架,包括数据采集标准、数据质量控制、数据安全和隐私保护等方面。同时,要注意数据的代表性和平衡性,避免模型训练中的偏差。此外,还需要考虑数据存储和处理的效率,选择合适的数据库和计算框架,优化数据流水线。 361 | 362 | 模型开发和部署是另一个关键环节。在模型开发阶段,需要注意算法的可解释性和透明度,特别是在关键决策系统中。模型部署时,要考虑系统的可扩展性和性能要求,选择合适的部署架构和服务方式。同时,要建立模型监控和更新机制,确保模型在生产环境中的持续有效性。 363 | 364 | 人才培养和团队建设也是成功实施AI/ML项目的重要因素。需要培养既懂AI技术又理解业务需求的复合型人才,建立有效的知识管理和经验共享机制。同时,要注重团队的持续学习和能力提升,跟踪AI/ML领域的最新发展和最佳实践。 365 | 366 | 在项目管理方面,需要采用适合AI/ML项目特点的敏捷方法论,强调快速迭代和持续改进。要建立清晰的项目里程碑和评估指标,定期评估项目进展和价值实现情况。同时,要注意风险管理,包括技术风险、数据风险和业务风险的识别和控制。 367 | 368 | 最后,要重视AI/ML项目的可持续性和长期价值。这包括建立持续优化的机制,不断提升模型性能和系统效率;建立知识积累和经验沉淀的机制,促进组织的AI能力建设;以及建立价值评估和反馈的机制,确保AI项目持续为组织创造价值。通过这些措施,可以确保AI/ML项目不仅能够成功实施,还能持续发挥作用,为组织带来长期竞争优势。 369 | // 详细记录融合方案在项目中的具体实施步骤,包括团队培训、工具引入、流程调整、试点运行和全面推广等阶段。 370 | // 分析实施过程中遇到的主要困难(如团队成员对新方法和工具的抵触、模型维护成本、工具链集成问题)以及采取的应对策略和解决方案。 371 | // 通过收集和分析定量与定性数据,全面评估融合方案带来的实际效果: 372 | 373 | 融合方案的实施采用了分阶段、循序渐进的策略。首先,项目组织了为期两周的集中培训,内容涵盖MBSE基础理论、建模工具使用、敏捷开发实践等,确保团队成员对新方法和工具有基本认识。培训采用理论讲解与实践演练相结合的方式,通过小规模示例项目让团队成员熟悉工作流程。同时,选拔和培养了核心骨干作为各团队的MBSE专家,负责在日常工作中指导和支持其他成员。 374 | 375 | 工具引入阶段采用渐进式方法,首先在基础设施团队引入SysML建模工具,用于系统架构设计和文档化。随后将JIRA与Confluence集成,建立需求管理和协作平台。在确保基础工具链稳定运行后,逐步引入自动化测试、持续集成等高级功能。为降低工具链集成的复杂性,项目组开发了必要的适配插件和自动化脚本,简化工具间的数据流转。 376 | 377 | 在流程调整方面,项目采用"小步快跑"策略,先在局部优化现有流程,待效果验证后再推广到其他环节。例如,首先在需求分析阶段引入模型驱动方法,通过领域模型和业务流程图提升需求的准确性和完整性。经过几次迭代,团队逐渐掌握了使用模型辅助需求分析的技巧,效率显著提升。 378 | 379 | 试点运行选择了一个新功能模块作为验证场景,该模块功能相对独立但又涉及典型的分布式系统挑战。试点过程中,重点关注模型驱动方法对需求分析、架构设计和开发实现的指导作用,以及与敏捷开发实践的结合效果。通过试点,发现并解决了一些实际问题,如模型过度复杂、更新不及时等,为全面推广积累了宝贵经验。 380 | 381 | 在全面推广阶段,项目团队面临的主要挑战包括:部分开发人员对建模工具不熟悉,认为增加了工作负担;模型维护需要投入额外时间和精力;工具链在大规模使用时出现性能问题等。针对这些问题,项目采取了一系列措施:组织定期的经验分享会,展示模型驱动方法带来的实际收益;优化模型粒度,避免过度建模;升级工具服务器配置,优化数据存储和查询性能。 382 | 383 | 通过定量和定性分析,融合方案的效果显著:需求变更导致的返工减少30%,架构设计评审效率提升50%,代码质量问题(如架构违规)减少40%,系统测试覆盖率提升至85%。团队成员反馈表示,虽然前期需要投入学习时间,但模型驱动方法确实帮助他们更好地理解系统,提高了工作质量和效率。特别是在处理复杂业务逻辑和跨团队协作时,统一的模型语言极大地促进了沟通和理解。 384 | == 结合数据科学的系统分析与决策 385 | 386 | 在当今数据驱动的时代,将数据科学的强大能力引入系统工程实践已成为必然趋势。通过系统化地收集和分析系统生命周期中产生的各类数据,可以为系统设计、开发和运维决策提供有力支持。这种数据驱动的方法不仅能够帮助我们更好地理解系统行为和用户需求,还能够预测潜在问题并及时做出调整。 387 | 388 | 在系统设计阶段,数据分析可以帮助我们更准确地进行容量规划和架构决策。通过分析历史负载数据、用户行为模式和资源使用情况,我们能够更好地预测系统的性能需求,选择合适的技术方案。同时,数据挖掘技术可以帮助发现潜在的性能瓶颈和系统脆弱点,为架构优化提供依据。 389 | 390 | 在系统运维阶段,机器学习算法可以实现智能化的监控和预警。通过建立系统正常行为的基准模型,异常检测算法可以及时发现潜在的故障和安全威胁。预测性分析则可以帮助我们提前预知可能的系统问题,实现主动式维护。此外,自动化的日志分析和故障诊断可以大大提高运维效率,减少系统故障的平均修复时间。 391 | 392 | 在产品迭代过程中,数据分析为需求工程提供了重要的决策支持。通过分析用户行为数据,我们可以构建精确的用户画像,了解不同用户群体的需求特点和使用习惯。功能使用热力图可以帮助我们识别最受欢迎的功能和潜在的改进空间。A/B测试和灰度发布等实验方法则使我们能够科学地验证新功能的效果,优化产品设计决策。 393 | 394 | 这种数据驱动的方法最终形成了一个持续优化的闭环:从数据收集到分析洞察,再到决策执行和效果验证。这不仅提高了系统工程决策的科学性和准确性,也为产品的持续改进提供了可靠的依据。通过建立这样的数据反馈机制,我们能够更好地理解和满足用户需求,不断提升产品的市场竞争力。 395 | 396 | = 实践案例分析 397 | 398 | 本章通过两个具体的工业案例,展示SE与CS融合方法在实际复杂工程问题中的应用价值。选择的案例分别来自软件和汽车行业,具有很强的代表性,能够充分体现融合方法在不同场景下的独特优势和实施挑战。通过深入剖析这些案例的项目背景、技术挑战、具体方案设计、实施过程以及效果评估,我们可以提炼出宝贵的经验教训,为其他项目提供有益借鉴。 399 | 400 | == 案例一:大型分布式软件系统开发 401 | 402 | === 项目背景与挑战 403 | 404 | 该项目是一个大型电商平台的核心交易系统,需要支撑千万级日活用户、处理百万级并发请求。系统采用微服务架构,使用Java和Spring Cloud技术栈,部署在Kubernetes集群上,后端存储采用MySQL和Redis。项目面临着业务需求复杂且频繁变更、服务依赖关系复杂、多团队协作效率低下等挑战。特别是在确保系统7x24小时高可用的同时,还要实现快速的功能迭代,这给项目团队带来了巨大压力。 405 | 406 | === SE与CS结合方案设计 407 | 408 | 项目团队设计了一套创新的SE与CS融合方案。首先采用MBSE方法和Cameo SysML Modeler工具,构建了覆盖核心业务流程、领域模型和系统架构的统一模型。通过建立需求-设计-实现-测试的完整追溯链,确保了设计决策的一致性传递。同时将系统模型中的关键设计决策作为指导,帮助敏捷团队更好地进行用户故事拆分和技术实现。在持续集成流水线中还集成了基于模型的自动化测试,有效保证了代码变更不会破坏预定的架构约束。 409 | 410 | ==== 效率提升分析 411 | 412 | 通过收集关键指标数据发现,融合方案带来了显著的效率提升。每个Sprint的完成故事点数稳步提升,新功能从需求到上线的周期缩短了40%,代码合并冲突减少了60%。这主要得益于MBSE提供的清晰系统视图减少了沟通误解,而敏捷方法的快速反馈机制加速了价值交付。特别是模型驱动开发通过自动生成部分代码,显著提升了开发人员的工作效率。 413 | 414 | ==== 质量改进分析 415 | 416 | 在质量方面也取得了明显进步。单元测试覆盖率提升至85%,静态代码分析发现的缺陷数量减少50%,生产环境的故障率降低70%。MBSE的早期建模和仿真能力帮助团队在设计阶段就发现了大量潜在问题。同时,敏捷开发中的持续测试实践也有效提升了代码质量。系统的可靠性、可用性、性能等非功能特性都得到了全面改善。 417 | 418 | === 经验教训总结 419 | 420 | 项目实践表明,成功实施SE与CS融合需要几个关键因素:管理层的坚定支持、分阶段的实施策略、合适的工具选型、持续的团队培训以及开放协作的文化氛围。同时也暴露出一些挑战,如模型维护成本高、工具链复杂度大、效果度量困难等。这些经验教训为其他项目提供了宝贵的参考。 421 | == 案例二:智能网联汽车系统设计 422 | 423 | 智能网联汽车(ICV)作为一个典型的信息物理融合系统(CPS),不仅涉及传统的机械和电子工程,还深度融合了计算机科学、人工智能和通信技术。这种高度复杂的系统对SE与CS的融合提出了极高要求。本案例重点分析在ICV系统研发过程中,如何系统性地整合系统工程方法与计算机科学技术,特别是在自动驾驶、智能座舱和车联网等关键功能的开发中。 424 | 425 | === 系统需求与架构设计 426 | 427 | 项目团队采用系统工程的需求工程方法,从整车级用户场景和功能需求出发,进行系统化的分解。通过MBSE方法和SysML工具,构建了统一的多视图系统架构模型,包括功能架构、逻辑架构和物理架构。在此基础上,进行了严格的功能安全分析(HARA)和网络安全威胁分析(TARA),推导出安全目标和功能安全需求,并将其分配到架构元素中。 428 | 429 | 为确保不同供应商和内部团队开发的模块能够正确集成,项目定义了清晰规范的系统内部及外部接口标准,涵盖CAN/LIN/以太网通信协议、传感器数据格式和云端API等。这种系统化的需求分析和架构设计方法,为后续的详细设计和开发奠定了坚实基础。 430 | 431 | === 软件密集型功能开发 432 | 433 | 在软件开发方面,项目重点关注自动驾驶、智能座舱和车联网三大核心功能领域。自动驾驶系统采用深度学习和计算机视觉技术实现环境感知,使用规划算法进行决策控制;智能座舱系统整合了多模态人机交互和个性化服务;车联网系统则实现了远程控制、OTA升级等功能。 434 | 435 | 开发过程严格遵循AUTOSAR标准和MISRA编码规范,采用敏捷开发方法进行快速迭代,同时通过持续集成确保代码质量。特别注重软件开发与系统级模型的一致性,通过模型驱动开发(MDD)和基于模型的测试(MBT)等技术,确保软件实现符合系统设计规约。 436 | 437 | === 虚实结合的系统验证 438 | 439 | 项目采用贯穿整个开发周期的虚实结合验证策略。在早期阶段,主要使用模型在环(MIL)和软件在环(SIL)进行功能验证;中期阶段,通过硬件在环(HIL)测试平台验证ECU的集成效果;后期则进行车辆在环(VIL)测试和实车道路测试。 440 | 441 | ==== 仿真测试平台搭建 442 | 443 | 项目构建了完整的仿真测试环境,集成了车辆动力学仿真、传感器仿真和交通场景仿真等多个子系统。通过高保真度的数字孪生技术,模拟真实世界的各种工况和场景。测试场景的设计采用形式化方法,确保对各类边缘情况的充分覆盖。 444 | 445 | ==== 实车测试与数据分析 446 | 447 | 在实车测试阶段,项目制定了完整的测试计划,包括场地选择、车辆改装、数据采集系统部署等。通过系统化的数据采集和分析流程,对测试过程中产生的海量数据进行处理,评估系统性能指标,发现潜在问题,并将分析结果反馈到开发过程中。 448 | 449 | === 案例总结 450 | 451 | 本案例展示了SE与CS在智能网联汽车领域的深度融合实践。通过建立统一的MBSE模型、实施严格的安全设计、构建完整的验证体系,以及采用数据驱动的开发方法,成功应对了系统开发中的各种挑战。同时也暴露出一些问题,如复杂AI算法的可靠性验证、海量数据的有效利用等,这些都是未来需要继续探索的方向。 452 | 453 | = 讨论与展望 454 | 455 | 在前述理论研究和两个实践案例分析的基础上,本章将进行更深入、更宏观的讨论,并对系统工程与计算机科学融合这一领域的未来发展趋势进行展望。通过系统性地归纳和总结SE与CS融合所能带来的显著优势和核心价值,论证其必要性和重要性。同时,客观、全面地分析当前在推动这种跨学科融合过程中普遍面临的主要挑战和亟待解决的关键问题。最后,基于对当前技术发展趋势和未来系统工程需求的洞察,预测并提出SE与CS融合领域未来可能的研究热点和重点发展方向。 456 | 457 | == SE与CS结合的优势分析 458 | 459 | SE与CS的结合能够显著提升复杂系统的开发效率。通过MBSE方法减少团队间的沟通成本和返工,同时利用敏捷开发和DevOps实践加速交付速度。自动化工具的应用能够大幅提高个体生产力,从而整体缩短系统从概念到部署的周期。实践表明,这种结合可以使项目交付周期缩短30%-50%。 460 | 461 | 在质量保障方面,SE与CS的结合也展现出独特优势。SE的严谨验证方法与CS的先进测试技术(如自动化测试、仿真测试、形式化验证)相结合,能够在系统开发早期就发现并修复潜在缺陷。这种"左移"的质量保证方法,显著提高了系统的健壮性、可靠性和安全性。数据显示,采用这种融合方法的项目,生产环境中的严重故障率平均降低60%以上。 462 | 463 | 面对日益增长的系统复杂性,SE的系统思维和整体优化能力,结合CS的精细化建模、强大计算和数据处理能力,能够更好地理解、设计、管理和控制高度复杂的现代系统。特别是在处理跨领域、多层次的系统问题时,这种结合优势更为明显。例如在智能网联汽车开发中,需要同时处理机械、电子、软件、通信等多个领域的复杂交互。 464 | 465 | 此外,不同学科知识、方法和工具的碰撞与融合,更容易激发新的设计思想、催生创新解决方案、拓展应用场景,从而创造更大的商业和社会价值。实践证明,采用SE与CS融合方法的创新项目,其市场成功率比传统方法高出约40%。 466 | 467 | == 面临的挑战与问题 468 | 469 | === 技术集成挑战 470 | 471 | 在工具链集成方面,SE常用的MBSE工具(如Cameo、Rhapsody)与CS领域的IDE、版本控制、CI/CD工具等在底层架构、数据模型、API接口等方面存在显著差异。这种异构性导致工具间的无缝集成和数据共享面临巨大挑战。例如,在一个典型的开发项目中,工程师可能需要在多个工具之间频繁切换,手动同步数据,这不仅降低了工作效率,还容易引入错误。 472 | 473 | 数据格式和模型语义的不统一也是一个突出问题。跨越SE和CS领域的各类数据(需求文档、SysML/UML模型、代码、测试脚本等)格式各异,缺乏统一的语义标准和交换格式。这导致在数据转换过程中经常出现信息丢失或语义歧义,影响了系统开发的准确性和效率。 474 | 475 | 工作流程的协调也面临挑战。传统系统工程中的阶段式或V模型流程,与软件开发中的敏捷迭代、持续交付流程在节奏、周期、交付物等方面存在明显差异。如何有效协调这些流程,使其能够和谐共存并相互促进,仍是一个待解决的难题。 476 | 477 | 接口标准化的缺失进一步加剧了集成难度。尽管有OSLC等标准化尝试,但在系统内部组件接口和工具链接口方面,仍然缺乏被广泛采纳的标准规范。这增加了集成的复杂度和维护成本,也限制了不同供应商工具之间的互操作性。 478 | 479 | === 组织与文化挑战 480 | 481 | 不同专业领域的工程师之间存在明显的沟通障碍和知识壁垒。SE人员通常更关注系统整体和接口,而CS人员则更专注于具体实现和算法细节。这种思维方式和关注重点的差异,常常导致团队间的沟通不畅和相互理解困难。 482 | 483 | 传统的按专业职能划分的组织结构(如硬件部门、软件部门、测试部门)也不利于SE与CS的深度融合。这种"竖井式"结构容易导致信息孤岛,阻碍跨部门协作,使团队更倾向于追求局部优化而非全局最优。实践表明,这种组织结构下的项目协调成本往往比预期高出50%以上。 484 | 485 | 文化冲突也是一个突出问题。系统工程师通常偏好文档驱动、流程严谨、强调前期规划的工作方式,而软件工程师则更推崇代码即文档、快速迭代、拥抱变化的文化。这种文化差异如果处理不当,容易导致团队间的摩擦和效率损失。 486 | 487 | 此外,跨学科项目中产生的宝贵知识(如设计决策、经验教训、最佳实践)往往散落在不同团队和工具中,缺乏有效的知识管理与共享机制。这不仅造成知识资产的浪费,还容易导致相似错误的重复发生。 488 | 489 | == 未来研究方向展望 490 | 491 | 人工智能和机器学习技术正在深刻改变传统的系统工程工具与实践。在需求工程领域,自然语言处理技术可以自动从需求文档和用户反馈中提取结构化需求,识别潜在的歧义与冲突。实践表明,这种智能化需求分析可以提高需求质量,将需求分析效率提升40%以上。 492 | 493 | 智能模型生成与推荐系统也展现出巨大潜力。基于历史项目数据和设计模式库,AI算法可以自动生成初始系统模型、补全模型细节,或推荐合适的设计方案。这不仅加速了系统建模过程,还能帮助工程师避免常见设计错误。 494 | 495 | 在测试与验证方面,AI驱动的自动化方法正在革新传统实践。通过机器学习算法(如强化学习、遗传算法)可以自动生成更有效的测试用例,优化测试执行策略。数据显示,这种智能化测试方法可以将测试覆盖率提高30%,同时减少50%的测试执行时间。 496 | 497 | 基于AI的预测性分析与决策支持系统也变得越来越重要。通过分析历史项目数据和系统运行数据,可以准确预测项目风险、评估设计方案优劣、优化资源分配。这种数据驱动的决策支持能力,显著提升了系统工程决策的科学性和准确性。 498 | 499 | 数字孪生技术正在成为SE与CS融合的重要载体。在设计开发阶段,数字孪生支持多领域协同仿真,包括结构、热、流体、电磁、控制等方面的综合分析。这种虚拟原型验证方法可以将设计周期缩短50%,同时显著降低物理样机成本。 500 | 501 | 在制造与测试阶段,数字孪生技术实现了生产工艺的精确指导和制造过程的实时监控。通过虚拟调试和自动化测试,可以提前发现和解决潜在问题,将产品不良率降低30%以上。这种数字化转型正在重塑传统的制造和测试模式。 502 | 503 | 运行维护阶段的数字孪生应用更加广泛。通过物理实体与数字模型的实时数据同步,可以实现设备状态监控、故障预测、性能优化等智能运维功能。实践表明,这种预测性维护策略可以将设备故障停机时间减少60%,延长设备使用寿命20%以上。 504 | 505 | 构建高效的数字孪生系统需要多项关键技术支撑,包括物联网传感与数据采集、云计算与边缘计算、大数据分析、VR/AR交互等。这些技术的融合应用,正在推动数字孪生从概念验证走向规模化实践。特别是在智能制造、智慧城市等领域,数字孪生已经成为不可或缺的使能技术。 506 | 507 | = 结论 508 | 509 | 本研究深入探讨了系统工程(SE)与计算机科学(CS)的融合发展趋势及其重要意义。在现代复杂系统规模和复杂度不断攀升的背景下,推动SE与CS的深度融合已成为提升工程能力和国际竞争力的关键所在。研究表明,这种融合不仅能够有效应对当前系统开发面临的挑战,还能为未来智能化、数字化转型提供强有力的技术支撑。 510 | 511 | 通过对SE与CS核心理论的系统梳理,本文明确了两个领域的优势互补性。研究发现,SE的系统思维、结构化方法与CS的先进工具、自动化能力相结合,能够显著提升复杂系统开发的效率和质量。特别是在MBSE与敏捷开发的结合、DevOps实践的扩展以及数据驱动方法的应用等方面,已经展现出显著的实践价值。典型案例分析表明,采用融合方法的项目在开发效率、产品质量和创新能力等方面都取得了明显提升。 512 | 513 | 本研究的核心发现是:通过系统性地结合SE的全局观和CS的技术优势,可以构建更加高效、可靠的复杂系统开发方法。这种融合不仅体现在技术层面,还延伸到组织结构、管理方法和文化建设等多个维度。实践证明,这种全方位的融合策略能够有效提升系统全生命周期的管理水平和创新能力。 514 | 515 | 需要指出的是,本研究在案例选择和某些融合方法的探讨深度上还存在一定局限。未来研究可以进一步扩大案例范围,深化对特定领域融合实践的分析。尽管如此,本研究的成果对于推动SE与CS的理论发展、指导工程实践和培养复合型人才都具有重要的参考价值。相信随着融合实践的深入,将会催生出更多创新性的方法和工具,为复杂系统开发带来新的突破。 516 | 517 | 518 | // 文献引用 519 | #bib(bibfunc: bibliography("refs.bib")) 520 | 521 | #acknowledgement()[ 522 | 在论文完成之际,我怀着无比感恩的心情回顾这段求学历程。这篇论文的完成凝聚了许多人的心血与关怀,在此我要向所有给予我帮助和支持的老师、同学以及亲友致以最诚挚的谢意。 523 | 524 | 首先,我要向山东大学致以最深切的感谢。作为一所历史悠久、底蕴深厚的高等学府,山东大学为我提供了优质的学习环境和广阔的发展平台。在这里,我不仅获得了专业知识的滋养,更感受到了"为天地立心,为生民立命,为往圣继绝学,为万世开太平"的大学精神。学校包容开放的学术氛围,让我能够自由探索、勇于创新,在追求真理的道路上不断前行。 525 | 526 | 特别要感谢我的导师,在论文选题、研究方法以及论文写作等方面给予了我悉心指导。导师渊博的学识、严谨的治学态度和敏锐的学术洞察力,不仅帮助我克服了研究过程中的重重困难,更为我树立了为学为人的榜样。导师循循善诱的教导方式,既让我感受到学术研究的严肃性,又体会到师生之间的温情厚谊。 527 | 528 | 感谢实验室的老师们和同学们。在日常学习和研究工作中,他们始终以积极向上的态度感染着我,以团结互助的精神鼓舞着我。我们共同探讨学术问题,分享研究心得,互相支持鼓励。这种充满活力的学术氛围,不仅促进了我的专业成长,更让我深刻体会到团队协作的重要性。 529 | 530 | 要特别感谢计算机学院的老师们。他们渊博的专业知识、认真负责的教学态度,为我打下了扎实的理论基础。他们不仅传授知识,更注重培养我们的创新思维和实践能力,这对我的学术研究和未来发展都产生了深远的影响。 531 | 532 | 感谢参与论文评阅和答辩的专家们。他们严谨的学术态度、中肯的评价意见和建设性的修改建议,帮助我进一步完善了论文内容,提高了研究水平。 533 | 534 | 最后,要向我的家人表达最深的感激之情。他们始终是我坚强的后盾,在我遇到困难时给予鼓励和支持,在我取得成绩时分享喜悦。他们的理解和支持,让我能够专心致志地投入学习和研究。 535 | 536 | 在此,我再次向所有关心、帮助过我的老师、同学和亲友表示衷心的感谢。这段求学经历必将成为我人生中最宝贵的财富,激励我在未来的道路上继续追求卓越,回报社会。 537 | 538 | ] 539 | 540 | 541 | #show: appendix 542 | 543 | = 附#h(2em)录 544 | 545 | 略。 -------------------------------------------------------------------------------- /gui/web/images/recommended_reference_line_plot.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 2025-04-19T17:20:42.754992 10 | image/svg+xml 11 | 12 | 13 | Matplotlib v3.10.1, https://matplotlib.org/ 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 82 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 347 | 372 | 402 | 428 | 445 | 478 | 499 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 542 | 543 | 544 | 545 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 671 | 692 | 713 | 744 | 745 | 758 | 805 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 863 | 864 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 912 | 913 | 914 | 917 | 918 | 919 | 922 | 923 | 924 | 927 | 928 | 929 | 930 | 931 | 932 | 960 | 979 | 1005 | 1026 | 1036 | 1045 | 1058 | 1079 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1158 | 1159 | 1160 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1198 | 1199 | 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | --------------------------------------------------------------------------------