<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>落夜的博客</title>
  
  
  <link href="https://fallingnight.com/atom.xml" rel="self"/>
  
  <link href="https://fallingnight.com/"/>
  <updated>2026-04-07T19:45:29.627Z</updated>
  <id>https://fallingnight.com/</id>
  
  <author>
    <name>落夜织寒</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>mac右键创建新文件的方法(无第三方插件)</title>
    <link href="https://fallingnight.com/2026/04/08/mac%E5%8F%B3%E9%94%AE%E5%88%9B%E5%BB%BA%E6%96%B0%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95-%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8F%92%E4%BB%B6/"/>
    <id>https://fallingnight.com/2026/04/08/mac%E5%8F%B3%E9%94%AE%E5%88%9B%E5%BB%BA%E6%96%B0%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95-%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8F%92%E4%BB%B6/</id>
    <published>2026-04-07T19:40:51.000Z</published>
    <updated>2026-04-07T19:45:29.627Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/blog/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/blog/assets/js/APlayer.m</summary>
      
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="mac" scheme="https://fallingnight.com/tags/mac/"/>
    
    <category term="workflow" scheme="https://fallingnight.com/tags/workflow/"/>
    
  </entry>
  
  <entry>
    <title>B站视频下载平台说明文档</title>
    <link href="https://fallingnight.com/2026/04/08/B%E7%AB%99%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%B9%B3%E5%8F%B0%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/"/>
    <id>https://fallingnight.com/2026/04/08/B%E7%AB%99%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%B9%B3%E5%8F%B0%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/</id>
    <published>2026-04-07T19:38:32.000Z</published>
    <updated>2026-04-07T19:44:03.029Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
      
      
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/blog/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/blog/assets/js/APlayer.m</summary>
      
    
    
    
    <category term="说明文档" scheme="https://fallingnight.com/categories/%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="bilibili" scheme="https://fallingnight.com/tags/bilibili/"/>
    
  </entry>
  
  <entry>
    <title>从零实现 AlphaZero 风格的五子棋 AI</title>
    <link href="https://fallingnight.com/2026/01/20/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-AlphaZero-%E9%A3%8E%E6%A0%BC%E7%9A%84%E4%BA%94%E5%AD%90%E6%A3%8B-AI/"/>
    <id>https://fallingnight.com/2026/01/20/%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0-AlphaZero-%E9%A3%8E%E6%A0%BC%E7%9A%84%E4%BA%94%E5%AD%90%E6%A3%8B-AI/</id>
    <published>2026-01-19T20:29:06.000Z</published>
    <updated>2026-01-19T21:44:57.943Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>本文详细介绍如何结合蒙特卡罗树搜索（MCTS）与深度残差网络，从零实现一个能够通过自我对弈持续提升棋力的五子棋AI 系统。</p></blockquote><h1 id="项目概述">项目概述</h1><p>本项目是一个基于 AlphaZero 思想实现的五子棋 AI 系统。与传统的博弈AI（如 Minimax + Alpha-Beta剪枝）不同，本系统不依赖人类专家知识或手工设计的评估函数，而是让 AI通过<strong>自我对弈</strong>从零开始学习五子棋策略。</p><span id="more"></span><h2 id="项目特点">项目特点</h2><table><thead><tr><th>特性</th><th>说明</th></tr></thead><tbody><tr><td>🎮 <strong>AlphaZero 风格</strong></td><td>结合 MCTS 与深度神经网络，实现端到端学习</td></tr><tr><td>🔄 <strong>自我对弈训练</strong></td><td>无需人类棋谱，从零开始自我博弈提升棋力</td></tr><tr><td>🌐 <strong>现代 Web 界面</strong></td><td>Vue 3 + TypeScript 前端，支持人机对弈</td></tr><tr><td>⚡ <strong>多进程加速</strong></td><td>支持多进程并行自对弈，大幅提升训练效率</td></tr><tr><td>📊 <strong>训练可视化</strong></td><td>自动记录训练过程，生成损失曲线和胜率图表</td></tr></tbody></table><h2 id="技术栈">技术栈</h2><p><strong>后端：</strong> Python 3.10+ / PyTorch 2.1.0 / FastAPI0.104.1</p><p><strong>前端：</strong> Vue 3.3 / TypeScript 5.3 / Vite 5.0 / Pinia2.1</p><hr /><h1 id="核心原理">核心原理</h1><h2 id="alphazero-算法思想">AlphaZero 算法思想</h2><p>2017年，DeepMind 发布了AlphaZero，仅通过自我对弈就在围棋、国际象棋、日本将棋上超越了所有前任冠军程序。其核心思想包括：</p><ol type="1"><li><strong>深度神经网络</strong>：用一个网络同时预测当前局面的<strong>价值</strong>（谁更可能赢）和<strong>策略</strong>（下一步应该走哪里）</li><li><strong>蒙特卡罗树搜索</strong>：利用神经网络的预测来指导搜索，而非传统的随机模拟</li><li><strong>自我对弈</strong>：AI与自己对弈产生训练数据，不断迭代提升</li></ol><pre class="line-numbers language-none"><code class="language-none">┌────────────────────────────────────────────────────────────┐│                    AlphaZero 训练循环                       ││                                                            ││   ┌─────────┐     ┌─────────┐     ┌─────────┐            ││   │  自我对弈 │ ──▶ │ 收集数据 │ ──▶ │ 训练网络 │ ──┐       ││   └─────────┘     └─────────┘     └─────────┘   │        ││        ▲                                          │        ││        └──────────────────────────────────────────┘        ││                        更新模型                             │└────────────────────────────────────────────────────────────┘<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="蒙特卡罗树搜索-mcts">蒙特卡罗树搜索 (MCTS)</h2><p>MCTS 是一种启发式搜索算法，通过模拟来评估局面的好坏。AlphaZero使用神经网络改进了传统 MCTS：</p><h3 id="四个阶段">四个阶段</h3><pre class="line-numbers language-none"><code class="language-none">选择 (Selection)          扩展 (Expansion)     │                         │     ▼                         ▼┌─────────┐               ┌─────────┐│  根节点  │               │ 新节点   ││    ●    │──────────────▶│    ○    ││   &#x2F; \   │               │         ││  ●   ●  │               └─────────┘└─────────┘                    │                               ▼回溯 (Backpropagation)    评估 (Evaluation)     │                         │     ▼                         ▼┌─────────┐               ┌─────────┐│ 更新统计 │               │神经网络  ││  V, N   │◀──────────────│ (P, V)  ││ 向上传播 │               │         │└─────────┘               └─────────┘<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><ol type="1"><li><strong>选择 (Selection)</strong>：从根节点开始，根据 UCB公式选择子节点，直到到达叶子节点</li><li><strong>扩展 (Expansion)</strong>：在叶子节点扩展可能的子节点</li><li><strong>评估(Evaluation)</strong>：使用神经网络评估新节点的价值</li><li><strong>回溯(Backpropagation)</strong>：将评估结果向上传播，更新路径上所有节点的统计信息</li></ol><h3 id="ucb-公式">UCB 公式</h3><p>节点选择使用 PUCT (Predictor Upper Confidence bounds applied toTrees) 公式：</p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>U</mi><mi>C</mi><mi>B</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mi>Q</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>c</mi><mrow><mi>p</mi><mi>u</mi><mi>c</mi><mi>t</mi></mrow></msub><mo>⋅</mo><mi>P</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo><mo>⋅</mo><mfrac><msqrt><mrow><munder><mo>∑</mo><mi>b</mi></munder><mi>N</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>b</mi><mo stretchy="false">)</mo></mrow></msqrt><mrow><mn>1</mn><mo>+</mo><mi>N</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">UCB(s, a) = Q(s, a) + c_{puct} \cdot P(s, a) \cdot \frac{\sqrt{\sum_{b} N(s, b)}}{1 + N(s, a)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span><span class="mord mathnormal" style="margin-right:0.05017em;">CB</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">Q</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7306em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.566em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.63em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.7199em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9101em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1864em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span><span style="top:-2.8701em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3299em;"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span><p>其中： - <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Q(s, a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">Q</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span>：动作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 的平均价值（累计价值 /访问次数） - <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(s, a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span>：策略网络给出的先验概率 -<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo stretchy="false">(</mo><mi>s</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">N(s, a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span>：动作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 的访问次数 -<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mrow><mi>p</mi><mi>u</mi><mi>c</mi><mi>t</mi></mrow></msub></mrow><annotation encoding="application/x-tex">c_{puct}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>：探索常数（本项目使用 0.8）</p><p>这个公式巧妙地平衡了<strong>利用</strong>（选择高价值动作）和<strong>探索</strong>（尝试访问较少的动作）。</p><h3 id="dirichlet-噪声">Dirichlet 噪声</h3><p>为了增加探索性，训练时在根节点添加 Dirichlet 噪声：</p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>P</mi><mrow><mi>r</mi><mi>o</mi><mi>o</mi><mi>t</mi></mrow></msub><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ϵ</mi><mo stretchy="false">)</mo><mo>⋅</mo><mi>P</mi><mo stretchy="false">(</mo><mi>a</mi><mo stretchy="false">)</mo><mo>+</mo><mi>ϵ</mi><mo>⋅</mo><mi>D</mi><mi>i</mi><mi>r</mi><mo stretchy="false">(</mo><mi>α</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P_{root}(a) = (1 - \epsilon) \cdot P(a) + \epsilon \cdot Dir(\alpha)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">roo</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">ϵ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord mathnormal">ϵ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mclose">)</span></span></span></span></span><p>本项目使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϵ</mi><mo>=</mo><mn>0.01</mn></mrow><annotation encoding="application/x-tex">\epsilon = 0.01</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">ϵ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.01</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi><mo>=</mo><mn>0.3</mn></mrow><annotation encoding="application/x-tex">\alpha = 0.3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.3</span></span></span></span>。</p><h2 id="策略价值网络">策略价值网络</h2><p>网络采用<strong>双头架构</strong>，共享特征提取层，分别输出策略和价值：</p><pre class="line-numbers language-none"><code class="language-none">输入: (batch, 3, 15, 15)  ├── 通道0: 当前玩家棋子位置  ├── 通道1: 对手棋子位置  └── 通道2: 空位位置        │        ▼┌─────────────────────────────────┐│  Conv2d(3→32, 3×3) + BN + ReLU  │  初始卷积层└─────────────────────────────────┘        │        ▼┌─────────────────────────────────┐│        ResBlock × 5             │  5个残差块│  ┌─────────────────────────┐    ││  │ Conv(32,32) → BN → ReLU │    ││  │ Conv(32,32) → BN        │    ││  │      + skip connection  │    ││  └─────────────────────────┘    │└─────────────────────────────────┘        │        ├───────────────────────────┐        ▼                           ▼┌─────────────────┐         ┌─────────────────┐│     价值头       │         │     策略头       ││   Conv(32→1)    │         │  Conv(32→16)    ││   Flatten       │         │  Conv(16→1)     ││   Linear(128)   │         │  Flatten        ││   Linear(1)     │         │  Softmax        ││   Tanh          │         │                 │└─────────────────┘         └─────────────────┘        │                           │        ▼                           ▼  局面价值 ∈ [-1, 1]        落子概率 ∈ [0, 1]^225<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr /><h1 id="系统架构">系统架构</h1><pre class="line-numbers language-none"><code class="language-none">Gomoku-AI&#x2F;├── backend&#x2F;                    # 后端服务│   ├── main.py                 # FastAPI 入口│   ├── game&#x2F;│   │   └── board.py            # 棋盘逻辑│   ├── ai&#x2F;│   │   ├── network.py          # 神经网络定义│   │   ├── mcts.py             # MCTS 算法│   │   └── train.py            # 训练脚本│   └── models&#x2F;│       └── best_model.pth      # 训练好的模型│├── frontend&#x2F;                   # Vue 前端│   └── src&#x2F;│       ├── components&#x2F;         # 组件 (棋盘、控制面板等)│       ├── stores&#x2F;             # Pinia 状态管理│       └── api&#x2F;                # API 调用│└── deploy&#x2F;                     # 部署配置    ├── deploy.sh    └── nginx.conf<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="前后端交互流程">前后端交互流程</h2><pre class="line-numbers language-none"><code class="language-none">┌─────────────┐                    ┌─────────────┐│   前端 Vue   │                    │  后端 FastAPI ││             │                    │             ││  1. 点击落子 │ ─── POST &#x2F;move ──▶ │             ││             │                    │  2. 执行MCTS ││             │                    │     搜索     ││  4. 显示结果 │ ◀── AI落子+胜率 ─── │  3. 返回结果 ││             │                    │             │└─────────────┘                    └─────────────┘<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr /><h1 id="代码实现详解">代码实现详解</h1><h2 id="神经网络设计">神经网络设计</h2><h3 id="残差块">残差块</h3><p>残差连接使得网络可以更深，同时避免梯度消失：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">ResidualBlock</span><span class="token punctuation">(</span>nn<span class="token punctuation">.</span>Module<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""残差块"""</span>        <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> channels<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token builtin">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>conv1 <span class="token operator">=</span> nn<span class="token punctuation">.</span>Conv2d<span class="token punctuation">(</span>channels<span class="token punctuation">,</span> channels<span class="token punctuation">,</span> kernel_size<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">,</span> padding<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>bn1 <span class="token operator">=</span> nn<span class="token punctuation">.</span>BatchNorm2d<span class="token punctuation">(</span>channels<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>conv2 <span class="token operator">=</span> nn<span class="token punctuation">.</span>Conv2d<span class="token punctuation">(</span>channels<span class="token punctuation">,</span> channels<span class="token punctuation">,</span> kernel_size<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">,</span> padding<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>bn2 <span class="token operator">=</span> nn<span class="token punctuation">.</span>BatchNorm2d<span class="token punctuation">(</span>channels<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>relu <span class="token operator">=</span> nn<span class="token punctuation">.</span>ReLU<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">forward</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">:</span> torch<span class="token punctuation">.</span>Tensor<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> torch<span class="token punctuation">.</span>Tensor<span class="token punctuation">:</span>        residual <span class="token operator">=</span> x        out <span class="token operator">=</span> self<span class="token punctuation">.</span>relu<span class="token punctuation">(</span>self<span class="token punctuation">.</span>bn1<span class="token punctuation">(</span>self<span class="token punctuation">.</span>conv1<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        out <span class="token operator">=</span> self<span class="token punctuation">.</span>bn2<span class="token punctuation">(</span>self<span class="token punctuation">.</span>conv2<span class="token punctuation">(</span>out<span class="token punctuation">)</span><span class="token punctuation">)</span>        out <span class="token operator">+=</span> residual  <span class="token comment"># 残差连接</span>        out <span class="token operator">=</span> self<span class="token punctuation">.</span>relu<span class="token punctuation">(</span>out<span class="token punctuation">)</span>        <span class="token keyword">return</span> out<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="策略价值网络-1">策略价值网络</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">PolicyValueNetwork</span><span class="token punctuation">(</span>nn<span class="token punctuation">.</span>Module<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""策略-价值网络"""</span>        <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> in_channels<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">,</span> hidden_channels<span class="token operator">=</span><span class="token number">32</span><span class="token punctuation">,</span> num_blocks<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token builtin">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>                <span class="token comment"># 初始卷积层</span>        self<span class="token punctuation">.</span>conv_init <span class="token operator">=</span> nn<span class="token punctuation">.</span>Conv2d<span class="token punctuation">(</span>in_channels<span class="token punctuation">,</span> hidden_channels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> padding<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>bn_init <span class="token operator">=</span> nn<span class="token punctuation">.</span>BatchNorm2d<span class="token punctuation">(</span>hidden_channels<span class="token punctuation">)</span>                <span class="token comment"># 残差块</span>        self<span class="token punctuation">.</span>res_blocks <span class="token operator">=</span> nn<span class="token punctuation">.</span>ModuleList<span class="token punctuation">(</span><span class="token punctuation">[</span>            ResidualBlock<span class="token punctuation">(</span>hidden_channels<span class="token punctuation">)</span> <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>num_blocks<span class="token punctuation">)</span>        <span class="token punctuation">]</span><span class="token punctuation">)</span>                <span class="token comment"># 策略头：输出每个位置的落子概率</span>        self<span class="token punctuation">.</span>policy_conv <span class="token operator">=</span> nn<span class="token punctuation">.</span>Conv2d<span class="token punctuation">(</span>hidden_channels<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> kernel_size<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">,</span> padding<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>                <span class="token comment"># 价值头：输出当前局面的胜率评估</span>        self<span class="token punctuation">.</span>value_conv <span class="token operator">=</span> nn<span class="token punctuation">.</span>Conv2d<span class="token punctuation">(</span>hidden_channels<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> kernel_size<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>value_fc1 <span class="token operator">=</span> nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">225</span><span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>value_fc2 <span class="token operator">=</span> nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">128</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">forward</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token comment"># 特征提取</span>        x <span class="token operator">=</span> F<span class="token punctuation">.</span>relu<span class="token punctuation">(</span>self<span class="token punctuation">.</span>bn_init<span class="token punctuation">(</span>self<span class="token punctuation">.</span>conv_init<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> block <span class="token keyword">in</span> self<span class="token punctuation">.</span>res_blocks<span class="token punctuation">:</span>            x <span class="token operator">=</span> block<span class="token punctuation">(</span>x<span class="token punctuation">)</span>                <span class="token comment"># 策略头</span>        policy <span class="token operator">=</span> self<span class="token punctuation">.</span>policy_conv<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">.</span>view<span class="token punctuation">(</span>x<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>                <span class="token comment"># 价值头</span>        value <span class="token operator">=</span> F<span class="token punctuation">.</span>relu<span class="token punctuation">(</span>self<span class="token punctuation">.</span>value_conv<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>view<span class="token punctuation">(</span>x<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        value <span class="token operator">=</span> torch<span class="token punctuation">.</span>tanh<span class="token punctuation">(</span>self<span class="token punctuation">.</span>value_fc2<span class="token punctuation">(</span>F<span class="token punctuation">.</span>relu<span class="token punctuation">(</span>self<span class="token punctuation">.</span>value_fc1<span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                <span class="token keyword">return</span> value<span class="token punctuation">,</span> policy<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="棋盘状态编码">棋盘状态编码</h3><p>将棋盘转换为神经网络输入的三通道张量：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">board_to_tensor</span><span class="token punctuation">(</span>board<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> torch<span class="token punctuation">.</span>Tensor<span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""    将棋盘转换为神经网络输入        输入 board: 15x15 矩阵，1=当前方，-1=对方，0=空    输出: (3, 15, 15) 张量    """</span>    board_arr <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>board<span class="token punctuation">)</span>        current_player <span class="token operator">=</span> <span class="token punctuation">(</span>board_arr <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span>np<span class="token punctuation">.</span>float32<span class="token punctuation">)</span>   <span class="token comment"># 当前玩家棋子</span>    opponent <span class="token operator">=</span> <span class="token punctuation">(</span>board_arr <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span>np<span class="token punctuation">.</span>float32<span class="token punctuation">)</span>        <span class="token comment"># 对手棋子</span>    empty <span class="token operator">=</span> <span class="token punctuation">(</span>board_arr <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span>np<span class="token punctuation">.</span>float32<span class="token punctuation">)</span>            <span class="token comment"># 空位</span>        <span class="token keyword">return</span> torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">(</span>np<span class="token punctuation">.</span>stack<span class="token punctuation">(</span><span class="token punctuation">[</span>current_player<span class="token punctuation">,</span> opponent<span class="token punctuation">,</span> empty<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="mcts-实现">MCTS 实现</h2><h3 id="节点定义">节点定义</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">Node</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""MCTS 树节点"""</span>        <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> board<span class="token punctuation">,</span> parent<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">,</span> move<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        self<span class="token punctuation">.</span>board <span class="token operator">=</span> board           <span class="token comment"># 当前局面</span>        self<span class="token punctuation">.</span>parent <span class="token operator">=</span> parent         <span class="token comment"># 父节点</span>        self<span class="token punctuation">.</span>move <span class="token operator">=</span> move             <span class="token comment"># 到达该节点的动作</span>        self<span class="token punctuation">.</span>children <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>           <span class="token comment"># 子节点字典 &#123;move: (child, prior)&#125;</span>        self<span class="token punctuation">.</span>visit_count <span class="token operator">=</span> <span class="token number">0</span>         <span class="token comment"># 访问次数 N</span>        self<span class="token punctuation">.</span>value_sum <span class="token operator">=</span> <span class="token number">0.0</span>         <span class="token comment"># 累计价值 W</span>        self<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token boolean">None</span>            <span class="token comment"># 神经网络评估值</span>        <span class="token decorator annotation punctuation">@property</span>    <span class="token keyword">def</span> <span class="token function">q_value</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token triple-quoted-string string">"""平均价值 Q = W / N"""</span>        <span class="token keyword">if</span> self<span class="token punctuation">.</span>visit_count <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>            <span class="token keyword">return</span> <span class="token number">0.0</span>        <span class="token keyword">return</span> self<span class="token punctuation">.</span>value_sum <span class="token operator">/</span> self<span class="token punctuation">.</span>visit_count<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="ucb-子节点选择">UCB 子节点选择</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">_select_child</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> node<span class="token punctuation">:</span> Node<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Node<span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""根据 UCB 公式选择子节点"""</span>    total_visits <span class="token operator">=</span> <span class="token builtin">sum</span><span class="token punctuation">(</span>        <span class="token punctuation">(</span>child<span class="token punctuation">.</span>visit_count <span class="token keyword">if</span> child <span class="token keyword">else</span> <span class="token number">0</span><span class="token punctuation">)</span>         <span class="token keyword">for</span> child<span class="token punctuation">,</span> _ <span class="token keyword">in</span> node<span class="token punctuation">.</span>children<span class="token punctuation">.</span>values<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token punctuation">)</span>    sqrt_total <span class="token operator">=</span> math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>total_visits <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>        best_score <span class="token operator">=</span> <span class="token operator">-</span><span class="token builtin">float</span><span class="token punctuation">(</span><span class="token string">'inf'</span><span class="token punctuation">)</span>    best_move <span class="token operator">=</span> <span class="token boolean">None</span>        <span class="token keyword">for</span> move<span class="token punctuation">,</span> <span class="token punctuation">(</span>child<span class="token punctuation">,</span> prior<span class="token punctuation">)</span> <span class="token keyword">in</span> node<span class="token punctuation">.</span>children<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">if</span> child <span class="token keyword">and</span> child<span class="token punctuation">.</span>visit_count <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">:</span>            <span class="token comment"># 已访问节点：使用实际 Q 值</span>            exploit <span class="token operator">=</span> child<span class="token punctuation">.</span>q_value            explore <span class="token operator">=</span> self<span class="token punctuation">.</span>c_puct <span class="token operator">*</span> prior <span class="token operator">*</span> sqrt_total <span class="token operator">/</span> <span class="token punctuation">(</span>child<span class="token punctuation">.</span>visit_count <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            <span class="token comment"># 未访问节点：使用平均值估计</span>            exploit <span class="token operator">=</span> avg_value            explore <span class="token operator">=</span> self<span class="token punctuation">.</span>c_puct <span class="token operator">*</span> prior <span class="token operator">*</span> sqrt_total                score <span class="token operator">=</span> explore <span class="token operator">-</span> exploit  <span class="token comment"># 注意：这里取负是因为子节点视角相反</span>        <span class="token keyword">if</span> score <span class="token operator">></span> best_score<span class="token punctuation">:</span>            best_score <span class="token operator">=</span> score            best_move <span class="token operator">=</span> move        <span class="token keyword">return</span> self<span class="token punctuation">.</span>_get_or_create_child<span class="token punctuation">(</span>node<span class="token punctuation">,</span> best_move<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="完整搜索流程">完整搜索流程</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">search</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> root_board<span class="token punctuation">,</span> num_simulations<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""执行 MCTS 搜索"""</span>    root <span class="token operator">=</span> Node<span class="token punctuation">(</span>root_board<span class="token punctuation">)</span>        <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>num_simulations<span class="token punctuation">)</span><span class="token punctuation">:</span>        node <span class="token operator">=</span> root        search_path <span class="token operator">=</span> <span class="token punctuation">[</span>node<span class="token punctuation">]</span>                <span class="token comment"># 1. 选择：沿树下降到叶子节点</span>        <span class="token keyword">while</span> node<span class="token punctuation">.</span>children<span class="token punctuation">:</span>            node <span class="token operator">=</span> self<span class="token punctuation">.</span>_select_child<span class="token punctuation">(</span>node<span class="token punctuation">)</span>            search_path<span class="token punctuation">.</span>append<span class="token punctuation">(</span>node<span class="token punctuation">)</span>                <span class="token comment"># 2. 扩展与评估</span>        <span class="token keyword">if</span> <span class="token keyword">not</span> self<span class="token punctuation">.</span>_is_terminal<span class="token punctuation">(</span>node<span class="token punctuation">.</span>board<span class="token punctuation">)</span><span class="token punctuation">:</span>            self<span class="token punctuation">.</span>_expand_node<span class="token punctuation">(</span>node<span class="token punctuation">)</span>  <span class="token comment"># 使用神经网络扩展</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            node<span class="token punctuation">.</span>value <span class="token operator">=</span> self<span class="token punctuation">.</span>_evaluate_terminal<span class="token punctuation">(</span>node<span class="token punctuation">.</span>board<span class="token punctuation">)</span>                <span class="token comment"># 3. 回溯：更新路径上所有节点</span>        value <span class="token operator">=</span> node<span class="token punctuation">.</span>value        <span class="token keyword">for</span> n <span class="token keyword">in</span> <span class="token builtin">reversed</span><span class="token punctuation">(</span>search_path<span class="token punctuation">)</span><span class="token punctuation">:</span>            n<span class="token punctuation">.</span>visit_count <span class="token operator">+=</span> <span class="token number">1</span>            n<span class="token punctuation">.</span>value_sum <span class="token operator">+=</span> value            value <span class="token operator">=</span> <span class="token operator">-</span>value  <span class="token comment"># 翻转视角</span>        <span class="token keyword">return</span> self<span class="token punctuation">.</span>_get_results<span class="token punctuation">(</span>root<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="自我对弈训练">自我对弈训练</h2><h3 id="训练数据生成">训练数据生成</h3><p>每局自对弈结束后，收集所有经历的局面作为训练数据：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">generate_single_game</span><span class="token punctuation">(</span>model_state_dict<span class="token punctuation">,</span> num_simulations<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""生成单局自对弈数据"""</span>    model <span class="token operator">=</span> PolicyValueNetwork<span class="token punctuation">(</span><span class="token punctuation">)</span>    model<span class="token punctuation">.</span>load_state_dict<span class="token punctuation">(</span>model_state_dict<span class="token punctuation">)</span>        board <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">15</span> <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">]</span>    mcts <span class="token operator">=</span> MCTS<span class="token punctuation">(</span>model<span class="token operator">=</span>model<span class="token punctuation">)</span>        <span class="token keyword">for</span> move_num <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">225</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token comment"># MCTS 搜索</span>        <span class="token punctuation">(</span>value<span class="token punctuation">,</span> action_probs<span class="token punctuation">)</span><span class="token punctuation">,</span> root <span class="token operator">=</span> mcts<span class="token punctuation">.</span>search<span class="token punctuation">(</span>board<span class="token punctuation">,</span> num_simulations<span class="token punctuation">)</span>                <span class="token comment"># 根据概率选择动作</span>        action <span class="token operator">=</span> select_action<span class="token punctuation">(</span>action_probs<span class="token punctuation">,</span> temperature<span class="token operator">=</span><span class="token number">0.1</span><span class="token punctuation">)</span>        x<span class="token punctuation">,</span> y <span class="token operator">=</span> action        board<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>y<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span>                <span class="token keyword">if</span> is_game_over<span class="token punctuation">(</span>board<span class="token punctuation">)</span><span class="token punctuation">:</span>            <span class="token keyword">break</span>                <span class="token comment"># 翻转视角（双方交替）</span>        flip_board<span class="token punctuation">(</span>board<span class="token punctuation">)</span>        <span class="token comment"># 返回训练数据：(局面, 策略, 价值)</span>    <span class="token keyword">return</span> mcts<span class="token punctuation">.</span>get_train_data<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="数据增强">数据增强</h3><p>五子棋棋盘具有 D4 对称性（4次旋转 × 2次翻转 = 8倍数据增强）：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">augment_data</span><span class="token punctuation">(</span>boards<span class="token punctuation">,</span> policies<span class="token punctuation">,</span> values<span class="token punctuation">,</span> weights<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""D4 对称变换数据增强"""</span>    augmented <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>        <span class="token keyword">for</span> board<span class="token punctuation">,</span> policy<span class="token punctuation">,</span> value<span class="token punctuation">,</span> weight <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>boards<span class="token punctuation">,</span> policies<span class="token punctuation">,</span> values<span class="token punctuation">,</span> weights<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment"># 0°, 90°, 180°, 270° 旋转</span>            <span class="token keyword">for</span> flip <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token boolean">False</span><span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">]</span><span class="token punctuation">:</span>  <span class="token comment"># 是否水平翻转</span>                new_board <span class="token operator">=</span> torch<span class="token punctuation">.</span>rot90<span class="token punctuation">(</span>board<span class="token punctuation">,</span> k<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                new_policy <span class="token operator">=</span> torch<span class="token punctuation">.</span>rot90<span class="token punctuation">(</span>policy<span class="token punctuation">,</span> k<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                                <span class="token keyword">if</span> flip<span class="token punctuation">:</span>                    new_board <span class="token operator">=</span> torch<span class="token punctuation">.</span>flip<span class="token punctuation">(</span>new_board<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                    new_policy <span class="token operator">=</span> torch<span class="token punctuation">.</span>flip<span class="token punctuation">(</span>new_policy<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                                augmented<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token punctuation">(</span>new_board<span class="token punctuation">,</span> new_policy<span class="token punctuation">,</span> value<span class="token punctuation">,</span> weight<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> augmented<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="训练损失函数">训练损失函数</h3><p>使用组合损失：价值损失（MSE）+ 策略损失（KL散度）</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">train_step</span><span class="token punctuation">(</span>model<span class="token punctuation">,</span> batch<span class="token punctuation">)</span><span class="token punctuation">:</span>    boards<span class="token punctuation">,</span> target_policies<span class="token punctuation">,</span> target_values <span class="token operator">=</span> batch        pred_values<span class="token punctuation">,</span> pred_policies <span class="token operator">=</span> model<span class="token punctuation">(</span>boards<span class="token punctuation">)</span>        <span class="token comment"># 价值损失：均方误差</span>    value_loss <span class="token operator">=</span> F<span class="token punctuation">.</span>mse_loss<span class="token punctuation">(</span>pred_values<span class="token punctuation">,</span> target_values<span class="token punctuation">)</span>        <span class="token comment"># 策略损失：KL散度</span>    policy_loss <span class="token operator">=</span> F<span class="token punctuation">.</span>kl_div<span class="token punctuation">(</span>        F<span class="token punctuation">.</span>log_softmax<span class="token punctuation">(</span>pred_policies<span class="token punctuation">,</span> dim<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        target_policies<span class="token punctuation">,</span>        reduction<span class="token operator">=</span><span class="token string">'batchmean'</span>    <span class="token punctuation">)</span>        <span class="token comment"># 总损失（价值损失权重更高）</span>    total_loss <span class="token operator">=</span> <span class="token number">2</span> <span class="token operator">*</span> value_loss <span class="token operator">+</span> policy_loss        <span class="token keyword">return</span> total_loss<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="模型选择策略">模型选择策略</h3><p>采用 AlphaZero 风格的模型选择，确保模型持续进步：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">evaluate_and_update</span><span class="token punctuation">(</span>new_model<span class="token punctuation">,</span> best_model<span class="token punctuation">,</span> num_games<span class="token operator">=</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""评估新模型并决定是否更新"""</span>    wins <span class="token operator">=</span> <span class="token number">0</span>        <span class="token keyword">for</span> game <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>num_games<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token comment"># 新模型 vs 最佳模型对弈</span>        winner <span class="token operator">=</span> play_game<span class="token punctuation">(</span>new_model<span class="token punctuation">,</span> best_model<span class="token punctuation">)</span>        <span class="token keyword">if</span> winner <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span>  <span class="token comment"># 新模型获胜</span>            wins <span class="token operator">+=</span> <span class="token number">1</span>        win_rate <span class="token operator">=</span> wins <span class="token operator">/</span> num_games        <span class="token comment"># 胜率超过 55% 才更新最佳模型</span>    <span class="token keyword">if</span> win_rate <span class="token operator">></span> <span class="token number">0.55</span><span class="token punctuation">:</span>        save_model<span class="token punctuation">(</span>new_model<span class="token punctuation">,</span> <span class="token string">'best_model.pth'</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> <span class="token boolean">True</span>    <span class="token keyword">return</span> <span class="token boolean">False</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr /><h1 id="项目部署与使用">项目部署与使用</h1><h2 id="环境配置">环境配置</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 1. 克隆项目</span><span class="token function">git</span> clone https://github.com/fallingnight131/Gomoku-AI.git<span class="token builtin class-name">cd</span> Gomoku-AI<span class="token comment"># 2. 创建 Conda 环境</span>conda create <span class="token parameter variable">-n</span> gomoku <span class="token assign-left variable">python</span><span class="token operator">=</span><span class="token number">3.10</span> <span class="token parameter variable">-y</span>conda activate gomoku<span class="token comment"># 3. 安装后端依赖</span><span class="token builtin class-name">cd</span> backendpip <span class="token function">install</span> <span class="token parameter variable">-r</span> requirements.txt<span class="token comment"># 4. 安装前端依赖</span><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/frontend<span class="token function">npm</span> <span class="token function">install</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="启动服务">启动服务</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 终端1：启动后端</span><span class="token builtin class-name">cd</span> backenduvicorn main:app <span class="token parameter variable">--reload</span> <span class="token parameter variable">--host</span> <span class="token number">0.0</span>.0.0 <span class="token parameter variable">--port</span> <span class="token number">8000</span><span class="token comment"># 终端2：启动前端</span><span class="token builtin class-name">cd</span> frontend<span class="token function">npm</span> run dev<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>访问 http://localhost:5173 开始游戏！</p><h2 id="训练模型">训练模型</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> backend<span class="token comment"># 快速测试（5-10分钟）</span>python <span class="token parameter variable">-m</span> ai.train <span class="token parameter variable">-n</span> <span class="token number">5</span> <span class="token parameter variable">--samples</span> <span class="token number">10</span> <span class="token parameter variable">--simulations</span> <span class="token number">30</span> <span class="token parameter variable">--workers</span> <span class="token number">4</span><span class="token comment"># 标准训练（2-4小时）</span>python <span class="token parameter variable">-m</span> ai.train <span class="token parameter variable">-n</span> <span class="token number">50</span> <span class="token parameter variable">--samples</span> <span class="token number">100</span> <span class="token parameter variable">--simulations</span> <span class="token number">30</span> <span class="token parameter variable">--workers</span> <span class="token number">10</span><span class="token comment"># 完整训练（8-24小时）</span>python <span class="token parameter variable">-m</span> ai.train <span class="token parameter variable">-n</span> <span class="token number">200</span> <span class="token parameter variable">--samples</span> <span class="token number">100</span> <span class="token parameter variable">--simulations</span> <span class="token number">30</span> <span class="token parameter variable">--workers</span> <span class="token number">10</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="训练参数说明">训练参数说明</h2><table><thead><tr><th>参数</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>-n, --iterations</code></td><td>100</td><td>训练迭代次数</td></tr><tr><td><code>--samples</code></td><td>100</td><td>每轮自对弈局数</td></tr><tr><td><code>--simulations</code></td><td>30</td><td>训练时 MCTS 模拟次数</td></tr><tr><td><code>--workers</code></td><td>10</td><td>并行进程数</td></tr><tr><td><code>--eval-interval</code></td><td>10</td><td>评估间隔</td></tr><tr><td><code>--win-threshold</code></td><td>0.55</td><td>更新最佳模型的胜率阈值</td></tr></tbody></table><hr /><h1 id="参考资料">参考资料</h1><ol type="1"><li><a href="https://www.nature.com/articles/nature24270">Mastering theGame of Go without Human Knowledge</a> - AlphaGo Zero 论文</li><li><a href="https://arxiv.org/abs/1712.01815">Mastering Chess and Shogiby Self-Play</a> - AlphaZero 论文</li><li><ahref="https://en.wikipedia.org/wiki/Monte_Carlo_tree_search">Monte CarloTree Search</a> - 蒙特卡罗树搜索介绍</li><li><a href="https://arxiv.org/abs/1512.03385">Deep ResidualLearning</a> - ResNet 论文</li></ol><hr /><p><strong>代码仓库：</strong> <ahref="https://github.com/fallingnight131/Gomoku-AI">GitHub -Gomoku-AI</a></p><p><strong>临时部署：</strong> <ahref="https://fallingnight.cn/">五子棋AI</a></p><p>如果这篇文章对你有帮助，欢迎 Star ⭐ 支持！</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;本文详细介绍如何结合蒙特卡罗树搜索（MCTS）与深度残差网络，从零实现一个能够通过自我对弈持续提升棋力的五子棋
AI 系统。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;项目概述&quot;&gt;项目概述&lt;/h1&gt;
&lt;p&gt;本项目是一个基于 AlphaZero 思想实现的五子棋 AI 系统。与传统的博弈
AI（如 Minimax + Alpha-Beta
剪枝）不同，本系统不依赖人类专家知识或手工设计的评估函数，而是让 AI
通过&lt;strong&gt;自我对弈&lt;/strong&gt;从零开始学习五子棋策略。&lt;/p&gt;</summary>
    
    
    
    <category term="项目文档" scheme="https://fallingnight.com/categories/%E9%A1%B9%E7%9B%AE%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
    <category term="Vue" scheme="https://fallingnight.com/tags/Vue/"/>
    
    <category term="flask" scheme="https://fallingnight.com/tags/flask/"/>
    
    <category term="MCTS" scheme="https://fallingnight.com/tags/MCTS/"/>
    
    <category term="ResNet" scheme="https://fallingnight.com/tags/ResNet/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu环境下HBase数据管理</title>
    <link href="https://fallingnight.com/2025/10/16/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHBase%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86/"/>
    <id>https://fallingnight.com/2025/10/16/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHBase%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86/</id>
    <published>2025-10-16T04:51:27.000Z</published>
    <updated>2025-10-17T12:59:57.079Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="hbase-的相关信息">HBase 的相关信息</h1><h2 id="hbase-是什么">HBase 是什么</h2><p>HBase 是一种分布式的、面向列（Column-oriented）的 NoSQL 数据库，是Hadoop 生态系统 的重要组成部分。</p><p>它的全称是： <blockquote><p>Hadoop Database (HBase)</p></blockquote></p><p>起源于 Google 的 Bigtable 论文，HBase 是 Bigtable 在开源界的实现，由Apache 基金会维护。 <span id="more"></span></p><h2 id="hbase-与-hadoop-的关系">HBase 与 Hadoop 的关系</h2><p>HBase 是 Hadoop 的上层应用之一，它依赖 Hadoop的组件实现底层存储与分布式管理。</p><table><colgroup><col style="width: 9%" /><col style="width: 38%" /><col style="width: 51%" /></colgroup><thead><tr><th>层次</th><th>组件</th><th>作用</th></tr></thead><tbody><tr><td>存储层</td><td><strong>HDFS</strong></td><td>负责将数据分块、分布式存储在集群中</td></tr><tr><td>计算层</td><td><strong>MapReduce / Yarn / Spark</strong></td><td>提供大数据批处理或计算框架</td></tr><tr><td>数据库层</td><td><strong>HBase</strong></td><td>提供结构化数据的存储和随机访问</td></tr><tr><td>查询层（可选）</td><td><strong>Hive / Impala / Phoenix</strong></td><td>提供SQL接口和查询优化</td></tr><tr><td>协调层</td><td><strong>ZooKeeper</strong></td><td>管理HBase的分布式协作、主从选举、RegionServer 状态监控等</td></tr></tbody></table><p>可以这样理解它们的关系： <blockquote><p>🗂 HDFS 管数据的“存放位置”</p><p>🧮 MapReduce 管数据的“计算任务”</p><p>🏗 HBase 管数据的“存储结构与访问方式”</p></blockquote></p><p>或者一句话概括： <blockquote><p>Hadoop 负责“存+算”，HBase 负责“查+改”。</p></blockquote></p><h2 id="hbase-的数据模型类比关系型数据库">HBase的数据模型（类比关系型数据库）</h2><table><thead><tr><th>概念</th><th>对应关系型数据库</th><th>说明</th></tr></thead><tbody><tr><td>Namespace</td><td>数据库</td><td>命名空间</td></tr><tr><td>Table</td><td>表</td><td>存储数据的逻辑单元</td></tr><tr><td>Row Key</td><td>主键</td><td>每行的唯一标识</td></tr><tr><td>Column Family</td><td>列族</td><td>一组逻辑相关的列</td></tr><tr><td>Column Qualifier</td><td>列名</td><td>属于某个列族下的具体列</td></tr><tr><td>Timestamp</td><td>版本号</td><td>同一单元格数据的时间版本</td></tr><tr><td>Cell</td><td>单元格</td><td>存储具体数据（值）</td></tr></tbody></table><p>举个例子： <pre class="line-numbers language-text" data-language="text"><code class="language-text">Table: StudentRowKey: 2015001Column Family: Info, ScoreData:RowKey | Info:Name | Info:Sex | Info:Age | Score:Math | Score:English2015001 | Zhangsan  | male     | 23       | 86          | 69<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><p>可以看到：</p><ul><li><p><code>Info</code> 是一个列族（存放学生基本信息）</p></li><li><p><code>Score</code> 是另一个列族（存放成绩信息）</p></li><li><p>每行由一个唯一的 <code>RowKey</code>（学号）标识</p></li></ul><h2 id="hbase-和-mysql-的区别">HBase 和 Mysql 的区别</h2><p>HBase 和 Mysql都是数据库，但他们适用的领域不一样，可以把它们想象成两种不同的交通工具：</p><ul><li><p>MySQL像一辆精密的轿车：适合在结构化的道路（固定表结构）上快速、安全、准确地运送少量贵重物品（结构化数据）。它强调事务安全和数据一致性。</p></li><li><p>HBase像一列重载的火车：适合在粗糙的轨道（松散结构）上运输海量的、各种形态的货物（半/非结构化数据）。它追求的是吞吐量和大容量，而不是每件货物的精确摆放。</p></li></ul><p>✅ HBase 适合的场景有：</p><ul><li><p>数据量非常大（TB级以上）</p></li><li><p>数据是稀疏表（不是每行都有所有列）</p></li><li><p>需要高吞吐随机读写</p></li><li><p>需要按时间或主键快速检索</p></li><li><p>例如：</p><ul><li><p>用户行为日志系统</p></li><li><p>传感器 IoT 数据</p></li><li><p>社交关系存储</p></li><li><p>推荐系统用户画像</p></li><li><p>搜索引擎索引数据</p></li></ul></li></ul><p>❌ 不适合的场景：</p><ul><li><p>小数据量项目（几GB以内）</p></li><li><p>需要复杂SQL、多表关联、事务支持</p></li><li><p>表结构频繁变化</p></li></ul><p>对于这些场景用 Mysql 会更合适。</p><h1 id="环境准备">环境准备</h1><p>在使用 HBase 前需要先<ahref="https://fallingnight.com/2025/10/14/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHDFS%E5%9F%BA%E7%A1%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/">搭好HDFS 环境</a></p><h2 id="安装-hbase">安装 HBase</h2><p>下载安装包： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> https://archive.apache.org/dist/hbase/1.4.13/hbase-1.4.13-bin.tar.gz<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>解压并移动到<code>/usr/local/</code>目录下： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> hbase-1.4.13-bin.tar.gz <span class="token parameter variable">-C</span> /usr/local/<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="配置环境变量">配置环境变量</h2><p>打开<code>Bash</code>配置文件： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">nano</span> ~/.bashrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>如果你按照之前<ahref="https://fallingnight.com/2025/10/14/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHDFS%E5%9F%BA%E7%A1%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/#more">搭HDFS环境</a>的那篇文章配置过<code>.bashrc</code>文件，把之前加在文集末尾的内容改成：<pre class="line-numbers language-none"><code class="language-none">export JAVA_HOME&#x3D;&#x2F;usr&#x2F;lib&#x2F;jvm&#x2F;java-8-openjdk-amd64export HADOOP_HOME&#x3D;&#x2F;usr&#x2F;local&#x2F;hadoopexport HBASE_HOME&#x3D;&#x2F;usr&#x2F;local&#x2F;hbaseexport PATH&#x3D;$PATH:$JAVA_HOME&#x2F;bin:$HADOOP_HOME&#x2F;bin:$HADOOP_HOME&#x2F;sbin:$HBASE_HOME&#x2F;bin:$HBASE_HOME&#x2F;sbin<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre> 保存并退出（Ctrl+O → 回车 → Ctrl+X）。修改以后相较于原来增加了<code>HBase</code></p><p>之后执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">source</span> ~/.bashrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 使配置文件生效。</p><p>随后打开 HBase 的配置文件： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">nano</span> /usr/local/hbase/conf/hbase-site.xml<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>找到： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>将<code>&lt;property&gt;</code>和中间夹着的内容改成： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>configuration</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>hbase.rootdir<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>value</span><span class="token punctuation">></span></span>hdfs://localhost:9000/hbase<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>value</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>property</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>hbase.zookeeper.property.dataDir<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>value</span><span class="token punctuation">></span></span>/usr/local/hbase/zookeeper<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>value</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>property</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>hbase.cluster.distributed<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>value</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>value</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>property</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>configuration</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>保存并退出（Ctrl+O → 回车 → Ctrl+X）。</p><h1 id="启动-hbase">启动 HBase</h1><p>在 HDFS 已经启动的前提下，执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">start-hbase.sh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 启动 HBase 。</p><p>如果想要关闭 HBase，可以执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">stop-hbase.sh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>启动完以后执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">jps<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 进行验证。</p><p>如果输出包含： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">HMasterHRegionServer<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 说明 HBase 启动成功。</p><h1 id="使用-hbase-命令">使用 HBase 命令</h1><h2 id="打开和退出-hbase-shell">打开和退出 HBase Shell</h2><p>成功启动 HBase 以后可以执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hbase shell<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 进入<code>HBase Shell</code>。</p><p>进入成功会出现提示符： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hbase<span class="token punctuation">(</span>main<span class="token punctuation">)</span>:001:<span class="token operator"><span class="token file-descriptor important">0</span>></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p><code>HBase Shell</code> 类似 mysql命令行，在这里可以通过命令对数据和表进行操作管理。</p><p>想要退出 HBase Shell 可以直接执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">exit</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="hbase-shell-常用命令">HBase Shell 常用命令</h2><p>HBase 的命令不像 SQL，而是类 Ruby 语法。 命令格式大多是：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">command</span> <span class="token string">'参数1'</span>, <span class="token string">'参数2'</span>, <span class="token punctuation">..</span>.<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="表管理命令">表管理命令</h3><table><colgroup><col style="width: 40%" /><col style="width: 22%" /><col style="width: 37%" /></colgroup><thead><tr><th>命令</th><th>功能</th><th>示例</th></tr></thead><tbody><tr><td><code>list</code></td><td>列出所有表</td><td><code>list</code></td></tr><tr><td><code>create</code></td><td>创建表</td><td><code>create 'student', 'info'</code></td></tr><tr><td><code>describe</code></td><td>查看表结构</td><td><code>describe 'student'</code></td></tr><tr><td><code>disable</code></td><td>禁用表（修改或删除前必须禁用）</td><td><code>disable 'student'</code></td></tr><tr><td><code>enable</code></td><td>启用表</td><td><code>enable 'student'</code></td></tr><tr><td><code>is_enabled</code> / <code>is_disabled</code></td><td>查看表状态</td><td><code>is_enabled 'student'</code></td></tr><tr><td><code>drop</code></td><td>删除表（必须先 disable）</td><td><code>drop 'student'</code></td></tr><tr><td><code>exists</code></td><td>判断表是否存在</td><td><code>exists 'student'</code></td></tr></tbody></table><p>创建表例子： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">create <span class="token string">'student'</span>, <span class="token string">'info'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 这会创建一张名为 student的表，包含一个列族 info。</p><h3 id="数据操作命令">数据操作命令</h3><table><colgroup><col style="width: 17%" /><col style="width: 9%" /><col style="width: 72%" /></colgroup><thead><tr><th>命令</th><th>功能</th><th>示例</th></tr></thead><tbody><tr><td><code>put</code></td><td>插入数据</td><td><code>put 'student', 'row1', 'info:name', 'Alice'</code></td></tr><tr><td><code>get</code></td><td>读取单行数据</td><td><code>get 'student', 'row1'</code></td></tr><tr><td><code>scan</code></td><td>扫描整张表</td><td><code>scan 'student'</code></td></tr><tr><td><code>delete</code></td><td>删除某个列值</td><td><code>delete 'student', 'row1', 'info:name'</code></td></tr><tr><td><code>deleteall</code></td><td>删除整行</td><td><code>deleteall 'student', 'row1'</code></td></tr><tr><td><code>count</code></td><td>统计行数</td><td><code>count 'student'</code></td></tr><tr><td><code>truncate</code></td><td>清空表数据</td><td><code>truncate 'student'</code></td></tr></tbody></table><p>插入和读取示例： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">put <span class="token string">'student'</span>, <span class="token string">'row1'</span>, <span class="token string">'info:name'</span>, <span class="token string">'Alice'</span>put <span class="token string">'student'</span>, <span class="token string">'row1'</span>, <span class="token string">'info:age'</span>, <span class="token string">'21'</span>get <span class="token string">'student'</span>, <span class="token string">'row1'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><p>输出类似： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">COLUMN                  CELL info:age               <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">21</span> info:name              <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span>Alice<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h3 id="扫描查询">扫描查询</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">scan <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>输出示例： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ROW                        COLUMN+CELL row1                      <span class="token assign-left variable">column</span><span class="token operator">=</span>info:age, <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">21</span>                           <span class="token assign-left variable">column</span><span class="token operator">=</span>info:name, <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span>Alice<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><p>你还可以加过滤条件，比如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">scan <span class="token string">'student'</span>, <span class="token punctuation">&#123;</span>STARTROW <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'row1'</span>, STOPROW <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'row9'</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="删除表数据">删除表数据</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">disable <span class="token string">'student'</span>drop <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>或清空但保留表结构： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">truncate <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="管理命令系统级">管理命令（系统级）</h3><table><thead><tr><th>命令</th><th>功能</th></tr></thead><tbody><tr><td><code>status</code></td><td>查看 HBase 集群状态</td></tr><tr><td><code>version</code></td><td>查看 HBase 版本</td></tr><tr><td><code>whoami</code></td><td>查看当前用户</td></tr><tr><td><code>status 'simple'</code></td><td>查看 RegionServer 数量</td></tr><tr><td><code>status 'summary'</code></td><td>查看集群摘要</td></tr></tbody></table><h3 id="示例">示例</h3><p>例如要建的表叫 student，结构如下：</p><table><colgroup><col style="width: 12%" /><col style="width: 16%" /><col style="width: 14%" /><col style="width: 14%" /><col style="width: 18%" /><col style="width: 23%" /></colgroup><thead><tr><th>RowKey</th><th>info:name</th><th>info:sex</th><th>info:age</th><th>score:math</th><th>score:english</th></tr></thead><tbody><tr><td>2015001</td><td>Zhangsan</td><td>male</td><td>23</td><td>86</td><td>69</td></tr></tbody></table><p>在 HBase 中：</p><ul><li><p>表名：<code>student</code></p></li><li><p>列族（Column Family）有两个：</p><ul><li><p><code>info</code></p></li><li><p><code>score</code></p></li></ul></li><li><p>每个列族下有多个“列限定符”（Qualifier）：</p><ul><li><p><code>info:name</code>、<code>info:sex</code>、<code>info:age</code></p></li><li><p><code>score:math</code>、<code>score:english</code></p></li></ul></li></ul><p>具体步骤如下：</p><h4 id="创建表">创建表：</h4><p>命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">create <span class="token string">'student'</span>, <span class="token string">'info'</span>, <span class="token string">'score'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>说明：</p><ul><li><p><code>student</code> 是表名；</p></li><li><p><code>info</code> 和 <code>score</code> 是列族。</p></li></ul><h4 id="插入数据">插入数据</h4><p>依次插入每一列数据： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">put <span class="token string">'student'</span>, <span class="token string">'2015001'</span>, <span class="token string">'info:name'</span>, <span class="token string">'Zhangsan'</span>put <span class="token string">'student'</span>, <span class="token string">'2015001'</span>, <span class="token string">'info:sex'</span>, <span class="token string">'male'</span>put <span class="token string">'student'</span>, <span class="token string">'2015001'</span>, <span class="token string">'info:age'</span>, <span class="token string">'23'</span>put <span class="token string">'student'</span>, <span class="token string">'2015001'</span>, <span class="token string">'score:math'</span>, <span class="token string">'86'</span>put <span class="token string">'student'</span>, <span class="token string">'2015001'</span>, <span class="token string">'score:english'</span>, <span class="token string">'69'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h4 id="查看表数据">查看表数据</h4><p>查看单行: <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">get <span class="token string">'student'</span>, <span class="token string">'2015001'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>输出类似： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">COLUMN                    CELLinfo:age                 <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">23</span>info:name                <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span>Zhangsaninfo:sex                 <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span>malescore:english            <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">69</span>score:math               <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">86</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><p>查看整张表: <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">scan <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>输出类似： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ROW                        COLUMN+CELL <span class="token number">2015001</span>                   <span class="token assign-left variable">column</span><span class="token operator">=</span>info:age, <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">23</span>                           <span class="token assign-left variable">column</span><span class="token operator">=</span>info:name, <span class="token assign-left variable">value</span><span class="token operator">=</span>Zhangsan                           <span class="token assign-left variable">column</span><span class="token operator">=</span>info:sex, <span class="token assign-left variable">value</span><span class="token operator">=</span>male                           <span class="token assign-left variable">column</span><span class="token operator">=</span>score:english, <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">69</span>                           <span class="token assign-left variable">column</span><span class="token operator">=</span>score:math, <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">86</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h4 id="删除与清空操作">删除与清空操作</h4><p>如果想删除整行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">deleteall <span class="token string">'student'</span>, <span class="token string">'2015001'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>如果想清空表（但保留结构）： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">truncate <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>如果想彻底删除表： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">disable <span class="token string">'student'</span>drop <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><h1 id="通过脚本使用-hbase">通过脚本使用 HBase</h1><p>实际开发中肯定会通过编程实现与数据库的交互，而 HBase 提供了 Java客户端接口，使得我们可以通过 Java 脚本使用 HBase 。</p><h2 id="准备工作">准备工作</h2><p>确保已经启动 HDFS 和 HBase： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">start-dfs.shstart-hbase.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>检查进程： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">jps<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>确定输出包括： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">NameNodeDataNodeSecondaryNameNodeHMasterHRegionServer<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h2 id="编写-java-脚本">编写 Java 脚本</h2><p>在一个方便的目录下创建一个项目目录： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> <span class="token parameter variable">-p</span> ~/hbase-java-api<span class="token builtin class-name">cd</span> ~/hbase-java-api<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>在该目录下创建一个 Java 文件： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">nano</span> HBaseExample.java<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>在这个 Java 文件里写入如下代码： <pre class="line-numbers language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>conf<span class="token punctuation">.</span></span><span class="token class-name">Configuration</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>hbase<span class="token punctuation">.</span></span><span class="token class-name">HBaseConfiguration</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>hbase<span class="token punctuation">.</span></span><span class="token class-name">TableName</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>hbase<span class="token punctuation">.</span>client<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>hbase<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Bytes</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HBaseExample</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">&#123;</span>        <span class="token comment">// 1. 创建HBase配置</span>        <span class="token class-name">Configuration</span> config <span class="token operator">=</span> <span class="token class-name">HBaseConfiguration</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        config<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"hbase.zookeeper.quorum"</span><span class="token punctuation">,</span> <span class="token string">"localhost"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        config<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"hbase.zookeeper.property.clientPort"</span><span class="token punctuation">,</span> <span class="token string">"2181"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        config<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"hbase.rootdir"</span><span class="token punctuation">,</span> <span class="token string">"hdfs://localhost:9000/hbase"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 2. 建立连接</span>        <span class="token class-name">Connection</span> connection <span class="token operator">=</span> <span class="token class-name">ConnectionFactory</span><span class="token punctuation">.</span><span class="token function">createConnection</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Admin</span> admin <span class="token operator">=</span> connection<span class="token punctuation">.</span><span class="token function">getAdmin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 3. 创建表</span>        <span class="token class-name">TableName</span> tableName <span class="token operator">=</span> <span class="token class-name">TableName</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span><span class="token string">"student"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>admin<span class="token punctuation">.</span><span class="token function">tableExists</span><span class="token punctuation">(</span>tableName<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">TableDescriptorBuilder</span> tableDesc <span class="token operator">=</span> <span class="token class-name">TableDescriptorBuilder</span><span class="token punctuation">.</span><span class="token function">newBuilder</span><span class="token punctuation">(</span>tableName<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">ColumnFamilyDescriptor</span> family <span class="token operator">=</span> <span class="token class-name">ColumnFamilyDescriptorBuilder</span><span class="token punctuation">.</span><span class="token function">newBuilder</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"info"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            tableDesc<span class="token punctuation">.</span><span class="token function">setColumnFamily</span><span class="token punctuation">(</span>family<span class="token punctuation">)</span><span class="token punctuation">;</span>            admin<span class="token punctuation">.</span><span class="token function">createTable</span><span class="token punctuation">(</span>tableDesc<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 表 'student' 已创建"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"ℹ️ 表 'student' 已存在"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token comment">// 4. 插入数据</span>        <span class="token class-name">Table</span> table <span class="token operator">=</span> connection<span class="token punctuation">.</span><span class="token function">getTable</span><span class="token punctuation">(</span>tableName<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Put</span> put <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Put</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"row1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        put<span class="token punctuation">.</span><span class="token function">addColumn</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"info"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"Alice"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        put<span class="token punctuation">.</span><span class="token function">addColumn</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"info"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"21"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        table<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>put<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 插入成功"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 5. 读取数据</span>        <span class="token class-name">Get</span> get <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Get</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"row1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Result</span> result <span class="token operator">=</span> table<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>get<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> value <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"info"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toBytes</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"查询结果: "</span> <span class="token operator">+</span> <span class="token class-name">Bytes</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 6. 扫描整张表</span>        <span class="token class-name">Scan</span> scan <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Scan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ResultScanner</span> scanner <span class="token operator">=</span> table<span class="token punctuation">.</span><span class="token function">getScanner</span><span class="token punctuation">(</span>scan<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Result</span> res <span class="token operator">:</span> scanner<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        scanner<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 7. 关闭资源</span>        table<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        admin<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        connection<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h2 id="配置环境">配置环境</h2><p>设置 HBase 的依赖路径： <pre class="line-numbers language-none"><code class="language-none">export HBASE_CLASSPATH&#x3D;$(hbase classpath)<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>如果图方便，希望下次打开终端不用再输入如上命令，也可以把这行命令写进<code>.bashrc</code>文件，不过未来可能有冲突风险，需谨慎考虑。</p><h2 id="编译运行">编译运行</h2><p>编译： <pre class="line-numbers language-none"><code class="language-none">javac -cp $HBASE_CLASSPATH:. HBaseExample.java<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>运行: <pre class="line-numbers language-none"><code class="language-none">java -cp $HBASE_CLASSPATH:. HBaseExample<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="在-shell-验证结果">在 Shell 验证结果</h2><p>运行完 Java 程序后，打开 HBase shell： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hbase shelllistscan <span class="token string">'student'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><p>预期输出： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ROW           COLUMN+CELL row1         <span class="token assign-left variable">column</span><span class="token operator">=</span>info:age, <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span><span class="token number">21</span> row1         <span class="token assign-left variable">column</span><span class="token operator">=</span>info:name, <span class="token assign-left variable">timestamp</span><span class="token operator">=</span><span class="token punctuation">..</span>., <span class="token assign-left variable">value</span><span class="token operator">=</span>Alice<span class="token number">1</span> row<span class="token punctuation">(</span>s<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;hbase-的相关信息&quot;&gt;HBase 的相关信息&lt;/h1&gt;
&lt;h2 id=&quot;hbase-是什么&quot;&gt;HBase 是什么&lt;/h2&gt;
&lt;p&gt;HBase 是一种分布式的、面向列（Column-oriented）的 NoSQL 数据库，是
Hadoop 生态系统 的重要组成部分。&lt;/p&gt;
&lt;p&gt;它的全称是： &lt;blockquote&gt;&lt;p&gt;Hadoop Database (HBase)&lt;/p&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;起源于 Google 的 Bigtable 论文，HBase 是 Bigtable 在开源界的实现，由
Apache 基金会维护。</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="HDFS" scheme="https://fallingnight.com/tags/HDFS/"/>
    
    <category term="Hadoop" scheme="https://fallingnight.com/tags/Hadoop/"/>
    
    <category term="HBase" scheme="https://fallingnight.com/tags/HBase/"/>
    
    <category term="Java" scheme="https://fallingnight.com/tags/Java/"/>
    
    <category term="Ubuntu" scheme="https://fallingnight.com/tags/Ubuntu/"/>
    
    <category term="Linux" scheme="https://fallingnight.com/tags/Linux/"/>
    
    <category term="大数据" scheme="https://fallingnight.com/tags/%E5%A4%A7%E6%95%B0%E6%8D%AE/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu环境下HDFS基础文件操作</title>
    <link href="https://fallingnight.com/2025/10/14/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHDFS%E5%9F%BA%E7%A1%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/"/>
    <id>https://fallingnight.com/2025/10/14/Ubuntu%E7%8E%AF%E5%A2%83%E4%B8%8BHDFS%E5%9F%BA%E7%A1%80%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/</id>
    <published>2025-10-14T11:09:37.000Z</published>
    <updated>2025-11-05T12:57:07.688Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="hdfs和hadoop的关系和用处">HDFS和Hadoop的关系和用处</h1><h2 id="什么是-hadoop">什么是 Hadoop</h2><p>Hadoop 是一个开源的大数据处理框架，由 Apache 基金会维护。它的目标是： <blockquote><p>让“成千上万台普通计算机”能像“一台超级计算机”一样处理海量数据。</p></blockquote> <span id="more"></span> Hadoop主要包括四个核心模块：</p><table><thead><tr><th>模块</th><th>全称</th><th>功能</th></tr></thead><tbody><tr><td>HDFS</td><td>Hadoop Distributed File System</td><td>分布式文件存储系统</td></tr><tr><td>YARN</td><td>Yet Another Resource Negotiator</td><td>负责任务调度与资源管理</td></tr><tr><td>MapReduce</td><td>——</td><td>分布式数据计算框架</td></tr><tr><td>Common</td><td>——</td><td>公共工具、配置、依赖库</td></tr></tbody></table><p>一句话总结： <blockquote><p>Hadoop = 分布式存储（HDFS） + 分布式计算（MapReduce） +调度管理（YARN）</p></blockquote></p><h2 id="什么是-hdfs">什么是 HDFS</h2><p>HDFS（Hadoop Distributed File System） 是 Hadoop 的分布式文件系统。它是 Hadoop 存储数据的底层基础。</p><p>你可以把它理解为： <blockquote><p>一个“把多台机器的硬盘组合在一起”的虚拟超大硬盘。</p></blockquote></p><h2 id="hdfs-的核心思想">HDFS 的核心思想</h2><p>假设你有一个 10TB 的文件，而你的电脑只有 1TB 硬盘， 那你可以用 HDFS把它分成若干个块（block），分别存到多台机器上。</p><p>HDFS 由两个主要角色组成：</p><table><colgroup><col style="width: 50%" /><col style="width: 50%" /></colgroup><thead><tr><th>角色</th><th>说明</th></tr></thead><tbody><tr><td>NameNode</td><td>管理文件系统的“目录结构”和“元数据”（记录每个文件在哪台机器上）</td></tr><tr><td>DataNode</td><td>真正存放文件数据的节点（可以有很多台机器）</td></tr></tbody></table><h2 id="hdfs和hadoop的关系">HDFS和Hadoop的关系</h2><p>Hadoop负责大数据计算框架（存储+计算），是总系统；HDFS负责分布式文件存储，是Hadoop 的底层存储模块。</p><h1 id="环境准备">环境准备</h1><h2 id="linux系统">Linux系统</h2><p>本文的所有命令是Ubuntu环境下运行的，可以买一个云服务器初始化的时候选择ubuntu系统，或者下载一个ubuntu镜像在虚拟机上跑。</p><h2 id="安装-jdk建议-java-8">安装 JDK（建议 Java 8）</h2><p>本文使用Java对文件进行操作，所以需要安装JDK。建议安装Java8，用其他版本可能有起冲突的风险。 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt</span> update<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> openjdk-8-jdk <span class="token parameter variable">-y</span><span class="token function">java</span> <span class="token parameter variable">-version</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h2 id="安装-hadoop建议使用-hadoop-3.3.x">安装 Hadoop（建议使用 Hadoop3.3.x）</h2><h3 id="下载并解压">下载并解压</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz<span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> hadoop-3.3.6.tar.gz<span class="token function">sudo</span> <span class="token function">mv</span> hadoop-3.3.6 /usr/local/hadoop<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>如果你没有安装 wget，可以先安装： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt</span> update<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token function">wget</span> <span class="token parameter variable">-y</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><h3 id="配置环境变量">配置环境变量</h3><p>打开配置文件： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">nano</span> ~/.bashrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>在文件末尾加上： <pre class="line-numbers language-none"><code class="language-none">export JAVA_HOME&#x3D;&#x2F;usr&#x2F;lib&#x2F;jvm&#x2F;java-8-openjdk-amd64export HADOOP_HOME&#x3D;&#x2F;usr&#x2F;local&#x2F;hadoopexport PATH&#x3D;$PATH:$HADOOP_HOME&#x2F;bin:$HADOOP_HOME&#x2F;sbin<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre> 加完以后保存并退出（Ctrl+O → 回车 →Ctrl+X）。</p><p>然后执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">source</span> ~/.bashrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 使配置文件生效。</p><h3 id="验证安装">验证安装</h3><p>执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hadoop version<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 出现 Hadoop 版本号则安装成功。</p><p>由于HDFS是Hadoop的子模块，所以安装完Hadoop以后系统就自带了HDFS。</p><h1 id="启动-hadoop-单机模式或伪分布式">启动 Hadoop单机模式（或伪分布式）</h1><h2 id="建立ssh连接">建立ssh连接</h2><p>本文是单机模式，所以只需要和自己（localhost）建立ssh免密登录就行。如果是正常情况下多台机器实现分布式，则需要和本机以及每台机器都配置免密登录。</p><h3 id="安装并启动-ssh-服务">安装并启动 SSH 服务</h3><p>执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt</span> update<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> openssh-server <span class="token parameter variable">-y</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>安装好后启动 SSH 服务： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> systemctl <span class="token builtin class-name">enable</span> <span class="token function">ssh</span><span class="token function">sudo</span> systemctl start <span class="token function">ssh</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>确认 SSH 正在运行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> systemctl status <span class="token function">ssh</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>应看到状态为： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">Active: active <span class="token punctuation">(</span>running<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="配置本机免密登录localhost">配置本机免密登录（localhost）</h3><p>让 Hadoop 在执行脚本时能自动 SSH 登录自己而不用密码。</p><p>生成 SSH 密钥： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ssh-keygen <span class="token parameter variable">-t</span> rsa <span class="token parameter variable">-P</span> <span class="token string">""</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 一路回车（Enter）即可。</p><p>把公钥加到本机授权文件（多机器的话则是把本机公钥加到每台机器的授权文件）：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> ~/.ssh/id_rsa.pub <span class="token operator">>></span> ~/.ssh/authorized_keys<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>测试免密登录： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ssh</span> localhost<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>第一次可能会提示： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">Are you sure you want to <span class="token builtin class-name">continue</span> connecting <span class="token punctuation">(</span>yes/no<span class="token punctuation">)</span>?<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>输入： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">yes</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>然后如果能直接进入（没有要求输入密码），说明成功。</p><p>退出： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">exit</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="在-hadoop-的配置文件中显式设置-java_home">在 Hadoop的配置文件中显式设置 JAVA_HOME</h2><p>由于SSH 默认启动的是 非登录 shell，不会加载 ~/.bashrc，所以.bashrc中的 JAVA_HOME 虽然在 .bashrc 里，但 Hadoop 的脚本看不到。</p><p>因此需要编辑： <pre class="line-numbers language-none"><code class="language-none">$HADOOP_HOME&#x2F;etc&#x2F;hadoop&#x2F;hadoop-env.sh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>执行命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">nano</span> /usr/local/hadoop/etc/hadoop/hadoop-env.sh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>找到这一行（大概在文件中间位置）： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># export JAVA_HOME=</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>把注释去掉并改成你系统真实的 Java 路径，例如（以 Java 8 为例）：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">export</span> <span class="token assign-left variable">JAVA_HOME</span><span class="token operator">=</span>/usr/lib/jvm/java-8-openjdk-amd64<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 保存并退出（Ctrl+O → 回车 → Ctrl+X）。</p><p>保存后重新加载环境 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">source</span> ~/.bashrc<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="定义namenode所在地址">定义NameNode所在地址</h2><p>打开配置文件 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">nano</span> /usr/local/hadoop/etc/hadoop/core-site.xml<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>找到： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>将<code>&lt;property&gt;</code>和中间夹着的内容改成： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>property</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>fs.defaultFS<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>value</span><span class="token punctuation">></span></span>hdfs://localhost:9000<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>value</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>property</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>保存并退出（Ctrl+O → 回车 → Ctrl+X）。</p><p>这样系统就能知道 NameNode 所在主机的主机名或 IP（localhost）。</p><h2 id="启动">启动</h2><p>启动前需格式化 NameNode（必须重新格式化）。 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hdfs namenode <span class="token parameter variable">-format</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>输入启动 HDFS 的命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">start-dfs.sh<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>确认启动结果： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">jps<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>输出应当包含： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">NameNodeDataNodeSecondaryNameNodeJps<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre> 等信息。</p><p>可以尝试在浏览器输入： <pre class="line-numbers language-txt" data-language="txt"><code class="language-txt">http://localhost:9870<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 打开 Hadoop 的 HDFS Web管理界面，如果成功打开，说明 HDFS 已经成功启动了。</p><p>大部分情况下ubuntu系统没有图形界面，只有纯终端，如果用的是虚拟机，可以通过：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">hostname</span> <span class="token parameter variable">-I</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 在 Ubuntu 虚拟机中查看 IP 地址。</p><p>假设输出： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token number">192.168</span>.56.101<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 在宿主机的浏览器里输入： <pre class="line-numbers language-txt" data-language="txt"><code class="language-txt">http://192.168.56.101:9870<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>就可以打开管理界面了。</p><p>如果用的是云服务器，则在本地电脑执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ssh</span> <span class="token parameter variable">-L</span> <span class="token number">9870</span>:localhost:9870 username@<span class="token operator">&lt;</span>你的服务器IP<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><code>username</code>改成云服务器那边的用户名。</p><p>然后在本地浏览器打开： <pre class="line-numbers language-txt" data-language="txt"><code class="language-txt">http://localhost:9870<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 这条命令让你本地的 9870 端口“转发” 到远程服务器的 9870 端口上。</p><h1 id="通过脚本实现hdfs文件操作">通过脚本实现HDFS文件操作</h1><h2 id="准备工作">准备工作</h2><p>确保以下前提都满足：</p><ol type="1"><li><p>Hadoop 已经正确安装并能启动： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">start-dfs.shjps<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 能看到NameNode、DataNode、SecondaryNameNode。</p></li><li><p>Java 环境配置正确： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">java</span> <span class="token parameter variable">-version</span>javac <span class="token parameter variable">-version</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p></li><li><p>HDFS 运行正常： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hdfs dfs <span class="token parameter variable">-mkdir</span> /testhdfs dfs <span class="token parameter variable">-ls</span> /<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p></li></ol><h2 id="编写-java-脚本">编写 Java 脚本</h2><p>在一个方便的目录下创建一个项目目录： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> <span class="token parameter variable">-p</span> ~/hdfs-java-api<span class="token builtin class-name">cd</span> ~/hdfs-java-api<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>创建一个 Java 文件： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">nano</span> HdfsClient.java<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>在这个 Java 文件里写入如下代码： <pre class="line-numbers language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>conf<span class="token punctuation">.</span></span><span class="token class-name">Configuration</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>fs<span class="token punctuation">.</span></span><span class="token class-name">FileSystem</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>fs<span class="token punctuation">.</span></span><span class="token class-name">Path</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>fs<span class="token punctuation">.</span></span><span class="token class-name">FSDataInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>hadoop<span class="token punctuation">.</span>fs<span class="token punctuation">.</span></span><span class="token class-name">FileStatus</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">BufferedReader</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">InputStreamReader</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>net<span class="token punctuation">.</span></span><span class="token class-name">URI</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HdfsClient</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token comment">// 1. 设置 Hadoop 配置信息</span>        <span class="token class-name">Configuration</span> conf <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Configuration</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        conf<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"fs.defaultFS"</span><span class="token punctuation">,</span> <span class="token string">"hdfs://localhost:9000"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 如果配置了 hostname 就写 hdfs://CivilightEterna:9000</span>        <span class="token comment">// 2. 获取文件系统对象</span>        <span class="token class-name">FileSystem</span> fs <span class="token operator">=</span> <span class="token class-name">FileSystem</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">URI</span><span class="token punctuation">(</span><span class="token string">"hdfs://localhost:9000"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> conf<span class="token punctuation">,</span> <span class="token string">"username"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 3. 创建目录</span>        <span class="token class-name">Path</span> dir <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">"/experiment"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>fs<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span>dir<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            fs<span class="token punctuation">.</span><span class="token function">mkdirs</span><span class="token punctuation">(</span>dir<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 目录 /experiment 创建成功！"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token comment">// 4. 上传文件</span>        <span class="token class-name">Path</span> localFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">"/home/username/test.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Path</span> hdfsFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Path</span><span class="token punctuation">(</span><span class="token string">"/experiment/test.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        fs<span class="token punctuation">.</span><span class="token function">copyFromLocalFile</span><span class="token punctuation">(</span>localFile<span class="token punctuation">,</span> hdfsFile<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 文件上传成功！"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 5. 读取文件</span>        <span class="token class-name">FSDataInputStream</span> inputStream <span class="token operator">=</span> fs<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span>hdfsFile<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">BufferedReader</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedReader</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">InputStreamReader</span><span class="token punctuation">(</span>inputStream<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">String</span> line<span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 文件内容："</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>line <span class="token operator">=</span> reader<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>line<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        reader<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 6. 查看文件信息</span>        <span class="token class-name">FileStatus</span> status <span class="token operator">=</span> fs<span class="token punctuation">.</span><span class="token function">getFileStatus</span><span class="token punctuation">(</span>hdfsFile<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 文件路径："</span> <span class="token operator">+</span> status<span class="token punctuation">.</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 文件大小："</span> <span class="token operator">+</span> status<span class="token punctuation">.</span><span class="token function">getLen</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" bytes"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 7. 删除文件</span>        fs<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>hdfsFile<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"✅ 文件已删除。"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 8. 关闭文件系统</span>        fs<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>将其中的<code>username</code>改成自己的用户名。</p><p>然后在本地ubuntu用户目录创建一个名<code>test.txt</code>的文件：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">echo</span> <span class="token string">"Hello HDFS from Java API!"</span> <span class="token operator">></span> /home/username/test.txt<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 同样将其中的<code>username</code>改成自己的用户名。</p><h2 id="编译并运行">编译并运行</h2><p>设置 Hadoop 的依赖路径： <pre class="line-numbers language-none"><code class="language-none">export HADOOP_CLASSPATH&#x3D;$(hadoop classpath)<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>编译： <pre class="line-numbers language-none"><code class="language-none">javac -cp $HADOOP_CLASSPATH HdfsClient.java<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>如果编译成功，会生成： <pre class="line-numbers language-none"><code class="language-none">HdfsClient.class<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><p>运行程序： <pre class="line-numbers language-none"><code class="language-none">java -cp $HADOOP_CLASSPATH:. HdfsClient<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 注意后面的 <code>:.</code>代表当前目录也要加入 classpath。</p><h2 id="运行效果示例">运行效果示例</h2><p>如果一切正常，你会看到输出： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">✅ 目录 /experiment 创建成功！✅ 文件上传成功！✅ 文件内容：Hello HDFS from Java API<span class="token operator">!</span>✅ 文件路径：hdfs://localhost:9000/experiment/test.txt✅ 文件大小：26 bytes✅ 文件已删除。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><p>同时你可以验证： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hdfs dfs <span class="token parameter variable">-ls</span> /experiment<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 来确认是否真的上传和删除了文件。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;hdfs和hadoop的关系和用处&quot;&gt;HDFS和Hadoop的关系和用处&lt;/h1&gt;
&lt;h2 id=&quot;什么是-hadoop&quot;&gt;什么是 Hadoop&lt;/h2&gt;
&lt;p&gt;Hadoop 是一个开源的大数据处理框架，由 Apache 基金会维护。
它的目标是： &lt;blockquote&gt;&lt;p&gt;让“成千上万台普通计算机”能像“一台超级计算机”一样处理海量数据。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="HDFS" scheme="https://fallingnight.com/tags/HDFS/"/>
    
    <category term="Hadoop" scheme="https://fallingnight.com/tags/Hadoop/"/>
    
    <category term="Java" scheme="https://fallingnight.com/tags/Java/"/>
    
    <category term="Ubuntu" scheme="https://fallingnight.com/tags/Ubuntu/"/>
    
    <category term="Linux" scheme="https://fallingnight.com/tags/Linux/"/>
    
    <category term="大数据" scheme="https://fallingnight.com/tags/%E5%A4%A7%E6%95%B0%E6%8D%AE/"/>
    
  </entry>
  
  <entry>
    <title>b站视频爬取方法</title>
    <link href="https://fallingnight.com/2025/04/01/b%E7%AB%99%E8%A7%86%E9%A2%91%E7%88%AC%E5%8F%96%E6%96%B9%E6%B3%95/"/>
    <id>https://fallingnight.com/2025/04/01/b%E7%AB%99%E8%A7%86%E9%A2%91%E7%88%AC%E5%8F%96%E6%96%B9%E6%B3%95/</id>
    <published>2025-04-01T01:00:03.000Z</published>
    <updated>2025-04-21T02:00:40.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><div class="tip warning"><i class="i-adm i-warning icon"></i><div class="p"><p>叠甲——本文内容仅供学习使用。</p></div></div><p>如果想要直接使用成品，可以点击<ahref="https://bilibililoader-fallingnight-n7mdqilcu.streamlit.app/">&gt;这里</a>。(因为部署在了streamlit，所以可能需要唤醒一下程序)</p><h1 id="原理">原理</h1><p>本文介绍的方法是通过输入视频在b站的网址，然后通过<strong>api</strong>爬取视频。<span id="more"></span></p><p>虽然视频的播放地址有时候就在<strong>html</strong>文件中，但是对于拜年庆等视频，地址在<strong>html</strong>文件中的位置有变化，并不能稳定爬到，而<strong>aid</strong>、<strong>cid</strong>等<strong>api信息参数</strong>的位置相对稳定，所以用<strong>api</strong>的方法爬成功的概率更高。</p><h2 id="获取api参数">获取api参数</h2><p>b站视频的<strong>api</strong>有三个参数，分别是<strong>aid</strong>、<strong>bvid</strong>、<strong>cid</strong>。</p><p>由于b站视频的<strong>url</strong>中是包含<strong>bvid</strong>的，所以我们实际要收集的参数是<strong>aid</strong>和<strong>cid</strong>。</p><p>在<strong>html</strong>文件中，<strong>aid</strong>和<strong>cid</strong>一般就在<strong>bvid</strong>的上下，可以通过正则化找到相应的<strong>bvid</strong>，然后再获取另外两个参数。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250401160330568.png" /></p><h2 id="获取视频数据">获取视频数据</h2><p>通过<strong>api参数</strong>，就可以访问视频的<strong>json数据</strong>了。<strong>api接口</strong>是<code>https://api.bilibili.com/x/player/playurl</code>。</p><p>返回的<strong>json数据</strong>如下：</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250401161726945.png" /></p><p>可以看到，视频的播放地址就在返回的<strong>json数据</strong>里。b站视频的<strong>视频流</strong>和<strong>音频流</strong>是分开的。视频的播放地址在<code>video</code>下，音频的播放地址在<code>audio</code>下,<code>baseUrl</code>和<code>base_url</code>都可能是有效的播放地址。<code>vidio</code>和<code>audio</code>下都有很多个子数据，一般越靠前的品质越好，例如<code>0</code>下的视频数据比<code>1</code>下的视频数据分辨率高。</p><p>爬取到视频和音频文件以后，将两个文件合并一下，一个完整的视频就得到了。</p><h1 id="代码实现">代码实现</h1><p>下面是用<strong>python</strong>写的示例代码：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requests<span class="token keyword">import</span> os<span class="token keyword">from</span> moviepy<span class="token punctuation">.</span>editor <span class="token keyword">import</span> VideoFileClip<span class="token punctuation">,</span> AudioFileClip<span class="token keyword">import</span> re<span class="token comment"># 视频页面 URL</span>url <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">"请输入 Bilibili 视频的网址:\n "</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">extract_bv</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""    从给定的 URL 中提取 Bilibili 的 BV 号。​    参数:​        url (str): 包含 BV 号的 URL。​    返回:​        str: 提取到的 BV 号，如果未找到则返回 None。​    """</span>​    <span class="token comment"># 定义匹配 BV 号的正则表达式</span>​    bv_pattern <span class="token operator">=</span> <span class="token string">r"BV[0-9A-Za-z]+"</span>​    ​    <span class="token comment"># 使用正则表达式在 URL 中查找</span>​    <span class="token keyword">match</span> <span class="token operator">=</span> re<span class="token punctuation">.</span>search<span class="token punctuation">(</span>bv_pattern<span class="token punctuation">,</span> url<span class="token punctuation">)</span>​    ​    <span class="token keyword">if</span> <span class="token keyword">match</span><span class="token punctuation">:</span>​        <span class="token keyword">return</span> <span class="token keyword">match</span><span class="token punctuation">.</span>group<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>  <span class="token comment"># 返回匹配到的 BV 号</span>​    <span class="token keyword">else</span><span class="token punctuation">:</span>​        <span class="token keyword">return</span> <span class="token boolean">None</span>  <span class="token comment"># 如果没有匹配到 BV 号，则返回 None</span>​    bvid <span class="token operator">=</span> extract_bv<span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">find_api_inf</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> bvid<span class="token punctuation">,</span> headers<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token comment"># 获取api信息</span>​    response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">)</span>​    <span class="token keyword">if</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>​        html_content <span class="token operator">=</span> response<span class="token punctuation">.</span>text        <span class="token comment"># 匹配包含 aid、bvid 和 cid 的字段</span>​        matches <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">r'"aid":(\d+),"bvid":"(BV[0-9A-Za-z]+)","cid":(\d+)'</span><span class="token punctuation">,</span> html_content<span class="token punctuation">)</span>        <span class="token comment"># 查找指定 bvid 的 aid 和 cid</span>​        <span class="token keyword">for</span> aid<span class="token punctuation">,</span> matched_bvid<span class="token punctuation">,</span> cid <span class="token keyword">in</span> matches<span class="token punctuation">:</span>​            <span class="token keyword">if</span> matched_bvid <span class="token operator">==</span> bvid<span class="token punctuation">:</span>​                <span class="token keyword">return</span> aid<span class="token punctuation">,</span> cid​        <span class="token keyword">else</span><span class="token punctuation">:</span>​            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"未找到指定的 bvid: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>bvid<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>​    <span class="token keyword">else</span><span class="token punctuation">:</span>​        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"请求失败，状态码：</span><span class="token interpolation"><span class="token punctuation">&#123;</span>response<span class="token punctuation">.</span>status_code<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token comment"># 设置请求头，模拟浏览器</span>headers <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"</span><span class="token punctuation">&#125;</span>aid<span class="token punctuation">,</span> cid <span class="token operator">=</span> find_api_inf<span class="token punctuation">(</span>url<span class="token punctuation">,</span> bvid<span class="token punctuation">,</span> headers<span class="token punctuation">)</span>params <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token string">"fnver"</span><span class="token punctuation">:</span> <span class="token string">"0"</span><span class="token punctuation">,</span><span class="token string">"fnval"</span><span class="token punctuation">:</span> <span class="token string">"4048"</span><span class="token punctuation">,</span><span class="token string">"fourk"</span><span class="token punctuation">:</span> <span class="token string">"1"</span><span class="token punctuation">,</span><span class="token string">"aid"</span><span class="token punctuation">:</span> aid<span class="token punctuation">,</span><span class="token string">"bvid"</span><span class="token punctuation">:</span> bvid<span class="token punctuation">,</span><span class="token string">"cid"</span><span class="token punctuation">:</span> cid<span class="token punctuation">,</span><span class="token punctuation">&#125;</span><span class="token comment"># 请求 B站 API</span>response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">"https://api.bilibili.com/x/player/playurl"</span><span class="token punctuation">,</span> params<span class="token operator">=</span>params<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">)</span>data <span class="token operator">=</span> response<span class="token punctuation">.</span>json<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment"># 提取视频和音频 URL</span>video_base_urls <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>audio_base_urls <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token comment"># 提取视频 URL</span><span class="token keyword">for</span> video_data <span class="token keyword">in</span> data<span class="token punctuation">[</span><span class="token string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'dash'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'video'</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token string">'baseUrl'</span> <span class="token keyword">in</span> video_data<span class="token punctuation">:</span>        video_base_urls<span class="token punctuation">.</span>append<span class="token punctuation">(</span>video_data<span class="token punctuation">[</span><span class="token string">'baseUrl'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token string">'base_url'</span> <span class="token keyword">in</span> video_data<span class="token punctuation">:</span>        video_base_urls<span class="token punctuation">.</span>append<span class="token punctuation">(</span>video_data<span class="token punctuation">[</span><span class="token string">'base_url'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token comment"># 提取音频 URL</span><span class="token keyword">for</span> audio_data <span class="token keyword">in</span> data<span class="token punctuation">[</span><span class="token string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'dash'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'audio'</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token string">'baseUrl'</span> <span class="token keyword">in</span> audio_data<span class="token punctuation">:</span>        audio_base_urls<span class="token punctuation">.</span>append<span class="token punctuation">(</span>audio_data<span class="token punctuation">[</span><span class="token string">'baseUrl'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token string">'base_url'</span> <span class="token keyword">in</span> audio_data<span class="token punctuation">:</span>        audio_base_urls<span class="token punctuation">.</span>append<span class="token punctuation">(</span>audio_data<span class="token punctuation">[</span><span class="token string">'base_url'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token comment"># 定义下载函数</span><span class="token keyword">def</span> <span class="token function">download_file</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> filename<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"正在下载: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>url<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>        response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token punctuation">,</span> stream<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>        response<span class="token punctuation">.</span>raise_for_status<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> <span class="token string">"wb"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>            <span class="token keyword">for</span> chunk <span class="token keyword">in</span> response<span class="token punctuation">.</span>iter_content<span class="token punctuation">(</span>chunk_size<span class="token operator">=</span><span class="token number">8192</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                f<span class="token punctuation">.</span>write<span class="token punctuation">(</span>chunk<span class="token punctuation">)</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"下载完成: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>filename<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>        <span class="token keyword">return</span> <span class="token boolean">True</span>    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"下载失败: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>url<span class="token punctuation">&#125;</span></span><span class="token string">, 错误: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>e<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>        <span class="token keyword">return</span> <span class="token boolean">False</span><span class="token comment"># 下载视频和音频</span>video_file <span class="token operator">=</span> <span class="token string">"video.mp4"</span>audio_file <span class="token operator">=</span> <span class="token string">"audio.m4a"</span>video_downloaded <span class="token operator">=</span> <span class="token boolean">False</span>audio_downloaded <span class="token operator">=</span> <span class="token boolean">False</span><span class="token keyword">for</span> video_url <span class="token keyword">in</span> video_base_urls<span class="token punctuation">:</span>    <span class="token keyword">if</span> download_file<span class="token punctuation">(</span>video_url<span class="token punctuation">,</span> video_file<span class="token punctuation">)</span><span class="token punctuation">:</span>        video_downloaded <span class="token operator">=</span> <span class="token boolean">True</span>        <span class="token keyword">break</span><span class="token keyword">for</span> audio_url <span class="token keyword">in</span> audio_base_urls<span class="token punctuation">:</span>    <span class="token keyword">if</span> download_file<span class="token punctuation">(</span>audio_url<span class="token punctuation">,</span> audio_file<span class="token punctuation">)</span><span class="token punctuation">:</span>        audio_downloaded <span class="token operator">=</span> <span class="token boolean">True</span>        <span class="token keyword">break</span><span class="token comment"># 合并音频和视频</span><span class="token keyword">if</span> video_downloaded <span class="token keyword">and</span> audio_downloaded<span class="token punctuation">:</span>    output_file <span class="token operator">=</span> <span class="token string">"output.mp4"</span>    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"正在合并音频和视频..."</span><span class="token punctuation">)</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        <span class="token comment"># 加载视频和音频文件</span>​        video <span class="token operator">=</span> VideoFileClip<span class="token punctuation">(</span>video_file<span class="token punctuation">)</span>​        audio <span class="token operator">=</span> AudioFileClip<span class="token punctuation">(</span>audio_file<span class="token punctuation">)</span>        <span class="token comment"># 将音频添加到视频</span>​        video <span class="token operator">=</span> video<span class="token punctuation">.</span>set_audio<span class="token punctuation">(</span>audio<span class="token punctuation">)</span>        <span class="token comment"># 导出合并后的视频</span>​        video<span class="token punctuation">.</span>write_videofile<span class="token punctuation">(</span>output_file<span class="token punctuation">,</span> codec<span class="token operator">=</span><span class="token string">"libx264"</span><span class="token punctuation">,</span> audio_codec<span class="token operator">=</span><span class="token string">"aac"</span><span class="token punctuation">)</span>​        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"合并完成: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>output_file<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>​    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>​        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"合并失败: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>e<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>​    <span class="token keyword">finally</span><span class="token punctuation">:</span>​        <span class="token comment"># 清理 MoviePy 的缓存文件</span>​        video<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>​        audio<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">else</span><span class="token punctuation">:</span>​    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"视频或音频下载失败，无法合并。"</span><span class="token punctuation">)</span><span class="token comment"># 清理临时文件</span><span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span>video_file<span class="token punctuation">)</span><span class="token punctuation">:</span>    os<span class="token punctuation">.</span>remove<span class="token punctuation">(</span>video_file<span class="token punctuation">)</span><span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span>audio_file<span class="token punctuation">)</span><span class="token punctuation">:</span>    os<span class="token punctuation">.</span>remove<span class="token punctuation">(</span>audio_file<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;tip warning&quot;&gt;&lt;i class=&quot;i-adm i-warning icon&quot;&gt;&lt;/i&gt;&lt;div class=&quot;p&quot;&gt;&lt;p&gt;叠甲——本文内容仅供学习使用。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果想要直接使用成品，可以点击&lt;a
href=&quot;https://bilibililoader-fallingnight-n7mdqilcu.streamlit.app/&quot;&gt;&amp;gt;这里&lt;/a&gt;。(因为部署在了streamlit，所以可能需要唤醒一下程序)&lt;/p&gt;
&lt;h1 id=&quot;原理&quot;&gt;原理&lt;/h1&gt;
&lt;p&gt;本文介绍的方法是通过输入视频在b站的网址，然后通过&lt;strong&gt;api&lt;/strong&gt;爬取视频。</summary>
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="html" scheme="https://fallingnight.com/tags/html/"/>
    
    <category term="json" scheme="https://fallingnight.com/tags/json/"/>
    
    <category term="爬虫" scheme="https://fallingnight.com/tags/%E7%88%AC%E8%99%AB/"/>
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>Cmake MSVC error C2065：未声明的标识符</title>
    <link href="https://fallingnight.com/2025/03/31/Cmake-MSVC-error-C2065%EF%BC%9A%E6%9C%AA%E5%A3%B0%E6%98%8E%E7%9A%84%E6%A0%87%E8%AF%86%E7%AC%A6/"/>
    <id>https://fallingnight.com/2025/03/31/Cmake-MSVC-error-C2065%EF%BC%9A%E6%9C%AA%E5%A3%B0%E6%98%8E%E7%9A%84%E6%A0%87%E8%AF%86%E7%AC%A6/</id>
    <published>2025-03-31T09:51:24.000Z</published>
    <updated>2025-04-18T16:06:52.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="问题描述">问题描述</h1><p>用<strong>cmake</strong>加<strong>MSVC工具链</strong>编译<strong>C++</strong>程序的时候出现了<code>C2065：未声明的标识符</code>的报错。此前使用<strong>minGW</strong>的时候没有过这样的报错。<span id="more"></span></p><h1 id="报错原因">报错原因</h1><p>问题是由于<strong>源文件的字符编码不兼容</strong>导致的。MSVC默认使用<strong>ANSI 编码</strong>（如 GB2312 或Shift-JIS）解析源文件，而源代码可能是<strong>UTF-8</strong>编码的，这就导致了C2065（未声明的标识符）等错误，特别是当代码中包含非 ASCII字符（如中文注释、字符串常量等）时。</p><h1 id="解决方法">解决方法</h1><p>在CmakeLists增加：</p><pre class="line-numbers language-CmakeLists" data-language="CmakeLists"><code class="language-CmakeLists">if (CMAKE_CXX_COMPILER_ID STREQUAL &quot;MSVC&quot;)​add_compile_options(&#x2F;source-charset:utf-8 &#x2F;execution-charset:utf-8)endif()<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这样就能强制 MSVC 以 UTF-8解析代码，避免了字符编码问题引起的未声明标识符错误。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;问题描述&quot;&gt;问题描述&lt;/h1&gt;
&lt;p&gt;用&lt;strong&gt;cmake&lt;/strong&gt;加&lt;strong&gt;MSVC工具链&lt;/strong&gt;编译&lt;strong&gt;C++&lt;/strong&gt;程序的时候出现了&lt;code&gt;C2065：未声明的标识符&lt;/code&gt;的报错。此前使用&lt;strong&gt;minGW&lt;/strong&gt;的时候没有过这样的报错。</summary>
    
    
    
    <category term="报错修复" scheme="https://fallingnight.com/categories/%E6%8A%A5%E9%94%99%E4%BF%AE%E5%A4%8D/"/>
    
    
    <category term="C++" scheme="https://fallingnight.com/tags/C/"/>
    
    <category term="Cmake" scheme="https://fallingnight.com/tags/Cmake/"/>
    
    <category term="MSVC" scheme="https://fallingnight.com/tags/MSVC/"/>
    
  </entry>
  
  <entry>
    <title>如何在学习通的答题框中黏贴文本</title>
    <link href="https://fallingnight.com/2025/03/26/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%AD%A6%E4%B9%A0%E9%80%9A%E7%9A%84%E7%AD%94%E9%A2%98%E6%A1%86%E4%B8%AD%E9%BB%8F%E8%B4%B4%E6%96%87%E6%9C%AC/"/>
    <id>https://fallingnight.com/2025/03/26/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%AD%A6%E4%B9%A0%E9%80%9A%E7%9A%84%E7%AD%94%E9%A2%98%E6%A1%86%E4%B8%AD%E9%BB%8F%E8%B4%B4%E6%96%87%E6%9C%AC/</id>
    <published>2025-03-26T10:27:19.000Z</published>
    <updated>2025-04-22T00:28:44.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>众所周知，学习通因为反作弊机制不允许黏贴文本到答题框，但是学习通的答题框太小了，在这玩意里面一个一个打字会很不方便，但是想要在记事本上把答案写完再黏上去是不被允许的。</p><p>本文讲述一种办法使得答案可以被黏贴进答题框。 <span id="more"></span></p><h1 id="打开检查">打开检查</h1><p>如果你使用的是<strong>Chrome</strong>或者<strong>MicrosoftEdge</strong>，在答题页面右键打开菜单选择<strong>检测</strong>。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326184120890.png" /></p><h1 id="找到答题框部分">找到答题框部分</h1><p>打开<strong>检查</strong>以后，选择<strong>元素</strong>菜单。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326184413476.png" /></p><p>然后点击左上角的箭头。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326185519554.png" /></p><p>选择了这个箭头以后，点击任何网页中的元素都会自动跳转到其对应的html代码部分。</p><p>随后我们选择答题框。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326190025929.png" /></p><p>可以看到右边检查已经选中了答题框区域。</p><h1 id="修改答题框文本">修改答题框文本</h1><p>我们点开标签<code>&lt;body&gt;</code>。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326190746753.png" /></p><p>看到标签<code>&lt;p&gt;</code>。我们再点开这个<code>&lt;p&gt;</code>标签。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326190907443.png" /></p><p>这时我们看到<code>"&amp;ZeroWidthSpace;" == $0</code>。这就是答题框文本部分，接下来只需要将这个<code>&amp;ZeroWidthSpace;</code>黏贴成答案就行了。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326191148942.png" /></p><p>之后再回车，左边的答题框里就有了我们需要的答案。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250326191257376.png" /></p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;众所周知，学习通因为反作弊机制不允许黏贴文本到答题框，但是学习通的答题框太小了，在这玩意里面一个一个打字会很不方便，但是想要在记事本上把答案写完再黏上去是不被允许的。&lt;/p&gt;
&lt;p&gt;本文讲述一种办法使得答案可以被黏贴进答题框。</summary>
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="html" scheme="https://fallingnight.com/tags/html/"/>
    
  </entry>
  
  <entry>
    <title>Markdown复杂表格绘制</title>
    <link href="https://fallingnight.com/2025/03/24/Markdown%E5%A4%8D%E6%9D%82%E8%A1%A8%E6%A0%BC%E7%BB%98%E5%88%B6/"/>
    <id>https://fallingnight.com/2025/03/24/Markdown%E5%A4%8D%E6%9D%82%E8%A1%A8%E6%A0%BC%E7%BB%98%E5%88%B6/</id>
    <published>2025-03-24T02:05:48.000Z</published>
    <updated>2025-09-11T08:28:14.137Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="基础表格绘制">基础表格绘制</h1><h2 id="画一张表">画一张表</h2><p>表格的基本语法如下，第一行是表格的标题行，第二行固定以<code>---</code> 做分隔，列通过使用 <code>|</code>來添加。宽度是自动分配的，如果第二行和第一行列数不一样也会自动对齐（但是会不美观）。空格会被忽视掉。<code>|</code>没有对齐也没有关系，最后形成的表格都是会自动对齐的。</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> Column 1 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 2 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 3 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1    </span><span class="token punctuation">|</span><span class="token table-data"> Text2    </span><span class="token punctuation">|</span><span class="token table-data"> Text3    </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text4    </span><span class="token punctuation">|</span><span class="token table-data"> Text5    </span><span class="token punctuation">|</span><span class="token table-data"> Text6    </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Text1</td><td>Text2</td><td>Text3</td></tr><tr><td>Text4</td><td>Text5</td><td>Text6</td></tr></tbody></table><span id="more"></span><h2 id="对齐方法">对齐方法</h2><p>默认是左对齐，但是如果希望自定义对齐方法也是可以的.</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> 预设对齐 </span><span class="token punctuation">|</span><span class="token table-header important"> 靠左对齐 </span><span class="token punctuation">|</span><span class="token table-header important"> 靠右对齐 </span><span class="token punctuation">|</span><span class="token table-header important"> 置中对齐 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">-----</span> <span class="token punctuation">|</span> <span class="token punctuation">:-----</span> <span class="token punctuation">|</span> <span class="token punctuation">-----:</span> <span class="token punctuation">|</span> <span class="token punctuation">:-----:</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1 </span><span class="token punctuation">|</span><span class="token table-data"> Text2 </span><span class="token punctuation">|</span><span class="token table-data"> Text3 </span><span class="token punctuation">|</span><span class="token table-data"> Text4 </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text5 </span><span class="token punctuation">|</span><span class="token table-data"> Text6 </span><span class="token punctuation">|</span><span class="token table-data"> Text7 </span><span class="token punctuation">|</span><span class="token table-data"> Text8 </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text9 </span><span class="token punctuation">|</span><span class="token table-data"> Text10 </span><span class="token punctuation">|</span><span class="token table-data"> Text11 </span><span class="token punctuation">|</span><span class="token table-data"> Text12 </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>预设对齐</th><th style="text-align: left;">靠左对齐</th><th style="text-align: right;">靠右对齐</th><th style="text-align: center;">置中对齐</th></tr></thead><tbody><tr><td>Text1</td><td style="text-align: left;">Text2</td><td style="text-align: right;">Text3</td><td style="text-align: center;">Text4</td></tr><tr><td>Text5</td><td style="text-align: left;">Text6</td><td style="text-align: right;">Text7</td><td style="text-align: center;">Text8</td></tr><tr><td>Text9</td><td style="text-align: left;">Text10</td><td style="text-align: right;">Text11</td><td style="text-align: center;">Text12</td></tr></tbody></table><h2 id="表内换行">表内换行</h2><p>可以使用html标签<code>&lt;br&gt;</code>实现换行。</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> Column 1 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 2 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 3 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1    </span><span class="token punctuation">|</span><span class="token table-data"> Text2    </span><span class="token punctuation">|</span><span class="token table-data"> Text3    </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text4    </span><span class="token punctuation">|</span><span class="token table-data"> Text5    </span><span class="token punctuation">|</span><span class="token table-data"> Text6<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">></span></span>Text7    </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Text1</td><td>Text2</td><td>Text3</td></tr><tr><td>Text4</td><td>Text5</td><td>Text6<br>Text7</td></tr></tbody></table><h2 id="特殊符号绘制">特殊符号绘制</h2><p>由于<code>|</code>有特殊意义，所以不能直接在表内使用。可以使用<code>&amp;#124</code>来绘制<code>|</code>。</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> Column 1 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 2 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 3 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1    </span><span class="token punctuation">|</span><span class="token table-data"> Text2    </span><span class="token punctuation">|</span><span class="token table-data"> Text3    </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text4    </span><span class="token punctuation">|</span><span class="token table-data"> Text5    </span><span class="token punctuation">|</span><span class="token table-data"> Text6<span class="token entity" title="&#124;">&amp;#124;</span>Text7   </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Text1</td><td>Text2</td><td>Text3</td></tr><tr><td>Text4</td><td>Text5</td><td>Text6 |Text7</td></tr></tbody></table><p>当你希望表中有空行的时候，直接不填东西是不行的。</p><p>例如：</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> Column 1 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 2 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 3 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1    </span><span class="token punctuation">|</span><span class="token table-data"> Text2    </span><span class="token punctuation">|</span><span class="token table-data"> Text 3   </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data">          </span><span class="token punctuation">|</span><span class="token table-data">          </span><span class="token punctuation">|</span><span class="token table-data">          </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text4    </span><span class="token punctuation">|</span><span class="token table-data"> Text5    </span><span class="token punctuation">|</span><span class="token table-data"> Text6    </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Text1</td><td>Text2</td><td>Text 3</td></tr><tr><td></td><td></td><td></td></tr><tr><td>Text4</td><td>Text5</td><td>Text6</td></tr></tbody></table><p>可以看到，中间一行直接凭空消失了。因为markdown会忽视没有填任何东西的行。</p><p>正确的写法是用<code>&amp;nbsp;</code>占位。</p><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown"><span class="token table"><span class="token table-header-row"><span class="token punctuation">|</span><span class="token table-header important"> Column 1 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 2 </span><span class="token punctuation">|</span><span class="token table-header important"> Column 3 </span><span class="token punctuation">|</span></span><span class="token table-line"><span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span> <span class="token punctuation">--------</span> <span class="token punctuation">|</span></span><span class="token table-data-rows"><span class="token punctuation">|</span><span class="token table-data"> Text1    </span><span class="token punctuation">|</span><span class="token table-data"> Text2    </span><span class="token punctuation">|</span><span class="token table-data"> Text 3   </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> <span class="token entity named-entity" title="&nbsp;">&amp;nbsp;</span>   </span><span class="token punctuation">|</span><span class="token table-data">          </span><span class="token punctuation">|</span><span class="token table-data">          </span><span class="token punctuation">|</span><span class="token punctuation">|</span><span class="token table-data"> Text4    </span><span class="token punctuation">|</span><span class="token table-data"> Text5    </span><span class="token punctuation">|</span><span class="token table-data"> Text6    </span><span class="token punctuation">|</span></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>Text1</td><td>Text2</td><td>Text 3</td></tr><tr><td> </td><td></td><td></td></tr><tr><td>Text4</td><td>Text5</td><td>Text6</td></tr></tbody></table><p>这样一来，原本没有内容的一行就不会被忽视了。</p><h2 id="复杂符号绘制">复杂符号绘制</h2><p>例如<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">a_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>这样有上标下标的符号；以及<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>这样的希腊符号，可以通过Latex实现，表格内部是支持Latex的。</p><p>在表格里面通过</p><pre class="line-numbers language-none"><code class="language-none">$具体Latex语句$<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>可以插入复杂符号。</p><p>例如:</p><pre class="line-numbers language-none"><code class="language-none">| $a_&#123;j&#125;$ | $x^&#123;n&#125;$ | $\theta$ || :-------: | :-------: | :--------: ||   Text1   |   Text2   |   Text3    ||   Text4   |   Text5   |   Text6    |<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>效果如下：</p><table><thead><tr><th style="text-align: center;"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">a_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th style="text-align: center;"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span></th><th style="text-align: center;"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span></th></tr></thead><tbody><tr><td style="text-align: center;">Text1</td><td style="text-align: center;">Text2</td><td style="text-align: center;">Text3</td></tr><tr><td style="text-align: center;">Text4</td><td style="text-align: center;">Text5</td><td style="text-align: center;">Text6</td></tr></tbody></table><h1 id="复杂表格绘制">复杂表格绘制</h1><p>如果要画更加复杂的表格，例如要合并单元格的话，markdown自带的表格绘制方法就不适用了。</p><p>需要通过html的方法实现单元格合并。</p><h2 id="画一张表-1">画一张表</h2><p>首先用html画一个简单的表格：</p><pre class="line-numbers language-none"><code class="language-none">&lt;table border&#x3D;&quot;1&quot; width&#x3D;&quot;600px&quot; cellspacing&#x3D;&quot;10&quot;&gt;    &lt;tr&gt;        &lt;th&gt;Column 1&lt;&#x2F;th&gt;         &lt;th&gt;Column 2&lt;&#x2F;th&gt;         &lt;th&gt;Column 3&lt;&#x2F;th&gt;     &lt;&#x2F;tr&gt;    &lt;tr&gt;        &lt;td&gt;Text1&lt;&#x2F;td&gt;         &lt;td&gt;Text2&lt;&#x2F;td&gt;         &lt;td&gt;Text3&lt;&#x2F;td&gt;     &lt;&#x2F;tr&gt;    &lt;tr&gt;        &lt;td&gt;Text4&lt;&#x2F;td&gt;         &lt;td&gt;Text5&lt;&#x2F;td&gt;         &lt;td&gt;Text6&lt;&#x2F;td&gt;     &lt;&#x2F;tr&gt;&lt;&#x2F;table&gt;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><table border="1" width="600px" cellspacing="10"><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr><tr><td>Text1</td><td>Text2</td><td>Text3</td></tr><tr><td>Text4</td><td>Text5</td><td>Text6</td></tr></table><p>其中<code>&lt;th&gt;</code>表示标题、<code>&lt;td&gt;</code>表示内容。</p><h2 id="对齐方法-1">对齐方法</h2><p>可以设置<code>align</code>来自定义对齐： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span> <span class="token attr-name">border</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600px<span class="token punctuation">"</span></span> <span class="token attr-name">cellspacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>left<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>right<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>left<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>right<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>left<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text4<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text5<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>right<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text6<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><table border="1" width="600px" cellspacing="10"><tr><th align="left">Column 1</th><th align="center">Column 2</th><th align="right">Column 3</th></tr><tr><td align="left">Text1</td><td align="center">Text2</td><td align="right">Text3</td></tr><tr><td align="left">Text4</td><td align="center">Text5</td><td align="right">Text6</td></tr></table><h2 id="复杂符号绘制-1">复杂符号绘制</h2><p>在html中，需要通过： <pre class="line-numbers language-none"><code class="language-none">$具体Latex语句$<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 插入复杂符号。</p><pre class="line-numbers language-none"><code class="language-none">&lt;table border&#x3D;&quot;1&quot; width&#x3D;&quot;600px&quot; cellspacing&#x3D;&quot;10&quot;&gt;    &lt;tr&gt;        &lt;th align&#x3D;&quot;center&quot;&gt;$a_&#123;j&#125;$&lt;&#x2F;th&gt;         &lt;th align&#x3D;&quot;center&quot;&gt;$x^&#123;n&#125;$&lt;&#x2F;th&gt;         &lt;th align&#x3D;&quot;center&quot;&gt;$\sigma$&lt;&#x2F;th&gt;     &lt;&#x2F;tr&gt;    &lt;tr&gt;  &lt;td align&#x3D;&quot;center&quot;&gt;Text1&lt;&#x2F;td&gt;         &lt;td align&#x3D;&quot;center&quot;&gt;Text2&lt;&#x2F;td&gt;         &lt;td align&#x3D;&quot;center&quot;&gt;Text3&lt;&#x2F;td&gt;     &lt;&#x2F;tr&gt;    &lt;tr&gt;        &lt;td align&#x3D;&quot;center&quot;&gt;Text4&lt;&#x2F;td&gt;         &lt;td align&#x3D;&quot;center&quot;&gt;Text5&lt;&#x2F;td&gt;         &lt;td align&#x3D;&quot;center&quot;&gt;Text6&lt;&#x2F;td&gt;     &lt;&#x2F;tr&gt;&lt;&#x2F;table&gt;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><table border="1" width="600px" cellspacing="10"><tr><th align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">a_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>x</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span></th><th align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span></span></span></span></th></tr><tr><td align="center">Text1</td><td align="center">Text2</td><td align="center">Text3</td></tr><tr><td align="center">Text4</td><td align="center">Text5</td><td align="center">Text6</td></tr></table><h2 id="合并单元格">合并单元格</h2><h3 id="合并行">合并行</h3><p>可以通过<code>colspan</code>实现行的合并。</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span> <span class="token attr-name">border</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600px<span class="token punctuation">"</span></span> <span class="token attr-name">cellspacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text4<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text5<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text6<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><table border="1" width="600px" cellspacing="10"><tr><th colspan="2" align="center">Column 1</th><th align="center">Column 2</th></tr><tr><td align="center">Text1</td><td align="center">Text2</td><td align="center">Text3</td></tr><tr><td align="center">Text4</td><td align="center">Text5</td><td align="center">Text6</td></tr></table><p>这样一来，第一行前两列就成功合并了，以此类推如果想要合并前三列，把<code>colspan="2"</code>改成<code>colspan="3"</code>就可以实现。</p><h3 id="合并列">合并列</h3><p>可以通过<code>rowspan</code>实现行的合并。</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span> <span class="token attr-name">border</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600px<span class="token punctuation">"</span></span> <span class="token attr-name">cellspacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text4<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text5<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><table border="1" width="600px" cellspacing="10"><tr><th align="center">Column 1</th><th align="center">Column 2</th><th align="center">Column 3</th></tr><tr><td align="center">Text1</td><td align="center">Text2</td><td rowspan="2" align="center">Text3</td></tr><tr><td align="center">Text4</td><td align="center">Text5</td></tr></table><p>这样一来，第三列后两列就成功合并了，以此类推如果想要合并更多三列，把<code>colspan="2"</code>的<code>2</code>改成其他数字就可以实现。</p><p>不过要注意的是，合并列以后，上面的行会占用下面的行，也就是说下面的行要减少相应的列。比如上述例子中，第二行的第三列的<code>rowspan</code>设置为2（列数跨度为2），那么也就是说，这个格子会占用第三行的一列，所以第三行应该少设置一列。</p><h2 id="同时合并行和列">同时合并行和列</h2><p>同时使用<code>colspan</code>和<code>rowspan</code>可以实现同时合并行和列<pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>table</span> <span class="token attr-name">border</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600px<span class="token punctuation">"</span></span> <span class="token attr-name">cellspacing</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>th</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Column 3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>th</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>tr</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>td</span> <span class="token attr-name">align</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Text3<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>td</span><span class="token punctuation">></span></span>     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>tr</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>table</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><table border="1" width="600px" cellspacing="10"><tr><th align="center">Column 1</th><th align="center">Column 2</th><th align="center">Column 3</th></tr><tr><td align="center">Text1</td><td colspan="2" rowspan="2" align="center">Text2</td></tr><tr><td align="center">Text3</td></tr></table><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;基础表格绘制&quot;&gt;基础表格绘制&lt;/h1&gt;
&lt;h2 id=&quot;画一张表&quot;&gt;画一张表&lt;/h2&gt;
&lt;p&gt;表格的基本语法如下，第一行是表格的标题行，第二行固定以
&lt;code&gt;---&lt;/code&gt; 做分隔，列通过使用 &lt;code&gt;|&lt;/code&gt;
來添加。宽度是自动分配的，如果第二行和第一行列数不一样也会自动对齐（但是会不美观）。空格会被忽视掉。&lt;code&gt;|&lt;/code&gt;没有对齐也没有关系，最后形成的表格都是会自动对齐的。&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-markdown&quot; data-language=&quot;markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;
&lt;span class=&quot;token table&quot;&gt;&lt;span class=&quot;token table-header-row&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Column 1 &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Column 2 &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-header important&quot;&gt; Column 3 &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;--------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;--------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;--------&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token table-data-rows&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text1    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text2    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text3    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text4    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text5    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token table-data&quot;&gt; Text6    &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;效果如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column 1&lt;/th&gt;
&lt;th&gt;Column 2&lt;/th&gt;
&lt;th&gt;Column 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Text1&lt;/td&gt;
&lt;td&gt;Text2&lt;/td&gt;
&lt;td&gt;Text3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text4&lt;/td&gt;
&lt;td&gt;Text5&lt;/td&gt;
&lt;td&gt;Text6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Markdown" scheme="https://fallingnight.com/tags/Markdown/"/>
    
    <category term="Latex" scheme="https://fallingnight.com/tags/Latex/"/>
    
    <category term="html" scheme="https://fallingnight.com/tags/html/"/>
    
  </entry>
  
  <entry>
    <title>单纯形法算法详解</title>
    <link href="https://fallingnight.com/2024/12/10/%E5%8D%95%E7%BA%AF%E5%BD%A2%E6%B3%95%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/"/>
    <id>https://fallingnight.com/2024/12/10/%E5%8D%95%E7%BA%AF%E5%BD%A2%E6%B3%95%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/</id>
    <published>2024-12-10T15:45:29.000Z</published>
    <updated>2025-09-13T12:37:29.501Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="用处">用处</h1><p>单纯形法是一种线性规划迭代算法，能够在有限步内找到线性规划问题的最优解(如果解存在的话)。</p><h1 id="算法步骤">算法步骤</h1><p>以下述线性规划问题为例： <span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>max</mi><mo>⁡</mo><mi>z</mi><mo>=</mo><mn>2</mn><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>3</mn><msub><mi>x</mi><mn>2</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>s.t.</mtext><mspace width="1em"/><mrow><mo fence="true">{</mo><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>2</mn><msub><mi>x</mi><mn>2</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≤</mo><mn>8</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mn>4</mn><msub><mi>x</mi><mn>1</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≤</mo><mn>16</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mn>4</mn><msub><mi>x</mi><mn>2</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≤</mo><mn>12</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≥</mo><mn>0</mn></mrow></mstyle></mtd></mtr></mtable></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\max z = 2x_{1} + 3x_{2} \\\text{s.t.} \quad \left\{\begin{aligned}  x_{1} + 2x_{2} &amp;\le 8 \\  4x_{1}         &amp;\le 16 \\  4x_{2}         &amp;\le 12 \\  x_{1}, x_{2}   &amp;\ge 0\end{aligned}\right.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.8em;vertical-align:-3.65em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.15em;"><span style="top:-8.56em;"><span class="pstrut" style="height:5.25em;"></span><span class="mord"><span class="mop">max</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-4.65em;"><span class="pstrut" style="height:5.25em;"></span><span class="mord"><span class="mord text"><span class="mord">s.t.</span></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-1.366em;"><span class="pstrut" style="height:3.216em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-1.358em;"><span class="pstrut" style="height:3.216em;"></span><span style="height:1.216em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="1.216em" style="width:0.8889em" viewBox="0 0 888.89 1216" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V1216 H384z M384 0 H504 V1216 H384z"/></svg></span></span><span style="top:-3.216em;"><span class="pstrut" style="height:3.216em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.358em;"><span class="pstrut" style="height:3.216em;"></span><span style="height:1.216em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="1.216em" style="width:0.8889em" viewBox="0 0 888.89 1216" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V1216 H384z M384 0 H504 V1216 H384z"/></svg></span></span><span style="top:-5.566em;"><span class="pstrut" style="height:3.216em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.75em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-0.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.75em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em;"><span style="top:-5.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">8</span></span></span><span style="top:-3.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">16</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">12</span></span></span><span style="top:-0.91em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.75em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.65em;"><span></span></span></span></span></span></span></span></span></span></span></span>其中，第一行是线性目标，大括号里面的内容是约束条件。 <span id="more"></span></p><h2 id="化为标准型">化为标准型</h2><ul><li><p>确定线性目标是求的max问题，如果是min问题，则将等号两边都乘以-1，从而转变为max问题。</p></li><li><p>确定最后一行的每一个x都大于等于0，如果有小于等于的x，则将那个x变成两个大于等于0的数的相减。​例如：如果<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>≤</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x_{1}\le0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.786em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，则<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以化成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msubsup><mo>−</mo><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mrow><mo mathvariant="normal">′</mo><mo mathvariant="normal">′</mo></mrow></msup></msubsup></mrow><annotation encoding="application/x-tex">x_{1}^{&#x27;}-x_{1}^{&#x27;&#x27;}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span></span></span></span>。​转换以后将最后一行变成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msubsup><mo>≥</mo><mn>0</mn><mo separator="true">,</mo><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mrow><mo mathvariant="normal">′</mo><mo mathvariant="normal">′</mo></mrow></msup></msubsup><mo>≥</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x_{1}^{&#x27;}\ge 0, x_{1}^{&#x27;&#x27;}\ge 0, x_{2}\ge 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，将最后一行以外约束条件里面的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>也变成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msubsup><mo>−</mo><msubsup><mi>x</mi><mn>1</mn><msup><mrow></mrow><mrow><mo mathvariant="normal">′</mo><mo mathvariant="normal">′</mo></mrow></msup></msubsup></mrow><annotation encoding="application/x-tex">x_{1}^{&#x27;}-x_{1}^{&#x27;&#x27;}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1906em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em;"><span style="top:-2.931em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′′</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span></span></span></span>。</p></li><li><p>确定最后一行以外的约束条件都是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\le</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span>，如果有<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≥</mo></mrow><annotation encoding="application/x-tex">\ge</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≥</span></span></span></span>，则不等号两边乘以-1从而变号为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\le</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span>。</p></li><li><p>单纯形法硬性要求后续约束条件化成的矩阵中存在单位矩阵，所以对于没有单位矩阵的情况，需要手动凑单位矩阵。除最后一行以外的约束条件有几行，就增加几个额外的大于等于0的变量用于凑单位矩阵。例如：上述线性规划问题凑完以后的结果为： <span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>max</mi><mo>⁡</mo><mi>z</mi><mo>=</mo><mn>2</mn><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>3</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>3</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>4</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>s.t.</mtext><mspace width="1em"/><mrow><mo fence="true">{</mo><mtable rowspacing="0.16em" columnalign="right center left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>2</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>8</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>4</mn><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>x</mi><mn>4</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>16</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>4</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>12</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>3</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>4</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">≥</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr></mtable></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\max z = 2x_{1} + 3x_{2} + 0x_{3} + 0x_{4} + 0x_{5} \\\text{s.t.} \quad\left\{\begin{array}{rcl}  x_{1} + 2x_{2} + x_{3} &amp; = &amp; 8 \\  4x_{1} + x_{4} &amp; = &amp; 16 \\  4x_{2} + x_{5} &amp; = &amp; 12 \\  x_{1}, x_{2}, x_{3}, x_{4}, x_{5} &amp; \ge &amp; 0\end{array}\right.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.6em;vertical-align:-3.05em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.55em;"><span style="top:-7.36em;"><span class="pstrut" style="height:4.65em;"></span><span class="mord"><span class="mop">max</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-4.05em;"><span class="pstrut" style="height:4.65em;"></span><span class="mord"><span class="mord text"><span class="mord">s.t.</span></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-1.9em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-1.892em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.616em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.616em" style="width:0.8889em" viewBox="0 0 888.89 616" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V616 H384z M384 0 H504 V616 H384z"/></svg></span></span><span style="top:-3.15em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.292em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.616em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.616em" style="width:0.8889em" viewBox="0 0 888.89 616" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V616 H384z M384 0 H504 V616 H384z"/></svg></span></span><span style="top:-4.9em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">≥</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">8</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span></span></span></span></span></span></span></span></span></span></span></span>增加了三个新的变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>4</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}, x_{4}, x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,这样不仅凑出了单位矩阵(后续解释)，而且还去掉了不等号。</p></li><li><p>将其余每一行缺失的变量都用0补上，得到最终化为标准型的结果为：<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right" columnspacing=""><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>max</mi><mo>⁡</mo><mi>z</mi><mo>=</mo><mn>2</mn><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>3</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>3</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>4</mn></msub><mo>+</mo><mn>0</mn><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mtext>s.t.</mtext><mspace width="1em"/><mrow><mo fence="true">{</mo><mtable rowspacing="0.16em" columnalign="center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mn>2</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>8</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>4</mn><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>x</mi><mn>4</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>16</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>4</mn><msub><mi>x</mi><mn>2</mn></msub><mo>+</mo><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>12</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>3</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>4</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>5</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">≥</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr></mtable></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\max z = 2x_{1} + 3x_{2} + 0x_{3} + 0x_{4} + 0x_{5} \\\text{s.t.} \quad\left\{\begin{matrix}  x_{1} + 2x_{2} + x_{3} &amp; = &amp; 8 \\  4x_{1} + x_{4} &amp; = &amp; 16 \\  4x_{2} + x_{5} &amp; = &amp; 12 \\  x_{1}, x_{2}, x_{3}, x_{4}, x_{5} &amp; \ge &amp; 0\end{matrix}\right.\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.6em;vertical-align:-3.05em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.55em;"><span style="top:-7.36em;"><span class="pstrut" style="height:4.65em;"></span><span class="mord"><span class="mop">max</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-4.05em;"><span class="pstrut" style="height:4.65em;"></span><span class="mord"><span class="mord text"><span class="mord">s.t.</span></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-1.9em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-1.892em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.616em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.616em" style="width:0.8889em" viewBox="0 0 888.89 616" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V616 H384z M384 0 H504 V616 H384z"/></svg></span></span><span style="top:-3.15em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.292em;"><span class="pstrut" style="height:3.15em;"></span><span style="height:0.616em;width:0.8889em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.8889em" height="0.616em" style="width:0.8889em" viewBox="0 0 888.89 616" preserveAspectRatio="xMinYMin"><path d="M384 0 H504 V616 H384z M384 0 H504 V616 H384z"/></svg></span></span><span style="top:-4.9em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">≥</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">8</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span></span></span></span></span></span></span></span></span></span></span></span></p></li></ul><h2 id="列出初始单纯形表">列出初始单纯形表</h2><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><p>规则如下：</p><ol type="1"><li>列数等于变量的个数。</li><li>行数等于大括号中多变量的式子的个数。</li><li>对于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>行的数字根据目标函数中各变量的系数找。</li><li>每个变量所在列的数字根据大括号中多变量式子中该变量的系数找。</li><li>找出变量下方已填写数字构成的矩阵中的单位矩阵，依次将单位矩阵对应的变量写在“基”那一列的下面。</li><li>将5中找到的变量上方的数字依次写在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>那一列的下面。</li><li>将大括号中多变量式子右侧数字依次填到b那一列的下面。</li></ol><h2 id="找出可行解">找出可行解</h2><p>令“基”所在列的变量与b所在列的数字对应相等，再令其他变量等于0。</p><p>即<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mrow><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>8</mn><mo separator="true">,</mo><mn>16</mn><mo separator="true">,</mo><mn>12</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X^{(0)}=(0,0,8,16,12)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">0</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">8</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">16</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">12</span><span class="mclose">)</span></span></span></span>。</p><h2 id="求出检验数">求出检验数</h2><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr></table><p>检验数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>计算公式如下：</p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub><mo>=</mo><msub><mi>c</mi><mi>j</mi></msub><mo>−</mo><mo stretchy="false">(</mo><msub><mi>c</mi><mrow><mi>B</mi><mn>1</mn></mrow></msub><mo>⋅</mo><msub><mi>x</mi><mrow><mi>j</mi><mn>1</mn></mrow></msub><mo>+</mo><msub><mi>c</mi><mrow><mi>B</mi><mn>2</mn></mrow></msub><mo>⋅</mo><msub><mi>x</mi><mrow><mi>j</mi><mn>2</mn></mrow></msub><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sigma_{j}=c_{j}-(c_{B1}\cdot x_{j1}+c_{B2}\cdot x_{j2}+...)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5945em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">...</span><span class="mclose">)</span></span></span></span><p>例如：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mn>1</mn></msub><mo>=</mo><msub><mi>c</mi><mn>1</mn></msub><mo>−</mo><mo stretchy="false">(</mo><msub><mi>c</mi><mrow><mi>B</mi><mn>1</mn></mrow></msub><mo>⋅</mo><msub><mi>x</mi><mn>11</mn></msub><mo>+</mo><msub><mi>c</mi><mrow><mi>B</mi><mn>2</mn></mrow></msub><mo>⋅</mo><msub><mi>x</mi><mn>12</mn></msub><mo>+</mo><msub><mi>c</mi><mrow><mi>B</mi><mn>3</mn></mrow></msub><mo>⋅</mo><msub><mi>x</mi><mn>13</mn></msub><mo stretchy="false">)</mo><mo>=</mo><mn>2</mn><mo>−</mo><mo stretchy="false">(</mo><mn>0</mn><mo>⋅</mo><mn>1</mn><mo>+</mo><mn>0</mn><mo>⋅</mo><mn>4</mn><mo>+</mo><mn>0</mn><mo>⋅</mo><mn>0</mn><mo stretchy="false">)</mo><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">\sigma_{1}=c_{1}-(c_{B1}\cdot x_{11}+c_{B2}\cdot x_{12}+c_{B3}\cdot x_{13})=2-(0\cdot 1+0\cdot 4+0\cdot 0)=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">11</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5945em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">12</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5945em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">13</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span></p><h2 id="判断最优解">判断最优解</h2><p>观察一下<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>这一行的数字看一下是否都<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\le</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span>0，</p><p>若这些数字都<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\le</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span>，则找到的可行解是最优解。</p><p>若这些数字有&gt;0的，则该可行解不是最优解，需继续进行下一步。</p><h2 id="获取入基变量">获取入基变量</h2><p>找到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>行最大的数字那一列对应的变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>作为入基变量。</p><p>在本例中，此时的最大<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>为3，其对应的变量是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><h2 id="获取出基变量">获取出基变量</h2><p>求出<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub><mo>=</mo><msub><mi>b</mi><mi>i</mi></msub><mo>÷</mo><msub><mi>x</mi><mrow><mi>a</mi><mi>i</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\theta_{i}=b_{i}\div x_{ai}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ai</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mrow><mi>a</mi><mi>i</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{ai}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ai</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是入基变量对应的那一列。</p><p>若<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\theta\ge 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8304em;vertical-align:-0.136em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，则把<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>的值填到表中；</p><p>若<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>≤</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\theta\le 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8304em;vertical-align:-0.136em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，则不用把<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>的值填到表中；</p><p>若<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>无意义，则不用把<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>填到表中。</p><p>注意：若求出的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>都<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>≤</mo></mrow><annotation encoding="application/x-tex">\le</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mrel">≤</span></span></span></span>0，则该线性规划问题的解为无解解。</p><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td>4</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td>3</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr></table><p>在本例中： <span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>θ</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><msub><mi>b</mi><mn>1</mn></msub><msub><mi>x</mi><mn>21</mn></msub></mfrac><mo>=</mo><mfrac><mn>8</mn><mn>2</mn></mfrac><mo>=</mo><mn>4</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>θ</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><msub><mi>b</mi><mn>2</mn></msub><msub><mi>x</mi><mn>22</mn></msub></mfrac><mo>=</mo><mfrac><mn>16</mn><mn>0</mn></mfrac><mspace width="1em"/><mtext>(无意义)</mtext></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>θ</mi><mn>3</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><msub><mi>b</mi><mn>3</mn></msub><msub><mi>x</mi><mn>23</mn></msub></mfrac><mo>=</mo><mfrac><mn>12</mn><mn>4</mn></mfrac><mo>=</mo><mn>3</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\theta_{1} &amp;= \frac{b_{1}}{x_{21}} = \frac{8}{2} = 4 \\\theta_{2} &amp;= \frac{b_{2}}{x_{22}} = \frac{16}{0} \quad \text{(无意义)} \\\theta_{3} &amp;= \frac{b_{3}}{x_{23}} = \frac{12}{4} = 3\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.5223em;vertical-align:-3.5112em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.0112em;"><span style="top:-6.0112em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5037em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-0.9963em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.5112em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.0112em;"><span style="top:-6.0112em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">21</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">8</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">4</span></span></span><span style="top:-3.5037em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">22</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:1em;"></span><span class="mord text"><span class="mord">(</span><span class="mord cjk_fallback">无意义</span><span class="mord">)</span></span></span></span><span style="top:-0.9963em;"><span class="pstrut" style="height:3.3714em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">23</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.5112em;"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>找到表中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>最小值对应“基”列的变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_{b}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>作为出基变量。</p><p>在本例中，最小的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">\theta_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，故其对应的变量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>作为出基变量。</p><h2 id="绘制下一轮单纯形表">绘制下一轮单纯形表</h2><p>在原基础上对单纯形表进行扩展:</p><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td>4</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td>3</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr><tr><td></td><td> </td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td> </td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td> </td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><h2 id="处理出入基变量">处理出入基变量</h2><p>找到上一轮中入基变量对应列和出基变量对应行交叉的数字m并填入新一轮的表中。(本轮中的m是4)</p><p>在新表中用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>(入基)上面的数字代替<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_{b}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>(出基)前面的数字，用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>代替<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_{b}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，其余变量不变。(本例中用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>替换“基”中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>)</p><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td>4</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td>3</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>3</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td>4</td><td></td><td></td><td></td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><h2 id="矩阵运算">矩阵运算</h2><p>对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub><mtext>、</mtext><msub><mi>x</mi><mn>2</mn></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>x</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">x_{1}\text{、}x_{2}...x_{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord cjk_fallback">、</span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与b列组成的矩阵进行运算，将m变成1，同列其他元素变成0，形成一个新的矩阵，将该矩阵中的数字填入表格中对应的位置形成新的单纯新表。</p><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td>4</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td>3</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>1</td><td>0</td><td>1</td><td>0</td><td>-1/2</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td></td></tr><tr><td>3</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>3</td><td>0</td><td>1</td><td>0</td><td>0</td><td>1/4</td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table><h2 id="找出可行解-1">找出可行解</h2><p>和之前一样，得到可行解为：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>16</mn><mo separator="true">,</mo><mn>0</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X^{(1)}=(0,3,2,16,0)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">16</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mclose">)</span></span></span></span>。</p><h2 id="继续迭代">继续迭代</h2><p>接下来继续计算检验数判断最优解获取入基/出基变量绘制下一轮单纯形表处理出入基变量矩阵运算找出可行解计算检验数……</p><p>之后就是一直按照上述步骤进行迭代，直到检验数全部小于等于0，则说明此时可行解是最优解。</p><table border="1" width="600px" cellspacing="10"><tr><th colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">c_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></th><th>2</th><th>3</th><th>0</th><th>0</th><th>0</th><th rowspan="2" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta _{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></th></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">c_{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>基</td><td>b</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>1</td><td>2</td><td>1</td><td>0</td><td>0</td><td>4</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>12</td><td>0</td><td>4</td><td>0</td><td>0</td><td>1</td><td>3</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>3</td><td>0</td><td>0</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">x_{3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>1</td><td>0</td><td>1</td><td>0</td><td>-1/2</td><td>2</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>16</td><td>4</td><td>0</td><td>0</td><td>1</td><td>0</td><td>4</td></tr><tr><td>3</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>3</td><td>0</td><td>1</td><td>0</td><td>0</td><td>1/4</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>0</td><td>0</td><td>0</td><td>-3/4</td><td></td></tr><tr><td>2</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>1</td><td>0</td><td>1</td><td>0</td><td>-1/2</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">×</span></span></span></span></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>4</mn></msub></mrow><annotation encoding="application/x-tex">x_{4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>8</td><td>0</td><td>0</td><td>-4</td><td>1</td><td>2</td><td>4</td></tr><tr><td>3</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>3</td><td>0</td><td>1</td><td>0</td><td>0</td><td>1/4</td><td>12</td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>0</td><td>0</td><td>-2</td><td>0</td><td>1/4</td><td></td></tr><tr><td>2</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_{1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>4</td><td>1</td><td>0</td><td>0</td><td>1/4</td><td>0</td><td></td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>5</mn></msub></mrow><annotation encoding="application/x-tex">x_{5}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>4</td><td>0</td><td>0</td><td>-2</td><td>1/2</td><td>1</td><td></td></tr><tr><td>3</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">x_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td>2</td><td>0</td><td>1</td><td>1/2</td><td>-1/8</td><td>0</td><td></td></tr><tr><td colspan="3" align="center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></td><td>0</td><td>0</td><td>-3/2</td><td>0</td><td>0</td><td></td></tr></table><p>第四轮迭代中检验数全部小于等于0，所以计算结束。</p><p>此时可行解为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X^{(3)}=(4,2,0,0,4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span>。</p><p>即本线性规划问题的最优解为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mrow><mo stretchy="false">(</mo><mo>∗</mo><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">X^{(*)}=(4,2,0,0,4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">∗</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span>。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;用处&quot;&gt;用处&lt;/h1&gt;
&lt;p&gt;单纯形法是一种线性规划迭代算法，能够在有限步内找到线性规划问题的最优解(如果解存在的话)。&lt;/p&gt;
&lt;h1 id=&quot;算法步骤&quot;&gt;算法步骤&lt;/h1&gt;
&lt;p&gt;以下述线性规划问题为例： &lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right&quot; columnspacing=&quot;&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mtext&gt;s.t.&lt;/mtext&gt;&lt;mspace width=&quot;1em&quot;/&gt;&lt;mrow&gt;&lt;mo fence=&quot;true&quot;&gt;{&lt;/mo&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right left&quot; columnspacing=&quot;0em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;16&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;≥&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;
&#92;begin{aligned}
&#92;max z = 2x_{1} + 3x_{2} &#92;&#92;
&#92;text{s.t.} &#92;quad 
&#92;left&#92;{
&#92;begin{aligned}
  x_{1} + 2x_{2} &amp;amp;&#92;le 8 &#92;&#92;
  4x_{1}         &amp;amp;&#92;le 16 &#92;&#92;
  4x_{2}         &amp;amp;&#92;le 12 &#92;&#92;
  x_{1}, x_{2}   &amp;amp;&#92;ge 0
&#92;end{aligned}
&#92;right.
&#92;end{aligned}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:7.8em;vertical-align:-3.65em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:4.15em;&quot;&gt;&lt;span style=&quot;top:-8.56em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:5.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mop&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.04398em;&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-4.65em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:5.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;s.t.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:1em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;minner&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;&lt;span class=&quot;delimsizing mult&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:3.25em;&quot;&gt;&lt;span style=&quot;top:-1.366em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.216em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;delimsizinginner delim-size4&quot;&gt;&lt;span&gt;⎩&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-1.358em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.216em;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;height:1.216em;width:0.8889em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;0.8889em&quot; height=&quot;1.216em&quot; style=&quot;width:0.8889em&quot; viewBox=&quot;0 0 888.89 1216&quot; preserveAspectRatio=&quot;xMinYMin&quot;&gt;&lt;path d=&quot;M384 0 H504 V1216 H384z M384 0 H504 V1216 H384z&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.216em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.216em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;delimsizinginner delim-size4&quot;&gt;&lt;span&gt;⎨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-4.358em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.216em;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;height:1.216em;width:0.8889em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;0.8889em&quot; height=&quot;1.216em&quot; style=&quot;width:0.8889em&quot; viewBox=&quot;0 0 888.89 1216&quot; preserveAspectRatio=&quot;xMinYMin&quot;&gt;&lt;path d=&quot;M384 0 H504 V1216 H384z M384 0 H504 V1216 H384z&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-5.566em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.216em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;delimsizinginner delim-size4&quot;&gt;&lt;span&gt;⎧&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:2.75em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:3.25em;&quot;&gt;&lt;span style=&quot;top:-5.41em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.91em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.41em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-0.91em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:2.75em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;col-align-l&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:3.25em;&quot;&gt;&lt;span style=&quot;top:-5.41em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≤&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.91em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≤&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;16&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.41em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≤&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-0.91em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≥&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:2.75em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:3.65em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
其中，第一行是线性目标，大括号里面的内容是约束条件。</summary>
    
    
    
    <category term="学习笔记" scheme="https://fallingnight.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="运筹与优化" scheme="https://fallingnight.com/tags/%E8%BF%90%E7%AD%B9%E4%B8%8E%E4%BC%98%E5%8C%96/"/>
    
    <category term="线性规划" scheme="https://fallingnight.com/tags/%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>用Matlab实现高斯消元法</title>
    <link href="https://fallingnight.com/2024/11/19/%E7%94%A8Matlab%E5%AE%9E%E7%8E%B0%E9%AB%98%E6%96%AF%E6%B6%88%E5%85%83%E6%B3%95/"/>
    <id>https://fallingnight.com/2024/11/19/%E7%94%A8Matlab%E5%AE%9E%E7%8E%B0%E9%AB%98%E6%96%AF%E6%B6%88%E5%85%83%E6%B3%95/</id>
    <published>2024-11-19T09:39:59.000Z</published>
    <updated>2025-04-18T16:07:54.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="函数实现">函数实现</h1><pre class="line-numbers language-matlab" data-language="matlab"><code class="language-matlab"><span class="token keyword">function</span> x <span class="token operator">=</span> <span class="token function">gauss_elim</span><span class="token punctuation">(</span>A<span class="token punctuation">,</span> b<span class="token punctuation">)</span>    <span class="token comment">% 获取矩阵 A 的维度</span>    <span class="token punctuation">[</span>n<span class="token punctuation">,</span> <span class="token operator">~</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">size</span><span class="token punctuation">(</span>A<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">% 扩展矩阵 A 和向量 b 组成增广矩阵 [A|b]</span>    Ab <span class="token operator">=</span> <span class="token punctuation">[</span>A b<span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token comment">% 高斯消元过程</span>    <span class="token keyword">for</span> <span class="token number">i</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span>n        <span class="token comment">% 选取主元素（行交换）</span>        <span class="token punctuation">[</span><span class="token operator">~</span><span class="token punctuation">,</span> maxRow<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token operator">:</span>n<span class="token punctuation">,</span> <span class="token number">i</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">% 找到第 i 列的最大元素</span>        maxRow <span class="token operator">=</span> maxRow <span class="token operator">+</span> <span class="token number">i</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">% 修正为全矩阵的行号</span>        <span class="token keyword">if</span> <span class="token number">i</span> <span class="token operator">~=</span> maxRow            <span class="token comment">% 交换行</span>            <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">i</span><span class="token punctuation">,</span> maxRow<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">:</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token punctuation">[</span>maxRow<span class="token punctuation">,</span> <span class="token number">i</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">:</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">end</span>                <span class="token comment">% 消元过程，消去主元下方的元素</span>        <span class="token keyword">for</span> <span class="token number">j</span> <span class="token operator">=</span> <span class="token number">i</span><span class="token operator">+</span><span class="token number">1</span><span class="token operator">:</span>n            <span class="token comment">% 计算系数</span>            factor <span class="token operator">=</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">j</span><span class="token punctuation">,</span> <span class="token number">i</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">,</span> <span class="token number">i</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token comment">% 更新该行</span>            <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">j</span><span class="token punctuation">,</span> <span class="token operator">:</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">j</span><span class="token punctuation">,</span> <span class="token operator">:</span><span class="token punctuation">)</span> <span class="token operator">-</span> factor <span class="token operator">*</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">,</span> <span class="token operator">:</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">end</span>    <span class="token keyword">end</span>        <span class="token comment">% 回代求解</span>    x <span class="token operator">=</span> <span class="token function">zeros</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">% 初始化解向量</span>    <span class="token keyword">for</span> <span class="token number">i</span> <span class="token operator">=</span> n<span class="token operator">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">:</span><span class="token number">1</span>        <span class="token function">x</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">,</span> <span class="token keyword">end</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token operator">*</span> x<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token function">Ab</span><span class="token punctuation">(</span><span class="token number">i</span><span class="token punctuation">,</span> <span class="token number">i</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">end</span><span class="token keyword">end</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><span id="more"></span><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;函数实现&quot;&gt;函数实现&lt;/h1&gt;
&lt;pre class=&quot;line-numbers language-matlab&quot; data-language=&quot;matlab&quot;&gt;&lt;code class=&quot;language-matlab&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gauss_elim&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;% 获取矩阵 A 的维度&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;A&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;% 扩展矩阵 A 和向量 b 组成增广矩阵 [A|b]&lt;/span&gt;
    Ab &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;A b&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;% 高斯消元过程&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;n
        &lt;span class=&quot;token comment&quot;&gt;% 选取主元素（行交换）&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxRow&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;% 找到第 i 列的最大元素&lt;/span&gt;
        maxRow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; maxRow &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;% 修正为全矩阵的行号&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;~=&lt;/span&gt; maxRow
            &lt;span class=&quot;token comment&quot;&gt;% 交换行&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxRow&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;maxRow&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
        
        &lt;span class=&quot;token comment&quot;&gt;% 消元过程，消去主元下方的元素&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;n
            &lt;span class=&quot;token comment&quot;&gt;% 计算系数&lt;/span&gt;
            factor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;% 更新该行&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; factor &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;% 回代求解&lt;/span&gt;
    x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;% 初始化解向量&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Ab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
    
    
    
    <category term="学习笔记" scheme="https://fallingnight.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="运筹与优化" scheme="https://fallingnight.com/tags/%E8%BF%90%E7%AD%B9%E4%B8%8E%E4%BC%98%E5%8C%96/"/>
    
    <category term="高斯消元法" scheme="https://fallingnight.com/tags/%E9%AB%98%E6%96%AF%E6%B6%88%E5%85%83%E6%B3%95/"/>
    
    <category term="Matlab" scheme="https://fallingnight.com/tags/Matlab/"/>
    
  </entry>
  
  <entry>
    <title>Git和Github基本用法</title>
    <link href="https://fallingnight.com/2024/10/26/Git%E5%92%8CGithub%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/"/>
    <id>https://fallingnight.com/2024/10/26/Git%E5%92%8CGithub%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95/</id>
    <published>2024-10-26T04:59:54.000Z</published>
    <updated>2025-04-18T16:05:54.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="git和github的关系和区别"><ahref="https://git-scm.com/">git</a>和<ahref="https://github.com/">github</a>的关系和区别</h1><h2 id="git"><a href="https://git-scm.com/">git</a></h2><p>说到git，很多初学者的第一印象是github，好像git的用处就是从github仓库clone项目，或者也可以把自己的项目上传到github，但是为什么要上传，也不是很清楚。</p><p>其实，git作为一个分布式版本控制系统，是一个命令行工具，它最根本的功能是用于在本地管理和跟踪文件的更改历史，或者用更好理解的说法，git的基础功能是“存档”。<span id="more"></span></p><p>在打游戏的时候，你会时不时存个档，这样干了什么傻事以后还可以回档，比如你不小心销毁了一件很重要的装备以后，你可以通过回档撤销你干的傻事。同时，有些游戏还支持备份存档，也就是说你可以在这个存档的基础上，复制一个平行的存档，新存档生成的时候和原来的存档游戏进度相同，但是当新存档生成以后，就和原来的存档互不影响了，你可以在备份的存档里面干各种原来不敢在主存档干的事，就算把装备都融了，屋子都炸了也不用在意。有些游戏还支持存档互通，你在备份存档里面打败了新的boss，有了更好的装备，还可以送回主存档，加快主存档的进度。这样一来，坏事影响不了主存档，好事却可以。而存档文件通常不大，100多个G的游戏玩了几个月的存档文件可能还不到100M。有了存档的机制，你玩游戏的时候会更加放松工具自在。</p><p>git差不多就是这么一个玩意，git的本地仓库干的就是存档的活。有时候你会担心把原本良好的代码改坏而蹑手蹑脚，亦或者你有时突然感觉之前的代码更好。如果你每次改代码前都留一个备份，那你的文件夹会看起来很乱，而且每留一版备份，就会多一用倍的存储空间，十分不方便。而git所包含的版本控制功能就很好的解决解决了这个问题。gitcommit对应了游戏中的手动存档;git reset、git revert、gitrestore等命令对应了游戏中的回档;gitbranch对应了游戏中备份了一个平行存档;git checkout对应了切换存档;gitmerge对应了将其他备份存档的装备送到主存档。。。。。。有了这个类别，git的意义也就很好理解了。</p><h2 id="github"><a href="https://github.com/">github</a></h2><p>git并不依赖github，git甚至不联网都能用，git是单人开发的时候也可以使用的工具，便于存档回档而存在。而github却依赖git，github是一个代码托管平台，它利用git来进行版本控制，允许你将本地的git仓库推送到远程，并与他人共享代码。除了github以外，国内还有类似gitee这样功能相似的平台，它们的基本功能是相似的。</p><p>除去让别人看得到自己的代码(开源)以外，github最核心的功能便是多人开发。对于一个多人完成的项目而言，每个成员闭门造车肯定会效率低下。github提供了一个多人协作的良好平台。在一个项目建立的时候，技术负责人创建一个github仓库，创建一个main分支,main分支是门面，是后续发布的根本，所以main分支必须是纯净的，所以在main的基础上创建一个dev分支，dev(develop)分支负责开发，后续的改动都在dev分支上面进行。团队的不同人负责不同的事情，比如张三负责增加菜单，王五负责增加背景音乐，那他们就分别在dev的基础上再分别开一个feature/menu和feature/music分支并在这两个分支上面做开发和改动，当开发的差不多了，就将这两个分支合并到dev分支，当开发到了一个阶段(比如实现了基本功能)，就由负责人在dev分支的基础是建立一个release分支，在这个分支上做最后的调试和bug修复，最后当一切都没有问题了，再由负责人将release合并到main分支。这样一来，main分支的代码始终是纯净的，稳定的，也方便了后续的发布和部署。</p><h1 id="git命令">git命令</h1><h2 id="配置类命令">配置类命令</h2><h3 id="配置全局用户名">配置全局用户名</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.name <span class="token string">"Your Name"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="配置全局邮箱">配置全局邮箱</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.email <span class="token string">"you@example.com"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>配置全局用户名和邮箱有助于多人开发时让别人知道相关提交源自于谁</p><h3 id="设置默认的文本编辑器">设置默认的文本编辑器</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"code --wait"</span>   //vscode<span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"vim"</span>           //vim<span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"subl -n -w"</span>    //sublime text<span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"atom --wait"</span>   //atom<span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"clion --wait"</span>  //clion<span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"charm -w"</span>      //pycharm<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在进行commit操作以后，如果没有增加提交描述，git会强制打开一个默认文本编辑器让你编辑提交描述(一般默认是vim)，对于不熟悉vim的人而言，这会十分麻烦，设置一个趁手的默认文本编辑器会让编辑过程方便一些。</p><h2 id="本地仓库命令">本地仓库命令</h2><h3 id="创建仓库">创建仓库</h3><p>在项目文件夹根目录输入 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> init<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>初始化仓库以后，在根目录会出现一个名为.git的隐藏文件夹(要在文件资源管理器-&gt;查看-&gt;显示中勾选隐藏的项目才能看到)，就是由这个文件夹记录git仓库的各种信息和各种分支、提交。删掉这个文件夹，也就删掉了本地仓库，这时就又要通过gitinit重新创建本地仓库了。</p><h3 id="更改缓存">更改缓存</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">add</span> <span class="token operator">&lt;</span>file<span class="token operator">></span>              //将单个文件添加到暂存区。<span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span>                   //添加当前目录下的所有文件到暂存区。<span class="token function">git</span> reset <span class="token operator">&lt;</span>file<span class="token operator">></span>            //清理特定文件的缓存<span class="token function">git</span> reset                   //清理所有暂存的更改<span class="token function">git</span> restore <span class="token parameter variable">--staged</span> <span class="token operator">&lt;</span>file<span class="token operator">></span> //效果和git reset <span class="token operator">&lt;</span>file<span class="token operator">></span>类似<span class="token function">git</span> restore <span class="token parameter variable">--staged</span> <span class="token builtin class-name">.</span>      //效果和git reset 类似<span class="token function">git</span> reset <span class="token parameter variable">--hard</span>            //清除未提交的所有更改（包括暂存区和工作区）<span class="token function">git</span> <span class="token function">rm</span> <span class="token parameter variable">--cached</span> <span class="token operator">&lt;</span>file<span class="token operator">></span>      //删除暂存区中特定文件的缓存，并且让Git停止追踪它<span class="token function">git</span> <span class="token function">rm</span> <span class="token parameter variable">-r</span> <span class="token parameter variable">--cached</span> <span class="token builtin class-name">.</span>        //删除暂存区中所有文件的缓存，并且让Git停止追踪它们<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在提交版本(存档)前需要提交的内容放入缓存，为后续提交指定范围。如果要查看缓存的状态，我们可以使用 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> status<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>来查看哪些文件被缓存，哪些被追踪的文件没有被缓存如果不出意外，你会觉得一个一个添加缓存很慢，我们当然希望能用一个命令就把该缓存的全都缓存、该删除缓存的全都删除了。但是直接用gitadd.又不合理，因为比如.venv(虚拟环境)、build这样的文件是不应该被git追踪并缓存的。因为这些文件很大、而且他们的变化是编译或者安装库的结果，不是我们应该关系的，也不是应该由我们手动更改的。我们需要一种方法，将这些文件排除在版本控制之外。git提供了一种方法将文件或者文件夹排除在版本控制之外————.gitignore首先，在要排除的文件或者文件夹所在的那一级目录新建一个文件，取名为.gitignore。注意前面的点不要漏掉。随后，将要排除的文件夹或者文件的名字填入其中，一行一个，再保存一下，这些被填入其中的文件和文件夹就被排除在版本控制之外了。<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022313360.png" />有些时候.gitignore可能不生效，可以试试删了重建.gitignore，在输入以下命令让Git停止追踪要忽略的内容 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">rm</span> <span class="token parameter variable">-r</span> <span class="token parameter variable">--cached</span> <span class="token builtin class-name">.</span><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>当确定.gitignore生效以后，此后每次提交前更改缓存就只要执行 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>就行了。</p><h3 id="提交版本">提交版本</h3><p>提交版本相对应给游戏存档，是git最核心的功能，版本提交命令如下：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> commit                      //不带提交描述<span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"commit message"</span>  //带提交描述<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>对应git，每次commit都是必须携带提交描述的，而且不能用空字符串代替，对于第一种命令，git会打开默认文本编辑器让你编辑提交信息，不会用vim记得按照本文前面的内容修改默认文本编辑器。<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022405745.png" /></p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022520450.png" />在第一行的空白处填上提交描述，保存以后关闭文本编辑器，提交就完成了。</p><p>对于第二种命令，直接将描述写在引号里面就行，不需要再去编辑文本编辑器。</p><p>如果需要查看之前提交过的版本，可以通过以下命令查看提交日志<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> log             //打印日志完整信息<span class="token function">git</span> log <span class="token parameter variable">--oneline</span>   //打印日志简略信息，每次提交占一行<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><p>如果想要回到之前某一次提交之后，查看那次提交的<ahref="https://vscode.github.net.cn/docs/editor/workspaces#google_vignette">工作区</a>状态，可以通过命令<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token operator">&lt;</span>commit-hash<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 回到那次提交后的状态。<commit-hash>是那次的哈希值，git会为每次提交生成独一无二的哈希值，哈希值可以通过查看提交日志知晓。这个命令可以改变<ahref="https://juejin.cn/post/7103746773335687176">HEAD指针</a>，但是这种状态类似只读状态，你在工作区做的任何更改都不会被保留。查看完以后，可以通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout -<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 返回最后一次提交的状态</p><h3 id="版本回滚">版本回滚</h3><p>版本回滚相对应游戏里的回档，可以通过以下几种命令进行版本回滚。</p><h4 id="git-reset命令">git reset命令</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> reset <span class="token parameter variable">--soft</span> <span class="token operator">&lt;</span>commit-hash<span class="token operator">></span>       //仅重置 HEAD，不影响暂存区和工作区<span class="token function">git</span> reset <span class="token parameter variable">--mixed</span> <span class="token operator">&lt;</span>commit-hash<span class="token operator">></span>      //重置 HEAD 和暂存区，保留工作区更改（默认）<span class="token function">git</span> reset <span class="token parameter variable">--hard</span> <span class="token operator">&lt;</span>commit-hash<span class="token operator">></span>       //重置 HEAD、暂存区和工作区，彻底清除后续所有更改<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>使用soft后缀的话，只会将那次提交之后的所有提交去除，但是工作区和缓存区都不会改变，如果你觉得某次提交之后的所有提交都没有什么实际意义，你希望自己的提交历史看起来清爽一点，但又感觉现在的工作区还不错，不想改动工作区，那不妨试试这个命令。mixed后缀是gitreset的默认方法，也就是如果你不加–后缀，就会默认带了–mixed，和soft的区别是，mixed还重置了缓存区，便于你进行手动恢复文件之类的操作(虽然并不是很好用)如果希望完全回档，推荐使用hard后缀，hard后缀可以完全重置到那次提交以后的HEAD、暂存区和工作区，是最符合“回档”期望的命令，如果觉得某次提交之后的代码越写越屎，可以直接用这个命令穿越回过去(bushi)直接撤回最近一次提交可以用 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD~1<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>同理，如果你希望撤回最近n次提交，可以使用 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD~n<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>如果想直接回到最近一次提交，清除未提交的所有更改（包括暂存区和工作区），可以使用<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h4 id="git-revert命令">git revert命令</h4><p>git reset简单粗暴，但也有其弊端，gitreset会完全丢弃回滚的那次提交以后的所有提交，也就是说你回档以后又后悔了，那你就没的后悔了。而且在多人开发中，reset如果回滚到了某次合并分支的结点之前，也会因为两边历史不同而造成冲突，所以在多人开发中，reset只能回退到最近一次合并或创建分支的结点之后，有一定局限。如果要符合多人开发规范，需要使用git revert命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> revert <span class="token operator">&lt;</span>commit-hash<span class="token operator">></span>     //撤销某次提交<span class="token function">git</span> revert HEAD              //撤销最新的提交<span class="token function">git</span> revert HEAD~3<span class="token punctuation">..</span>HEAD      //撤销前3次提交，但是分三次提交<span class="token function">git</span> revert <span class="token parameter variable">-n</span> HEAD~3<span class="token punctuation">..</span>HEAD   //撤销前3次提交，但是一次性提交<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>注意，-n是代表不提交模式，三次撤销完了也不会提交，需要 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"Reverted last 3 commits"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>手动提交 能撤销前三次，说明也能撤销前n次，把3改成其他数字就行。和reset不一样，reset是撤销到某次提交之后，而revert则是撤销某次提交，没有之后。记得不要撤销过头。gitrevert不会移除任何提交信息，而是在当前分支上创建一个新的提交，这个提交的内容会“反向应用”指定的更改，也就是说，使用gitrevert以后，提交历史反而会变多。 git revert和gitreset相比不会在多人开发中产生因为历史不同而生的冲突和错误。 gitrevert可以撤销中间几次的提交，比如 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> revert <span class="token parameter variable">-n</span> HEAD~7<span class="token punctuation">..</span>HEAD~4<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>是撤销倒数第5次和倒数第6次提交。记得， <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> revert <span class="token parameter variable">-n</span> HEAD~x<span class="token punctuation">..</span>HEAD~y<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>撤销的是倒数第y+1到倒数第x-1次提交，不是倒数y到x次提交！很反常识对吗，反正找个理由说服自己就行。。。。。。在gitrevert的时候，特别是撤销中间几次提交的时候，很容易发送冲突，这时候git会打开默认文本编辑器让你解决冲突，按照预期取舍就行，实在不知道怎么搞就点击接受组合。在gitrevert的过程中，当你处于一个操作中，你可以通过下述命令选择继续、放弃或退出该操作。<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> revert <span class="token parameter variable">--continue</span>   //如果你已经解决了冲突或完成了必要的更改，可以继续 revert 操作<span class="token function">git</span> revert <span class="token parameter variable">--abort</span>      //放弃当前的 revert 操作，并将仓库恢复到 revert 操作开始之前的状态。<span class="token function">git</span> revert <span class="token parameter variable">--quit</span>       //退出当前的 revert 操作，但保留已经应用的更改。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h4 id="git-restore命令">git restore命令</h4><p>如果你觉得gitrevert命令太复杂了，到是还有一种更加简单，而且还不破坏提交历史的方法<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> restore <span class="token parameter variable">--source</span><span class="token operator">=</span><span class="token operator">&lt;</span>commit-hash<span class="token operator">></span> <span class="token parameter variable">--staged</span> <span class="token parameter variable">--worktree</span> <span class="token builtin class-name">.</span><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"将版本回滚到&lt;commit-hash>状态"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>这个命令并不会影响提交历史，而是从指定的提交中恢复文件到当前工作目录和暂存区，这意味着当前工作目录中的文件将被替换为指定提交中的版本。这时候再手动commit一下，就可以将那个版本的工作区作为一个新的提交。这样一来，也可以等效达成”回档”的目的，而且因为是在原基础上新建提交，所以并不会破坏之前的提交。不过相比于git revert，gitrestore命令的跨度太大了，因为是恢复工作区和缓存，而不是回滚，虽然这种方法在多人开发中不会造成冲突，但其规范性还是不如gitrevert。</p><h3 id="修改版本信息">修改版本信息</h3><p>有时你可能觉得之前某次提交不好，但是又不希望弄没之后的提交，这时候你可能需要通过rebase来修改个别提交首先启动启动交互式 rebase <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> rebase <span class="token parameter variable">-i</span> HEAD~4<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> -i用于启用交互模式，使用命令以后，git会打开默认文本编辑器进行交互编辑 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022617771.png" />中间那个是每次提交的哈希值，右边那个是每次提交的描述(我偷懒随便写的)HEAD后面填了4，所以显示了最近4次提交，用更大的数字可以查看到跟之前的提交之后我们要根据需求更改pick为其他命令 <blockquote><p>常用命令pick：保留该提交。相当于“选择”该提交并按原样应用到新的历史记录中。</p><p>edit：标记该提交需要修改，Git会在这个提交暂停，允许你进行修改、补充内容或更改提交信息。修改完成后继续rebase。</p><p>squash（简写：s）：将当前提交与前一个提交合并，并且会合并两者的提交信息。适用于整理多个小的提交，将它们合并成一个较大的提交。</p><p>fixup（简写：f）：类似于squash，将当前提交与前一个提交合并，但不会保留当前提交的信息。这在仅想保留前一个提交信息的情况下非常有用。</p><p>reword：保留该提交，但允许修改其提交信息。</p><p>drop：删除该提交，从历史记录中移除它。</p></blockquote>值得注意的是，reword只能修改提交描述，edit还可以修改那次提交的操作信息，比如你可以在文件里面加点什么删点什么，不过不出意外会出点冲突，这样就又要解决冲突了。比如我们想修改4444那次提交，我们把4444那次提交前面的pick改成edit <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022711908.png" />之后我们保存并关闭编辑文件，就临时进入了那次提交的编辑状态(最近的不再是ddd，而是4444)<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022745612.png" />随后我们修改完相应的文件，用 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 添加缓存，解决完冲突再用命令<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> rebase <span class="token parameter variable">--continue</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>进入文本编辑器编辑提交信息，再保存关闭文本编辑器，修改就完成了。 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022819349.png" />最近的一次提交也变回了ddd，而4444那次提交中则增加了你新编辑的那些操作。</p><p>和revert一样，rebase也不止有continue后缀在revert过程中解决了冲突或其他更改，可以用相同命令选择继续、放弃或退出该操作<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> rebase <span class="token parameter variable">--continue</span>   //如果你已经解决了冲突或完成了必要的更改，可以继续 rebase 操作<span class="token function">git</span> rebase <span class="token parameter variable">--abort</span>      //放弃当前的 rebase 操作，并将仓库恢复到 rebase 操作开始之前的状态。<span class="token function">git</span> rebase <span class="token parameter variable">--quit</span>       //退出当前的 rebase 操作，但保留已经应用的更改。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h3 id="分支管理">分支管理</h3><p>分支相当于游戏里的备份存档，在git中同样有着十分重要的功能。</p><h4 id="创建分支">创建分支</h4><p>使用命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch <span class="token operator">&lt;</span>branch_name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>你在哪个分支上创建分支，就是在哪个分支的基础上创建分支。。。。。。额，这可能不像是人话。或者说，比如你在main这个分支上输入了 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch dev<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>的命令，那就是在main这个分支的基础上，分出了dev这个分支，dev将会继承main的所有文件信息和提交历史，同时后续对两者编辑又互不影响。</p><h4 id="切换分支">切换分支</h4><p>使用命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token operator">&lt;</span>branch_name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 可以切换到指定分支。切换到不同分支以后，工作区和提交历史都会变成相应分支的状态。</p><p>对应创建分支，如果希望快一点，直接创建并切换到新分支，也可以用<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>branch_name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 直接一步到位。</p><h4 id="列出本地分支">列出本地分支</h4><p>使用命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 可以列出本地分支的信息。比如： <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022846797.png" />说明本地仓库有两个分支，分别是main和dev，其中main前面有星号意味着目前切换到的分支是main。</p><h4 id="删除分支">删除分支</h4><p>使用命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch <span class="token parameter variable">-d</span> <span class="token operator">&lt;</span>branch_name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 可以删除本地分支</p><h4 id="合并分支">合并分支</h4><p>当开发到一点程度的时候，要将分支的内容合并到主干上，有两种方法可以合并分支##### 用merge合并 一般情况下大多采用merge合并 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> merge <span class="token operator">&lt;</span>branch_name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>比如要将dev合并到main，那就先切换到main分支，再执行 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> merge dev<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>这样一来，dev就被合并到了main上但经过这样的合并，main的提交历史就不一定是直线的了。比如我们在dev分支创建以后，先在dev上进行了三次提交，后来又在main上进行了一次提交，那通过merge合并以后，提交历史会变成这样：<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022917285.png" />如果你有某种洁癖，不能忍受非直线的历史，可以尝试后面的方法。</p><h5 id="用rebase合并">用rebase合并</h5><p>rebase不仅可以修改提交信息，还可以用来合并分支。在和上面相同的情况下，通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> rebase dev<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 命令达到的效果是这样的： <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308022945990.png" />合并以后的提交历史依旧是直线，这样看起来更加干净，当然，如果用gitmerge也是完全没有问题的。</p><h3 id="标签管理">标签管理</h3><p>当开发到了一个具有里程意义的时候，需要发布版本，发布前需要增加标签，为发布做准备。</p><h4 id="创建标签">创建标签</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag <span class="token parameter variable">-a</span> tag_name commit_hash <span class="token parameter variable">-m</span> <span class="token string">"Tag message"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>-a 指定标签为附注标签。 -m 允许添加一个标签说明信息 “Release version1.0”。 commit_hash是标签对应提交版本的哈希值 例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag <span class="token parameter variable">-a</span> v1.0 9fceb02 <span class="token parameter variable">-m</span> <span class="token string">"Release version 1.0"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>9fceb02也可以换成完整的哈希值</p><h4 id="列出所有标签">列出所有标签</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="删除标签">删除标签</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag <span class="token parameter variable">-d</span> tag_name<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="查看标签详情">查看标签详情</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> show tag_name<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="检出到标签版本">检出到标签版本</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout tag_name<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>可以通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout -<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 返回原来的分支。</p><h2 id="远程仓库命令">远程仓库命令</h2><h3 id="增加远程仓库">增加远程仓库</h3><p>增加远程仓库可以通过命令 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> remote <span class="token function">add</span> <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-URL<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 实现。远程仓库的名称是由自己来取，不一定和github仓库那边一样，远程仓库URL要在github仓库那里获取，就是gitclone后面常跟的那串URL。 例如可以添加一个名字取为origin的远程仓库<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> remote <span class="token function">add</span> upstream https://github.com/another/repo.git<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>远程仓库不一定只能添加一个，一个本地仓库可以添加很多个远程仓库(虽然没有必要)，可以通过切换上游分支来便于拉取和推送。可以通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> remote <span class="token parameter variable">-v</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 查看本地仓库添加了多少远程仓库。</p><h3 id="新建远程分支">新建远程分支</h3><p>先在本地创建一个新分支，再切换到这个分支上(如果已经有分支了也可以不用创建，可以直接切换)<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>local-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 再将本地新分支推送到远程 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push <span class="token parameter variable">-u</span> <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>这样远程就多了一个分支，分支名和<remote-branch>设置的一样。 例如：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> feature-branch<span class="token function">git</span> push <span class="token parameter variable">-u</span> origin feature-branch<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 这里的 -u会将本地分支与远程分支设置为追踪关系，即将远程分支设置为本地分支的上游，以便将来可以直接使用git pull 和 git push 来同步。</p><h3 id="切换上游分支">切换上游分支</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch --set-upstream-to <span class="token operator">&lt;</span>remote<span class="token operator">></span>/<span class="token operator">&lt;</span>remote-branch<span class="token operator">></span> <span class="token operator">&lt;</span>local-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>假设你想将本地的 feature 分支设置为跟踪远程的 origin/feature分支，可以执行以下命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch --set-upstream-to origin/feature feature<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>当然，也可以先切换至feature分支，在执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch <span class="token parameter variable">-u</span> origin/feature<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>设置了上游分支以后,之后拉取和推送会简化许多。 可以通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch <span class="token parameter variable">-vv</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>查看每个本地分支对应的上游 如果你不清楚远程仓库有哪些分支，可以通过<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch<span class="token function">git</span> branch <span class="token parameter variable">-r</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 查看远程仓库所有分支。其中gitfetch是获取远程仓库的所有信息(但是不改变工作区和缓存)如果不想要上游分支了，可以先切换到你想取消上游设置的分支，再通过：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> branch --unset-upstream<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 取消上游追踪。</p><h3 id="拉取与推送">拉取与推送</h3><h4 id="拉取远程更新">拉取远程更新</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> pull <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>例如从 origin 仓库的 main 分支拉取最新的提交到本地的 main 分支：先切换到main分支。再执行 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> pull origin main<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 命令。 git pull可以看作git fetch+ git merge 两个命令的结合 也就是说，上述命令可以等效成 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span class="token function">git</span> merge <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>或者 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch  <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span class="token function">git</span> rebase <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 注意，多人协作时应当尽力避免rebase！如果某个本地分支设置了上游分支，在这个本地分支上可以直接执行：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> pull<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> git 会默认从上游分支拉取最新信息。</p><h4 id="推送到远程仓库">推送到远程仓库</h4><p>在push之前，最好先更新本地分支，避免与远程分支之间有冲突。所以先执行：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 再执行push操作： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 例如将本地 main分支的提交推送到 origin 仓库的 main 分支: 先切换到main分支。再执行<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch origin main<span class="token function">git</span> push origin main<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> 命令。如果某个本地分支设置了上游分支，在这个本地分支上可以直接执行：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch<span class="token function">git</span> push<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre> git 会默认向上游分支推送最新信息。如果有很多远程仓库，可以通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch <span class="token parameter variable">--prune</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>获取所有远程更新并清理无用的远程跟踪分支如果你因为reset或者rebase导致提交历史发生了变化，和远程仓库的历史对不上，那么推送大概率会因为冲突而失败，这时需要一种更强硬的推送命令；<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch<span class="token function">git</span> push <span class="token parameter variable">--force</span> <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>强制推送会覆盖远程仓库中的分支内容，以匹配本地分支的状态，从而推送成功。<div class="tip warning"><i class="i-adm i-warning icon"></i><div class="p"><p>但切记，在多人开发中应当极力避免这个命令出现，这会给其他成员造成极大麻烦！</p></div></div></p><h3 id="删除分支-1">删除分支</h3><p>当一个分支完成了它的使命以后，通常要在本地和远程将这个分支删去。怎么在本地删除分支在前文写了，在远程仓库删除分支需要执行：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token parameter variable">--delete</span> <span class="token operator">&lt;</span>remote-branch<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 假设要删除远程仓库 origin 中的 feature-branch分支，命令如下： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push origin <span class="token parameter variable">--delete</span> feature-branch<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="标签管理-1">标签管理</h3><p>在进行远程标签管理之前，需要先获取远程标签的信息： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token parameter variable">--tags</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch origin <span class="token parameter variable">--tags</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h4 id="推送标签到远程仓库">推送标签到远程仓库</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token operator">&lt;</span>tag-name<span class="token operator">></span>    //推送单个标签<span class="token function">git</span> push <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token parameter variable">--tags</span>        //推送单个标签<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push origin v1.0<span class="token function">git</span> push origin <span class="token parameter variable">--tags</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><h4 id="查看远程标签">查看远程标签</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> tag<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="删除远程标签">删除远程标签</h4><p>先删除本地标签,然后删除远程标签： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push <span class="token operator">&lt;</span>remote<span class="token operator">></span> <span class="token parameter variable">--delete</span> <span class="token operator">&lt;</span>tag-name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 例如：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push origin <span class="token parameter variable">--delete</span> v1.0<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h4 id="更新远程标签">更新远程标签</h4><p>在 Git中，标签是不可变的。因此，要更新标签，需要先删除旧的标签并重新推送。先删除本地和远程的旧标签。再创建新的标签。最后推送新的标签到远程。</p><h4 id="发布release">发布(release)</h4><p>创佳完标签以后就可以在github这样的远程仓库发布。直接进入远程仓库的网页，一般在右下角可以根据提示将创建了标签的版本发布。<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023027350.png" /></p><h1 id="多人开发事项">多人开发事项</h1><h2 id="一般团队开发流程">一般团队开发流程</h2><p>对于一个多人完成的项目而言，在一个项目建立的时候，技术负责人创建一个github仓库，创建一个main分支,main分支是门面，是后续发布的根本，所以main分支必须是纯净的，因此在main的基础上创建一个dev分支，dev(develop)分支负责开发，后续的改动都在dev分支上面进行。团队的不同人负责不同的事情，比如张三负责增加菜单，王五负责增加背景音乐，那他们就分别在dev的基础上再分别开一个feature/menu和feature/music分支并在这两个分支上面做开发和改动，当开发的差不多了，就将这两个分支合并到dev分支，当开发到了一个阶段(比如实现了基本功能)，就由负责人在dev分支的基础是建立一个release分支，在这个分支上做最后的调试和bug修复，最后当一切都没有问题了，再由负责人将release合并到main分支。这样一来，main分支的代码始终是纯净的，稳定的，也方便了后续的发布和部署。</p><h2 id="对项目做贡献">对项目做贡献</h2><p>对于仓库创建者以外的成员(或者想给项目做贡献的人)，需要进入项目的仓库去fork这个仓库。在英文中，“fork” 的字面意思是“叉”或“分叉”。在软件开发中，Fork代表“分支”或“分流”的含义。它表示在某个项目或代码库的基础上“分出一条支流”，以独立的副本形式进行修改和发展。这个分支副本可以随着开发者的需求进行调整、增强或定制，与原始项目保持一定的独立性。</p><h3 id="fork-仓库">Fork 仓库</h3><p>fork的按钮一般在仓库的右上角 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023112295.png" />在仓库页面右上角找到 “Fork” 按钮，点击后 GitHub会在你的账户下创建一个该仓库的副本。 完成后，页面会跳转到你账户中的新Fork 仓库，仓库名称会以 <你的用户名>/<仓库名> 的形式显示。</p><h3 id="将-fork-的仓库克隆到本地">将 Fork 的仓库克隆到本地</h3><p>在你自己的 Fork 仓库页面中，克隆这个仓库到你的本地系统(替换 <URL>为你复制的仓库地址) <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone <span class="token operator">&lt;</span>URL<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 随后进入克隆后的仓库目录。</p><h3 id="配置远程仓库">配置远程仓库</h3><p>默认情况下，Git 会将你的 Fork 仓库设为远程仓库（一般称为origin）。但是，为了便于与原始仓库保持同步，通常会将原始仓库添加为另一个远程仓库，称为upstream： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> remote <span class="token function">add</span> upstream <span class="token operator">&lt;</span>original-repository-URL<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> original-repository-URL是原始仓库的UPL</p><p>这样你的仓库就会有两个远程： origin：指向你的 Fork 仓库。upstream：指向原始仓库。</p><h3 id="从原始仓库同步更新">从原始仓库同步更新</h3><p>为了保持你的 Fork仓库与原始仓库的最新内容一致，定期同步更新是很重要的： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch upstream<span class="token function">git</span> merge upstream/main<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>也可以使用 rebase，保持更整洁的提交记录： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> rebase upstream/main<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="在-fork-仓库中创建新分支并进行修改">在 Fork仓库中创建新分支并进行修改</h3><p>创建并切换到一个新的分支，便于进行修改： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>new-branch-name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>在新分支上进行修改、提交更改： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"Description of changes"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></p><h3 id="推送分支到你的-fork-仓库">推送分支到你的 Fork 仓库</h3><p>将你新分支上的更改推送到 GitHub 上的 Fork 仓库： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> push origin <span class="token operator">&lt;</span>new-branch-name<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="提交-pull-request-pr">提交 Pull Request (PR)</h3><p>在你的 Fork 仓库页面中，在左上角选择 Pull Request。 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023157591.png" />进入Pull Request以后点击New Pull Request <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023253392.png" />编写 PR 描述，解释你所做的更改，并选择合适的目标分支（通常是 main 或develop)。 提交 PR，等待原始仓库的维护者审核和合并。</p><h3 id="同步最新更新">同步最新更新</h3><p>在原始仓库有新的更新时，可以通过以下命令保持同步： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> fetch upstream<span class="token function">git</span> merge upstream/main<span class="token function">git</span> push origin main<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h3 id="注意事项">注意事项</h3><p>在多人开发中，应当: + 用git revert 代替git reset +禁止在最近一次创建或合并分支的结点之前使用git reset 或者git rebase +严禁对不止一人交互的仓库使用git push –force</p><p>上述三条注意事项都是为了避免对提交历史造成关键性影响，对提交历史的更改在多人协作中可能造成拉取和推送的冲突，而且还会影响到其他成员的工作。所以在多人开发中应该尽量通过创建新的提交来代替更改以往的提交。</p><h1 id="gui版">gui版</h1><p>如果觉得git命令很麻烦，推荐使用github官方推出的工具<ahref="https://desktop.github.com/download/">Github Desktop</a>。</p><p>这是一个图形用户界面版的git工具，上述的各种命令基本都能通过按按钮实现，非常方便。</p><p>而且作为官方发布的工具，GithubDesktop安全性也很高，可以很好避免因为错误使用命令而把工作区变得乱七八糟的风险。</p><p>不过GithubDesktop只适用于Github，如果使用的是其他平台，可能需要用到例如GiteeDesktop等其他工具。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;git和github的关系和区别&quot;&gt;&lt;a
href=&quot;https://git-scm.com/&quot;&gt;git&lt;/a&gt;和&lt;a
href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt;的关系和区别&lt;/h1&gt;
&lt;h2 id=&quot;git&quot;&gt;&lt;a href=&quot;https://git-scm.com/&quot;&gt;git&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;说到git，很多初学者的第一印象是github，好像git的用处就是从github仓库clone项目，或者也可以把自己的项目上传到github，但是为什么要上传，也不是很清楚。&lt;/p&gt;
&lt;p&gt;其实，git作为一个分布式版本控制系统，是一个命令行工具，它最根本的功能是用于在本地管理和跟踪文件的更改历史，或者用更好理解的说法，git的基础功能是“存档”。</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="git" scheme="https://fallingnight.com/tags/git/"/>
    
    <category term="github" scheme="https://fallingnight.com/tags/github/"/>
    
  </entry>
  
  <entry>
    <title>P1002-过河卒</title>
    <link href="https://fallingnight.com/2024/10/22/P1002-%E8%BF%87%E6%B2%B3%E5%8D%92/"/>
    <id>https://fallingnight.com/2024/10/22/P1002-%E8%BF%87%E6%B2%B3%E5%8D%92/</id>
    <published>2024-10-22T02:52:52.000Z</published>
    <updated>2025-04-18T16:08:30.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><a href="https://www.luogu.com.cn/problem/P1002">P1002 [NOIP2002普及组] 过河卒</a></p></blockquote><h1 id="解法">解法</h1><p>这一题目前了解到有两种解法，递归和动态规划(DP算法)。<span id="more"></span></p><h2 id="递归">递归</h2><p>一开始我想到的方法是递归，通过递归罗列出卒走路的所有路线，再将成功的次数加起来。但是这个问题上，用递归所要经历的分支实在是太多了，不出意外地超时了。所以后续尝试将备忘录的思想和递归结合，设置一个二维数组当做备忘录，将走到一个点的路线数记录下来，这样以后再遇到需要这个点的路线数的情况，就不用再递归了，直去备忘录取数字就行。这样可以用空间换时间。最后证实是可行的。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;cmath></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;vector></span></span><span class="token macro property"><span class="token directive-hash">#</span> <span class="token directive keyword">define</span> <span class="token macro-name">ll</span> <span class="token expression"><span class="token keyword">long</span> <span class="token keyword">long</span></span></span><span class="token comment">// 递归函数，带备忘录</span>ll <span class="token function">move</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">,</span> <span class="token keyword">int</span> c<span class="token punctuation">,</span> <span class="token keyword">int</span> d<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>ll<span class="token operator">>></span><span class="token operator">&amp;</span> memo<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// 如果当前位置与马的距离为 5，或超出了目标区域，或马挡住兵</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>x <span class="token operator">-</span> c<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>x <span class="token operator">-</span> c<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>y <span class="token operator">-</span> d<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>y <span class="token operator">-</span> d<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">5</span> <span class="token operator">||</span> x <span class="token operator">></span> a <span class="token operator">||</span> y <span class="token operator">></span> b <span class="token operator">||</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> c <span class="token operator">&amp;&amp;</span> y <span class="token operator">==</span> d<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>  <span class="token comment">// 这是错误的路线</span>    <span class="token punctuation">&#125;</span>        <span class="token comment">// 如果到达目标点</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> a <span class="token operator">&amp;&amp;</span> y <span class="token operator">==</span> b<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>  <span class="token comment">// 成功找到一条路线</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">// 检查备忘录，是否已经计算过这个点的结果</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>memo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>y<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> memo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">;</span>  <span class="token comment">// 如果计算过，直接返回结果</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">// 计算从 (x, y) 到 (a, b) 的所有可能路线：向下走和向右走</span>    ll right <span class="token operator">=</span> <span class="token function">move</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">,</span> memo<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 向右走</span>    ll down <span class="token operator">=</span> <span class="token function">move</span><span class="token punctuation">(</span>x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> y<span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">,</span> memo<span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">// 向下走</span>    <span class="token comment">// 存储结果到备忘录中</span>    memo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>y<span class="token punctuation">]</span> <span class="token operator">=</span> right <span class="token operator">+</span> down<span class="token punctuation">;</span>    <span class="token comment">// 返回当前点的路径总数</span>    <span class="token keyword">return</span> memo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>y<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">int</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">;</span>    std<span class="token double-colon punctuation">::</span>cin <span class="token operator">>></span> a <span class="token operator">>></span> b <span class="token operator">>></span> c <span class="token operator">>></span> d<span class="token punctuation">;</span>    <span class="token comment">// 创建备忘录，初始化为 -1，表示所有位置尚未计算</span>    std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>ll<span class="token operator">>></span> <span class="token function">memo</span><span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">vector</span><span class="token generic class-name"><span class="token operator">&lt;</span>ll<span class="token operator">></span></span></span><span class="token punctuation">(</span>b <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// 计算从 (0,0) 到 (a,b) 的路线总数</span>    ll result <span class="token operator">=</span> <span class="token function">move</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">,</span> memo<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// 输出结果</span>    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> result <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>需要注意的是，存储路线数的变量一定要用longlong类型，因为在第三个测试节点，路线数已经到了11位大小，超出了int和long(之前没考虑到这点，浪费了很多时间)。</p><h2 id="dp算法">DP算法</h2><p>后面看了一下题目标签了解了一下DP算法，发现用dp确实简便了许多，递归还要套一层又一层，可能会栈溢出，DP算法只要一个双层循环就行了，方便了许多，以后遇到类似问题可以多一种思路。<pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;cstring></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;algorithm></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">ll</span> <span class="token expression"><span class="token keyword">long</span> <span class="token keyword">long</span></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token keyword">int</span> fx<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token keyword">int</span> fy<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token comment">//马可以走到的位置</span><span class="token keyword">int</span> bx<span class="token punctuation">,</span> by<span class="token punctuation">,</span> mx<span class="token punctuation">,</span> my<span class="token punctuation">;</span>ll f<span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> s<span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//判断这个点有没有马拦住</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    cin<span class="token operator">>></span>bx<span class="token operator">>></span>by<span class="token operator">>></span>mx<span class="token operator">>></span>my<span class="token punctuation">;</span>    bx <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> by <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> mx <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> my <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token comment">//坐标+1以防越界</span>    f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//初始化</span>    s<span class="token punctuation">[</span>mx<span class="token punctuation">]</span><span class="token punctuation">[</span>my<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//标记马的位置</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> <span class="token number">8</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> s<span class="token punctuation">[</span>mx <span class="token operator">+</span> fx<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>my <span class="token operator">+</span> fy<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> bx<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> by<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// 如果被马拦住就直接跳过</span>            f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token comment">//状态转移方程</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    cout<span class="token operator">&lt;&lt;</span>f<span class="token punctuation">[</span>bx<span class="token punctuation">]</span><span class="token punctuation">[</span>by<span class="token punctuation">]</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P1002&quot;&gt;P1002 [NOIP2002
普及组] 过河卒&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;解法&quot;&gt;解法&lt;/h1&gt;
&lt;p&gt;这一题目前了解到有两种解法，递归和动态规划(DP算法)。</summary>
    
    
    
    <category term="算法题解" scheme="https://fallingnight.com/categories/%E7%AE%97%E6%B3%95%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="C++" scheme="https://fallingnight.com/tags/C/"/>
    
    <category term="DP算法" scheme="https://fallingnight.com/tags/DP%E7%AE%97%E6%B3%95/"/>
    
    <category term="递归" scheme="https://fallingnight.com/tags/%E9%80%92%E5%BD%92/"/>
    
  </entry>
  
  <entry>
    <title>无集成开发环境下运行程序</title>
    <link href="https://fallingnight.com/2024/10/14/%E6%97%A0%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F/"/>
    <id>https://fallingnight.com/2024/10/14/%E6%97%A0%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F/</id>
    <published>2024-10-14T05:22:16.000Z</published>
    <updated>2025-09-11T15:37:13.595Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><div class="tip warning"><i class="i-adm i-warning icon"></i><div class="p"><p>叠甲——本文没有推荐任何人卸载IDE</p></div></div><p>本篇记录一种不用集成开发环境直接纯终端敲命令行的方法，可以装逼，没啥实用性。<del>第一步：卸载vscode、CLion、PyCharm、VisualStudio</del><span class="hide"><object><p>(bushi)</p></object></span></p><hr /><div class="quot one"><p>正常步骤</p></div><span id="more"></span><h1 id="c版">C++版</h1><h2 id="环境">环境</h2><p>安装<ahref="https://sourceforge.net/projects/mingw-w64/">MingGW</a>(C++/C的编译器)<span class="hide"><object><p>如果你之前用VisualStudio这样的IDE不需要编译器，是因为微软给你把编译器配好了，如果你还用过vscode、CLion就会发现，编译器的配置选项可以选VisualStudio的自带编译器</p></object></span> ## 创建文件 随便创建一个文件夹往里面新建几个文件，注意后缀用令人熟悉的cpp和h，像这样– <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023518187.png" /></p><h2 id="编写文件">编写文件</h2><p>用一个文本编辑器(比如你的记事本)打开这些文件，然后简单编写一下：<pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// main.cpp</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">"example.h"</span></span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span>example <span class="token function">Ex</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>cout<span class="token operator">&lt;&lt;</span>Ex<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// example.h</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span><span class="token keyword">class</span> <span class="token class-name">example</span><span class="token punctuation">&#123;</span><span class="token keyword">public</span><span class="token operator">:</span><span class="token function">example</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span><span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">private</span><span class="token operator">:</span><span class="token keyword">int</span> A<span class="token punctuation">;</span><span class="token keyword">int</span> B<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">//example.cpp</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">"example.h"</span></span>example<span class="token double-colon punctuation">::</span><span class="token function">example</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span><span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token operator">:</span><span class="token function">A</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token function">B</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>std<span class="token double-colon punctuation">::</span>cout<span class="token operator">&lt;&lt;</span><span class="token string">"Hello,I am initialized"</span><span class="token operator">&lt;&lt;</span>std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">int</span> example<span class="token double-colon punctuation">::</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span><span class="token keyword">return</span> A<span class="token operator">+</span>B<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h2 id="编译程序">编译程序</h2><h3 id="用g命令构建">用g++命令构建</h3><p>然后在放这三个文件的文件夹里面输入： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">g++ main.cpp example.cpp <span class="token parameter variable">-o</span> Example<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>g++后面跟着的是项目里面所有cpp文件，用空格隔开。 -o后面是可执行文件的名字输入命令以后，在同一个文件夹里面，多了一个叫Example.exe的文件</p><h3 id="用cmake构建">用cmake构建</h3><h4 id="编写cmakelists文件">编写CmakeLists文件</h4><p>在根目录(放这三个文件的文件夹)创建一个叫CmakeLists.txt的文件，在里面写上例如：<pre class="line-numbers language-cmake" data-language="cmake"><code class="language-cmake"><span class="token keyword">cmake_minimum_required</span><span class="token punctuation">(</span><span class="token property">VERSION</span> <span class="token number">3.28</span><span class="token punctuation">)</span><span class="token keyword">project</span><span class="token punctuation">(</span>Example<span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_STANDARD</span> <span class="token number">17</span><span class="token punctuation">)</span><span class="token keyword">add_executable</span><span class="token punctuation">(</span>Draft main.cpp example.cpp<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> 这样的指令</p><h4 id="配置命令">配置命令</h4><p>在根目录创建一个build文件夹，进入文件夹。 你可以直接通过<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token punctuation">..</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>配置项目，这样会以系统默认的生成器完成配置，如果你想要指定生成器(MinGW、VisualStudio、Ninja)和生成模式(Debug、Release),可以通过： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token parameter variable">-G</span> <span class="token string">"MinGW Makefiles"</span> <span class="token parameter variable">-DCMAKE_BUILD_TYPE</span><span class="token operator">=</span>Debug <span class="token punctuation">..</span>//指定MingGW生成器,并使用Debug模式cmake <span class="token parameter variable">-G</span> <span class="token string">"MinGW Makefiles"</span> <span class="token parameter variable">-DCMAKE_BUILD_TYPE</span><span class="token operator">=</span>Release <span class="token punctuation">..</span>//指定MingGW生成器,并使用Release模式cmake <span class="token parameter variable">-G</span> <span class="token string">"MinGW Makefiles"</span> <span class="token parameter variable">-DCMAKE_BUILD_TYPE</span><span class="token operator">=</span>RelWithDebInfo <span class="token punctuation">..</span>//指定MingGW生成器,并使用RelWithDebInfo模式cmake <span class="token parameter variable">-G</span> <span class="token string">"MinGW Makefiles"</span> <span class="token parameter variable">-DCMAKE_BUILD_TYPE</span><span class="token operator">=</span>MinSizeRel <span class="token punctuation">..</span>//指定MingGW生成器,并使用MinSizeRel模式cmake <span class="token parameter variable">-G</span> <span class="token string">"Ninja"</span> <span class="token parameter variable">-DCMAKE_BUILD_TYPE</span><span class="token operator">=</span>Debug <span class="token punctuation">..</span>//指定Ninja生成器,并使用Debug模式cmake <span class="token parameter variable">-G</span> <span class="token string">"Visual Studio 17 2022"</span> <span class="token parameter variable">-A</span> x64 <span class="token punctuation">..</span>//Visual Studio 的生成器不使用 CMAKE_BUILD_TYPE 变量，因为它们默认支持多种配置,可以在构建时指定配置<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>等命令自定义生成方法(当然前提是你有安装过这些生成器，可以通过cmake–help命令查看你有哪些生成器) <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023643428.png" />Generators下面的信息会告诉你你安装过哪些生成器。</p><h4 id="构建命令">构建命令</h4><p>在build文件夹输入 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token parameter variable">--build</span> <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 命令构建，如果你用的生成器是visualstudio生成器，可以指定构建模式： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token parameter variable">--build</span> <span class="token builtin class-name">.</span> <span class="token parameter variable">--config</span> Debug//Debug模式cmake <span class="token parameter variable">--build</span> <span class="token builtin class-name">.</span> <span class="token parameter variable">--config</span> Release//Release模式<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><p>构建完成以后，在build文件夹(VisualStudio生成器是Debug或者Release文件夹)里会出现一个可执行文件，说明程序编译成功了。</p><div class="tip warning"><i class="i-adm i-warning icon"></i><div class="p"><p>请确定你的项目文件夹的路径里面没有中文！</p></div></div><p>cmake压根就不认中文，有中文路径生成直接出错。</p><h2 id="执行程序">执行程序</h2><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023606955.png" />用命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">.<span class="token punctuation">\</span>Example.exe<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 运行可执行文件 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023723221.png" />于是程序的结果执行了出来。</p><h1 id="python版">Python版</h1><p>和前面C++一样，随便写点文件就行。 然后<ahref="https://fallingnight131.cn/2024/10/14/pip%E5%91%BD%E4%BB%A4%E5%9F%BA%E7%A1%80/">创建一个虚拟环境</a>，并将其激活。假如最后程序从app.py开始运行，只要在命令行输入： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>程序就可以执行了</p><p>由此不难看出，运行一个程序需要的是编译器(python是需要解释器),而不是IDE，但IDE该用还是得用，IDE上的许多功能(高亮、自动补全、自动跳转、错误警告等…)可以大大提高编写的效率。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;tip warning&quot;&gt;&lt;i class=&quot;i-adm i-warning icon&quot;&gt;&lt;/i&gt;&lt;div class=&quot;p&quot;&gt;&lt;p&gt;叠甲——本文没有推荐任何人卸载IDE&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;本篇记录一种不用集成开发环境直接纯终端敲命令行的方法，可以装逼，没啥实用性。
&lt;del&gt;第一步：卸载vscode、CLion、PyCharm、VisualStudio&lt;/del&gt;&lt;span class=&quot;hide&quot;&gt;&lt;object&gt;&lt;p&gt;(bushi)&lt;/p&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;quot one&quot;&gt;&lt;p&gt;正常步骤&lt;/p&gt;&lt;/div&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://fallingnight.com/tags/C/"/>
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>pip命令基础(包括虚拟环境的使用)</title>
    <link href="https://fallingnight.com/2024/10/14/pip%E5%91%BD%E4%BB%A4%E5%9F%BA%E7%A1%80/"/>
    <id>https://fallingnight.com/2024/10/14/pip%E5%91%BD%E4%BB%A4%E5%9F%BA%E7%A1%80/</id>
    <published>2024-10-14T00:30:08.000Z</published>
    <updated>2025-04-18T16:14:10.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="pip命令">pip命令</h1><h2 id="安装包">安装包</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><span id="more"></span><p>例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> numpy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 指定版本： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token assign-left variable">numpy</span><span class="token operator">==</span><span class="token number">1.21</span>.0<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="升级已安装的包">升级已安装的包</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token parameter variable">--upgrade</span> <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="升级pip">升级pip</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python.exe <span class="token parameter variable">-m</span> pip <span class="token function">install</span> <span class="token parameter variable">--upgrade</span> pip<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果你的电脑里面不止一个版本的python，记得把python.exe换成你这个项目用的那个版本的python的exe文件的绝对路径。如果绝对路径中有空格，就用双引号把路径框起来，在双引号前面加&amp;，例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token operator">&amp;</span> <span class="token string">"D:\Program Files\Python<span class="token entity" title="\3">\3</span>.8\python.exe"</span> <span class="token parameter variable">-m</span> pip <span class="token function">install</span> <span class="token parameter variable">--upgrade</span> pip<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="卸载包">卸载包</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip uninstall <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="查看已安装的包">查看已安装的包</h2><p>列出当前环境中已安装的所有包： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip list<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>如果想查看某个包的详细信息： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip show <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="搜索包">搜索包</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip search <span class="token operator">&lt;</span>关键词<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="安装本地依赖">安装本地依赖</h2><p>如果你有一个项目的依赖文件requirements.txt，可以通过以下命令批量安装所需的包： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token parameter variable">-r</span> requirements.txt<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>requirements.txt 文件里面包含了一行行的包名和版本号，pip会按照文件中的内容逐一安装， 例如，文件可能包含以下内容： <pre class="line-numbers language-makefile" data-language="makefile"><code class="language-makefile">numpy<span class="token operator">=</span><span class="token operator">=</span>1.21.2pandas<span class="token operator">=</span><span class="token operator">=</span>1.3.3matplotlib<span class="token operator">=</span><span class="token operator">=</span>3.4.3<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>当你运行 pip install -r requirements.txt 时，pip会自动安装这些列出的包及其指定版本。</p><h2 id="导出已安装的包">导出已安装的包</h2><p>可以将当前环境中的所有包导出到一个 requirements.txt文件中，以便在其他环境中复现： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip freeze <span class="token operator">></span> requirements.txt<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="使用国内镜像源">使用国内镜像源</h2><h3 id="直接安装包">直接安装包</h3><p>在国内使用 pip 时，由于访问 PyPI官方源速度较慢，可以使用国内镜像，例如清华源。使用时，可以指定源地址：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token operator">&lt;</span>包名<span class="token operator">></span> <span class="token parameter variable">-i</span> https://pypi.tuna.tsinghua.edu.cn/simple<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h3 id="永久换源">永久换源</h3><p>每次安装都要输入”-ihttps://pypi.tuna.tsinghua.edu.cn/simple”会很不方便，可以选择永久换源，这样每次安装只要pipinstall就行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip config <span class="token builtin class-name">set</span> global.index-url https://pypi.tuna.tsinghua.edu.cn/simple<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> ### 恢复默认源如果你不想换源了，可以恢复默认源： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip config <span class="token builtin class-name">unset</span> global.index-url<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="检查过时的包">检查过时的包</h2><p>你可以检查已安装的包是否有可用更新： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip list <span class="token parameter variable">--outdated</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="清除下载的缓存">清除下载的缓存</h2><p>当包的安装出现问题时，可以尝试清除 pip 缓存： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip cache purge<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>pip缓存会占用不少c盘空间，如果c盘空间告急的话非常推荐定期清除pip缓存，不过清除缓存以后下次再装相同的包会花更多时间。</p><h2 id="检查依赖冲突">检查依赖冲突</h2><p>使用以下命令检查安装包时是否有依赖冲突： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip check<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h2 id="显示帮助">显示帮助</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token parameter variable">--help</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h1 id="虚拟环境">虚拟环境</h1><h2 id="虚拟环境的优势">虚拟环境的优势</h2><p>直接在命令行输入pip install<包名>会导致包安装到系统Python的全局site-packages目录，这在运行简单程序的时候没有什么问题，但是在程序比较复杂的时候会出现若干问题，比如你电脑安装过多个python，但一般情况，哪怕你把你安装过的python的路径都加到过系统环境路径，系统默认python也只会默认为一个(一般是你最后安装的python版本)你可以输入： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python <span class="token parameter variable">--version</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 查看成为系统默认python的那个版本当你希望用3.8版本的python运行一个程序，而且你的IDE确实把python3.8作为了解释器，而你的系统默认python是3.9,那问题就来了，哪怕你把pipinstall敲一万遍，包也不会被安装进python3.8的全局site-packages目录，程序自然也别想跑通，因为包安装的位置和你实际用到的解释器没用关系。此外，就算你要用的就是3.9，而且确实安装对了，但是大型项目用到的包与包之间发生版本冲突是经常的，不同程序共用一个全局site-packages，那冲突发生的可能性就更大了，你应该不希望隔一天运行同一个程序还要因为中间调过另一个程序而导致之前的程序因为包的版本冲突而突然跑不起来。所以，我们需要把不同程序用到的包环境隔离开来，这需要用到虚拟环境。虚拟环境不仅可以隔离环境防止冲突，而且创建虚拟环境时规定了python的版本，后续运行程序的时候只要在虚拟环境中直接用<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python 文件名.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>的命令就可以使用你希望的python版本解释程序，不用每次运行程序都为了用和系统python不一样的版本而输入一遍那个版本python执行程序的绝对路径。同时，虚拟环境下pip install安装的包就在项目目录下，方便查找和管理。 ##创建虚拟环境 在项目根目录输入命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python <span class="token parameter variable">-m</span> venv envname<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>当然，为了避免不必要的冲突可能，如果你要用到的python和系统默认python版本不一样，建议用下述命令：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">path<span class="token punctuation">\</span>to<span class="token punctuation">\</span>python.exe <span class="token parameter variable">-m</span> venv envname<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> path.exe是你用的那个版本的python的可执行文件的绝对路径(windows以外的系统可能不叫exe)envname是你创建的虚拟环境的名字，你可以随便换成其他名字，懒得取名可以直接换成.venv例如： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python <span class="token parameter variable">-m</span> venv .venv<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>python.exe的绝对路径中可能有空格，那就需要把绝对路径用&amp;““框起来，例如：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token operator">&amp;</span> <span class="token string">"D:\Program Files\Python<span class="token entity" title="\3">\3</span>.8\python.exe"</span> <span class="token parameter variable">-m</span> venv .venv<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 可以创建一个名叫.venv ，版本为python3.8的虚拟环境</p><h2 id="激活进入虚拟环境">激活进入虚拟环境</h2><p>创建完毕以后，你输入创建命令的目录下会多一个叫.venv的文件夹(和你取的名字一样)，这就是你创建的虚拟环境。打开这个文件夹，里面会有一个叫Scripts的文件(MacOS那里是bin文件)，打开这个文件夹，里面有个叫activate的文件，执行这个文件就能激活进入虚拟环境我们回到之前创建虚拟环境的那一级目录，在那里输入命令: <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">.<span class="token punctuation">\</span>envname/Scripts/activate//Windows<span class="token builtin class-name">source</span> myenv/bin/activate//Linux、Macos<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>envname 是你取的虚拟环境的名字 例如你取的名字是.venv ,那激活命令就是<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">.<span class="token punctuation">\</span>.venv/Scripts/activate//Windows<span class="token builtin class-name">source</span> .venv/bin/activate//Linux、Macos<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>激活以后，每一行命令的路径前都会多一个(虚拟环境名)的前缀，比如： <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308011920434.png" />前面有个黄色括号就是成功了，在这个虚拟环境下pipinstall的所有包都会下进.venv/Lib/site-packages。 同时在这个虚拟环境下用<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">python 程序名.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>运行程序，用到的解释器就是你创建虚拟环境时用的那版的python。如果你用的IDE，比如vscode，记得把解释器换成虚拟环境的解释器(vscode会直接提示你换)，虚拟环境的解释器就在envname/Scripts/目录下。 之后每打开项目时把激活虚拟环境的命令输入一遍就行了。</p><h1 id="使用包管理工具">使用包管理工具</h1><p>使用pip安装包的时候可能会遇到版本冲突。如果想要更加便利高效地安装环境，可以使用现成的包管理工具，比如<ahref="https://www.anaconda.com/download">Anaconda</a>。</p><p>Anaconda需要使用conda命令来进行包管理。(其实和pip命令差不多)</p><h2 id="安装环境">安装环境</h2><p>使用命令</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda create <span class="token parameter variable">-n</span> envname <span class="token assign-left variable">python</span><span class="token operator">=</span><span class="token number">3</span>.xx<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>就可以创建一个名为envname，python版本为3.xx的虚拟环境。（哪怕本地没有这个版本的python也可以安装）</p><p>例如,创建一个名为pytorch，版本为3.12的conda环境可以使用命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda create <span class="token parameter variable">-n</span> pytorch <span class="token assign-left variable">python</span><span class="token operator">=</span><span class="token number">3.12</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>如果想要创建一个和某个已有环境除名字以外一模一样的环境，可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda create <span class="token parameter variable">--name</span> newname <span class="token parameter variable">--clone</span> envname<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>例如,创建一个名为newpytorch，但是配置和已有环境pytorch一模一样的环境可以使用命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda create <span class="token parameter variable">--name</span> newpytorch <span class="token parameter variable">--clone</span> pytorch<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="查看已有环境">查看已有环境</h2><p>如果想要查看本地已创建的环境可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda <span class="token function">env</span> list<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>实现。</p><h2 id="激活虚拟环境">激活虚拟环境</h2><p>激活已创建的虚拟环境可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda activate envname<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>例如激活名为pytorch的虚拟环境可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda activate pytorch<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="退出虚拟环境">退出虚拟环境</h2><p>退出虚拟环境可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda deactivate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>退出以后会回到conda默认的base环境，以便于进入、创建或删除其他环境。</p><h2 id="安装包-1">安装包</h2><p>安装包可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda <span class="token function">install</span> <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>当然，如果有些包conda安装不了，也可以通过pip命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>实现。</p><h2 id="卸载包-1">卸载包</h2><p>卸载包可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda uninstall <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>或者</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip uninstall <span class="token operator">&lt;</span>包名<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>实现。</p><h2 id="删除环境">删除环境</h2><p>如果想要删除某个不想要的虚拟环境，可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda remove <span class="token parameter variable">--name</span> envname <span class="token parameter variable">--all</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>例如删除名为pytorch的虚拟环境可以通过命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">conda remove <span class="token parameter variable">--name</span> pytorch <span class="token parameter variable">--all</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>实现。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;pip命令&quot;&gt;pip命令&lt;/h1&gt;
&lt;h2 id=&quot;安装包&quot;&gt;安装包&lt;/h2&gt;
&lt;pre class=&quot;line-numbers language-bash&quot; data-language=&quot;bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;包名&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
    <category term="pip" scheme="https://fallingnight.com/tags/pip/"/>
    
  </entry>
  
  <entry>
    <title>将python程序打包成可执行的文件</title>
    <link href="https://fallingnight.com/2024/10/13/%E5%B0%86python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85%E6%88%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%9A%84%E6%96%87%E4%BB%B6/"/>
    <id>https://fallingnight.com/2024/10/13/%E5%B0%86python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85%E6%88%90%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%9A%84%E6%96%87%E4%BB%B6/</id>
    <published>2024-10-12T18:16:35.000Z</published>
    <updated>2025-04-18T16:14:44.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>作为一种解释型语言而非编译型语言，python并不像C++那样可以直接生成可执行文件。这意味着一个python程序想在另一台电脑上跑就必须在另一台电脑装python解释器。但生活经验告诉你，你用的应用都有可执行文件（windows中是exe），它们当中大概率有python编译的部分，但它们为什么可以有可执行文件？事实上，python也不是完全不能有可执行文件，但是要通过工具打包，PyInstaller就是一种方法。PyInstaller 是一个将 Python 脚本打包为独立可执行文件的工具，支持Windows、macOS 和 Linux 系统。以下是使用 PyInstaller 的步骤：<span id="more"></span></p><h1 id="安装-pyinstaller">安装 PyInstaller</h1><p>在终端输入命令： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pip <span class="token function">install</span> pyinstaller<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h1 id="打包-python-脚本">打包 Python 脚本</h1><p>假设你有一个 Python 文件app.py，在解释器里你通过运行它来运行整个项目，你可以通过以下方法打包它：## 直接打包 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 然后你会看到，PyInstaller 会生成一个 dist目录，其中包含一个 app文件夹，这个文件夹内就是打包后的可执行文件。此外，还会生成 build目录（构建过程中的临时文件）和 .spec 文件（配置文件）。 ##生成单个可执行文件 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller <span class="token parameter variable">--onefile</span> app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 这样一来，dist目录下就只有app的可执行文件了，没有了其他的依赖项，但是这样一来，可执行文件的大小会比原来大很多，之前的依赖项、解释器、第三方库都被打包进了可执行文件。## 指定图标 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller <span class="token parameter variable">--onefile</span> <span class="token parameter variable">--icon</span><span class="token operator">=</span>myicon.ico app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>myicon.ico是你的图标文件，它最好和app.py放在同一级目录，ico文件可以用图片文件在<ahref="https://www.aconvert.com/cn/icon/png-to-ico/">aconvert</a>自行制作。指定图标之后，你的可执行文件的图标就不再是 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023419650.png" />这样的默认可执行文件图标了</p><h2 id="不显示控制台窗口适用于-gui-应用程序">不显示控制台窗口（适用于GUI 应用程序）</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller <span class="token parameter variable">--onefile</span> <span class="token parameter variable">--windowed</span> app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这样一来，启动可执行文件就不会启动终端了。 ##打包外部资源（如图片、音频等） <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># Windows</span>pyinstaller --add-data <span class="token string">"path_to_file;target_folder"</span> app.py<span class="token comment"># macOS/Linux</span>pyinstaller --add-data <span class="token string">"path_to_file:target_folder"</span> app.py<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre> 比如你的文件结构长这样：<pre class="line-numbers language-txt" data-language="txt"><code class="language-txt">project_folder/│├── app.py                        # 主程序├── resources/                    # 顶层文件夹│   ├── images/│   │   └── assets/│   │       └── logo.png          # 需要打包的图片文件│   └── config/│       └── config.yaml           # 需要打包的配置文件<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> 此时，logo.png 被放在 resources/images/assets/文件夹下，而 config.yaml 位于 resources/config/ 文件夹中。那么，此时，windows命令就是： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller <span class="token parameter variable">--onefile</span> <span class="token punctuation">\</span>    --add-data <span class="token string">"resources/config/config.yaml;resources/config"</span> <span class="token punctuation">\</span>    --add-data <span class="token string">"resources/images/assets/logo.png;resources/images/assets"</span> app.py<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></p><h1 id="生成后的文件">生成后的文件</h1><p>打包完成后，你会在 dist 文件夹中找到打包好的可执行文件。 如果你使用了–onefile 选项，它会生成一个独立的 .exe 文件（Windows）或其他可执行文件。如果没有使用 –onefile，则会生成一个包含多个文件的目录。</p><h1 id="使用-.spec-文件">使用 .spec 文件</h1><p>PyInstaller 会生成一个 .spec文件，其中保存了打包时的配置信息。如果你想修改打包过程中的某些细节，可以编辑这个.spec 文件，然后使用以下命令重新打包： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller app.spec<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><h1 id="其他">其他</h1><p>上述打包 Python 脚本的各种选项可以叠加，比如假设你想要打包一个 GUI程序，并生成一个单独的可执行文件，同时使用自定义图标，可以运行：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pyinstaller <span class="token parameter variable">--onefile</span> <span class="token parameter variable">--windowed</span> <span class="token parameter variable">--icon</span><span class="token operator">=</span>myicon.ico app.py<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;作为一种解释型语言而非编译型语言，python并不像C++那样可以直接生成可执行文件。
这意味着一个python程序想在另一台电脑上跑就必须在另一台电脑装python解释器。但生活经验告诉你，你用的应用都有可执行文件（windows中是exe），它们当中大概率有python编译的部分，但它们为什么可以有可执行文件？
事实上，python也不是完全不能有可执行文件，但是要通过工具打包，PyInstaller就是一种方法。
PyInstaller 是一个将 Python 脚本打包为独立可执行文件的工具，支持
Windows、macOS 和 Linux 系统。以下是使用 PyInstaller 的步骤：</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
    <category term="pyinstaller" scheme="https://fallingnight.com/tags/pyinstaller/"/>
    
  </entry>
  
  <entry>
    <title>通过aplayer为Arknights主题博客添加背景音乐</title>
    <link href="https://fallingnight.com/2024/10/11/%E9%80%9A%E8%BF%87aplayer%E4%B8%BA%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90/"/>
    <id>https://fallingnight.com/2024/10/11/%E9%80%9A%E8%BF%87aplayer%E4%B8%BA%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90/</id>
    <published>2024-10-10T19:18:08.000Z</published>
    <updated>2025-04-18T16:16:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="安装aplayer">安装aplayer</h1><pre class="line-numbers language-none"><code class="language-none">npm install aplayer --save<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>直接在博客根目录输入命令即可 随后在_config.yml文件最底部加上<pre class="line-numbers language-none"><code class="language-none">aplayer:  preload: &#39;metadata&#39;  theme: &#39;#e6d0b2&#39;  autoplay: true  loop: &#39;all&#39;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre> <span id="more"></span></p><h1 id="数据准备">数据准备</h1><p>想要用aplayer在博客放音乐，需要三种文件： 1. mp3文件(音频) 2.jpg/png文件(音乐封面) 3. lrc文件(歌词)</p><p>将准备好的文件放在如下位置 <pre class="line-numbers language-none"><code class="language-none">your-blog&#x2F;├── source&#x2F;│   ├── assets&#x2F;│   │   ├── music&#x2F;│   │   │   └── yourmusic.mp3│   │   ├── images&#x2F;│   │   │   └── yourmusic.jpg│   │   └── lrc&#x2F;│   │       └── yourmusic.lrc├── themes&#x2F;│   └── your-theme&#x2F;│       └── layout&#x2F;│           └── layout.pug├── _config.yml└── ...<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>在source下创建相应的文件夹，并将文件放入。</p><h1 id="在某篇文章添加音乐">在某篇文章添加音乐</h1><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">&#123;% aplayerlist %&#125;&#123;    "autoplay": true,    "showlrc": 0,    "mutex": true,    "music": [        &#123;            "title": "music name",            "author": "author name",            "url": "/assets/music/music.mp3",            "pic": "/assets/images/music.jpg",            "lrc": "/assets/lrc/music.lrc"        &#125;    ]&#125;&#123;% endaplayerlist %&#125;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>直接在想加音乐的文章中加入上述代码就会得到下面的效果（没有的话就刷新一下页面）：         <div id="aplayer-jLPKpmdr" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;"></div>  <script>  var options = {"narrow":false,"autoplay":false,"showlrc":0,"mutex":true,"music":[{"title":"ALLU","author":"泽野弘之","url":"https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/audio/ALLU.mp3","pic":"https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308032711151.png"}]};  options.element = document.getElementById("aplayer-jLPKpmdr");  var ap = new APlayer(options);    window.aplayers || (window.aplayers = []);  window.aplayers.push(ap);  </script>文章中多了一个音乐播放器，于是音乐添加成功了。</p><p>如果不想占用本地空间，url、pic、lrc后面也可以换成网址，像这样：<pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">&#123;% aplayerlist %&#125;&#123;    "autoplay": true,    "showlrc": 0,    "mutex": true,    "music": [        &#123;            "title": "music name",            "author": "author name",            "url": "https://...",            "pic": "https://...",            "lrc": "https://..."        &#125;    ]&#125;&#123;% endaplayerlist %&#125;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><p>这个三个网址是外部连接，可以通过将文件上传到<ahref="https://www.qiniu.com/">七牛云</a>的云存储空间以后生成。当然，如果觉得麻烦，也可以直接上传到github仓库。</p><h1id="在arknights主题中增加可自由关闭的全局背景音乐">在Arknights主题中增加可自由关闭的全局背景音乐</h1><p>上面的方法是将音乐播放器添加在文章中，而现在我们要实现的是博客的全局背景音乐，笔者用的主题是Arknights主题，本身并没有提供aplayer的接口，所以我在界面中自己加了一个按钮来控制背景音乐的开关。接下来是具体步骤：## 找到layout.pug文件 文件位置如下： <pre class="line-numbers language-none"><code class="language-none">your-blog&#x2F;├── source&#x2F;│   ├── assets&#x2F;│   │   ├── music&#x2F;│   │   │   └── yourmusic.mp3│   │   ├── images&#x2F;│   │   │   └── yourmusic.jpg│   │   └── lrc&#x2F;│   │       └── yourmusic.lrc├── themes&#x2F;│   └── arknights&#x2F;│       └── layout&#x2F;│         └── includes&#x2F;│           └── layout.pug├── _config.yml└── ...<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h2 id="修改layout.pug文件">修改layout.pug文件</h2><p>直接把文件修改替换成如下： <pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">-  let pageTitle = page.title || config.subtitle || ''  if (is_post()) pageTitle = page.title  if (is_archive()) pageTitle = __('menu.archive.plural')  if (is_tag()) pageTitle = __('menu.tag.plural') + ': ' + page.tag  if (is_category()) pageTitle = __('menu.category.plural') + ': ' + page.category  if (is_month()) pageTitle += ': ' + page.month + '/' + page.year  if (is_year()) pageTitle += ': ' + page.year  if (pageTitle) pageTitle += ' | '  pageTitle += config.title  const asideLogo = theme.aside.logo  const pjax = theme.pjax ? theme.pjax.enable : false  let searchConfig = null  if (theme.search !== undefined &amp;&amp; theme.search.enable === true) searchConfig = theme.search;  const configs = JSON.stringify(&#123;    root: config.root,    search: &#123;      preload: searchConfig.preload,      activeHolder: __('search.activeHolder'),      blurHolder: __('search.blurHolder'),      noResult: __('search.noResult')    &#125;,    code: &#123;      codeInfo: __('code.codeInfo'),      copy: __('code.copy')    &#125;  &#125;)doctype htmlhtml(lang=config.language theme-mode=theme.color)  head    include ./meta-data.pug    link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css")    style.      #music-control &#123;        position: absolute; /* 使用绝对定位 */        bottom: 10px; /* 距离底部 10 像素 */        left: 30px; /* 距离左侧 30 像素 */        padding: 10px 20px;        font-size: 16px;        color: white;        background-color: rgba(0, 0, 0, 0.5);        border: 0.5px solid white;        border-radius: 0px;        cursor: pointer;        display: flex; /* 使用 flex 布局 */        align-items: center; /* 垂直居中 */        transition: background-color 0.3s ease, color 0.3s ease; /* 添加过渡效果 */      &#125;      #music-control:hover &#123;        background-color: rgba(90, 90, 90, 0.5);        color: #26a5e0;      &#125;  body    if pjax      .loading(style="opacity: 0;")        .loadingBar.left        .loadingBar.right    main      include ./header.pug      // 在这里添加控制按钮      button#music-control(type="button") 背景音乐-♪      article        if body          div!= body        else          block content        include ./bottom-btn.pug      include ./aside.pug    if theme.canvas_dust      canvas#canvas-dust    // 在这里添加 APlayer 播放器并隐藏它    #aplayer(style="display: none;")    script(src="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js")    script.      document.addEventListener('DOMContentLoaded', function () &#123;        const ap = new APlayer(&#123;          container: document.getElementById('aplayer'),          autoplay: true,          loop: 'all',          preload: 'metadata',          theme: '#e6d0b2',          audio: [            &#123;              name: 'lifestream',              artist: 'arknights',              url: '/assets/music/lifestream(machine).mp3',              cover: '/assets/images/lifestream.jpg',              lrc: '/assets/lrc/lifestream.lrc'            &#125;          ]        &#125;);        // 控制按钮的事件监听器        const controlButton = document.getElementById('music-control');        controlButton.addEventListener('click', function () &#123;          if (ap.audio.paused) &#123;            ap.play();          &#125; else &#123;            ap.pause();          &#125;        &#125;);      &#125;);<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><p>修改完以后再通过 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo clean<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo g<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo s<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>重新构建博客，打开网页以后，界面的左下角始终有一个新的按钮，点击就能自由开关背景音乐。<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308032425725.png" /></p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;安装aplayer&quot;&gt;安装aplayer&lt;/h1&gt;
&lt;pre class=&quot;line-numbers language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;npm install aplayer --save&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接在博客根目录输入命令即可 随后在_config.yml文件最底部加上
&lt;pre class=&quot;line-numbers language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;aplayer:
  preload: &amp;#39;metadata&amp;#39;
  theme: &amp;#39;#e6d0b2&amp;#39;
  autoplay: true
  loop: &amp;#39;all&amp;#39;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="html" scheme="https://fallingnight.com/tags/html/"/>
    
    <category term="hexo" scheme="https://fallingnight.com/tags/hexo/"/>
    
    <category term="aplayer" scheme="https://fallingnight.com/tags/aplayer/"/>
    
    <category term="BGM" scheme="https://fallingnight.com/tags/BGM/"/>
    
  </entry>
  
  <entry>
    <title>在Python中调用C++函数</title>
    <link href="https://fallingnight.com/2024/10/11/%E5%9C%A8Python%E4%B8%AD%E8%B0%83%E7%94%A8C-%E5%87%BD%E6%95%B0/"/>
    <id>https://fallingnight.com/2024/10/11/%E5%9C%A8Python%E4%B8%AD%E8%B0%83%E7%94%A8C-%E5%87%BD%E6%95%B0/</id>
    <published>2024-10-10T19:14:19.000Z</published>
    <updated>2025-04-18T16:16:56.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Python 作为一种解释型语言，虽然易于编写和维护，但在执行速度上可能不如C++ 这样的编译型语言。C++提供了高度优化的性能，尤其是在计算密集型任务中。有时候，你可能已经有大量用 C++ 编写的现有代码或库，重新用 Python实现这些功能费时费力。你或许想过通过调用 C++代码来复用这些现有的模块和算法。 <span id="more"></span></p><hr /><p>要实现 C++ 和 Python 跨语言编程，可以使用 Python 的 ctypes 或pybind11 来调用 C++ 代码。下面介绍两种方式： # 方法一：使用 ctypesctypes 是 Python 的一个标准库，可以让你调用 C++ 动态链接库（如 .dll）。## 编写 C++ 代码并生成动态链接库 编写 C++代码并编译成动态库（.dll），例如： <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// example.cpp</span><span class="token keyword">extern</span> <span class="token string">"C"</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> a <span class="token operator">+</span> b<span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">int</span> <span class="token function">sub</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> a <span class="token operator">-</span> b<span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre> 编译该文件生成.dll，例如使用 g++: <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">g++ <span class="token parameter variable">-shared</span> <span class="token parameter variable">-o</span> example.dll <span class="token parameter variable">-fPIC</span> example.cpp<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> C++代码中使用了extern“C”是将C++转换成C风格。 C++ 编译器会对函数名进行一种称为 “name mangling”的过程，即编译器会根据函数的名称、参数类型、返回值类型等信息生成一个唯一的标识符。这样做是为了支持函数重载（不同参数的同名函数），但它也导致编译后的函数名和源码中的名称不一致。例如，C++ 中以下两个函数可能会在编译后被重整为不同的名字： <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 可能被重整为 _Z3addii</span><span class="token keyword">float</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">float</span> a<span class="token punctuation">,</span> <span class="token keyword">float</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 可能被重整为 _Z3addff</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>这个重整过程使得 Python 的 ctypes 无法找到正确的函数名称。 ## 在 Python中使用 ctypes 调用 C++ 函数 在 Python 中调用该动态库： <pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> ctypes<span class="token comment"># 加载 C++ 动态链接库</span>example <span class="token operator">=</span> ctypes<span class="token punctuation">.</span>CDLL<span class="token punctuation">(</span><span class="token string">'./example.dll'</span><span class="token punctuation">)</span><span class="token comment"># 调用 C++ 函数</span>result <span class="token operator">=</span> example<span class="token punctuation">.</span>add<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span>  <span class="token comment"># 输出 8</span>result <span class="token operator">=</span> example<span class="token punctuation">.</span>sub<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span>  <span class="token comment"># 输出 2</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>于是我们就在Python中调用了C++的函数。 但使用 ctypes 调用 C++类是比较复杂的，因为 ctypes 主要用于处理 C 语言风格的函数调用，而 C++类的特性（如构造函数、析构函数、继承、多态等）无法直接通过 ctypes调用。于是我们需要一种泛用性更高的方法——pybind11。 # 方法二：使用pybind11 <div class="tip warning"><i class="i-adm i-warning icon"></i><div class="p"><p>请确定你可以使用Visual Studio编译器！</p></div></div> 我之前用的MinGW的编译器一直生成失败，换成visualstudio工具链的编译器就立马能生成了，应该是因为MinGW 的一些版本在处理C++11 的多线程支持时存在兼容性问题。</p><hr /><p>pybind11 是一个轻量级的库，专门用于将 C++ 和 Python 绑定。 ##安装cmake 进入<ahref="https://cmake.org/">cmake官网</a>走下载流程就行。<del>一般情况会C++的电脑里面都有cmake，除非你的电脑刚好是windows，而且电脑里刚好有visualstudio。</del> ## 下载pybind11的库 在github中搜索<ahref="https://github.com/pybind/pybind11">pybind11</a>，将仓库里面的内容下载到本地。如果下载了<a href="https://git-scm.com/">git</a>，可以直接用<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/pybind/pybind11.git<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 将文件拷贝到本地。</p><h2 id="将pybind11库放进项目文件夹">将pybind11库放进项目文件夹</h2><p>官方文档中推荐将pybind11库放进一个叫extern的文件夹里面。我们进入要使用pybind的项目的根目录，在里面新建一个叫extern的文件夹，把pybind11库移动进去。</p><h2 id="编辑cmakelist文件">编辑CmakeList文件</h2><p>打开任意一个集成开发环境(比如vscode)，在根目录创建一个CmakeLists.txt文件。<pre class="line-numbers language-cmake" data-language="cmake"><code class="language-cmake"><span class="token keyword">cmake_minimum_required</span><span class="token punctuation">(</span><span class="token property">VERSION</span> <span class="token number">3.23</span><span class="token punctuation">)</span><span class="token keyword">project</span><span class="token punctuation">(</span>example<span class="token punctuation">)</span>  <span class="token comment"># 设置项目名称</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_STANDARD</span> <span class="token number">17</span><span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_STANDARD_REQUIRED</span> <span class="token boolean">ON</span><span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token variable">CMAKE_CXX_EXTENSIONS</span> <span class="token boolean">OFF</span><span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span>PYTHON_EXECUTABLE <span class="token string">"D:/....../Python/python.exe"</span><span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span>PYTHON_LIBRARY <span class="token string">"D:/....../Python/libs/python.lib"</span><span class="token punctuation">)</span><span class="token keyword">set</span><span class="token punctuation">(</span>PYTHON_INCLUDE_DIR <span class="token string">"D:/....../Python/include"</span><span class="token punctuation">)</span><span class="token keyword">add_subdirectory</span><span class="token punctuation">(</span>extern/pybind11<span class="token punctuation">)</span><span class="token function">pybind11_add_module</span><span class="token punctuation">(</span>example example.cpp<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>将上述脚本输入CmakeLists.txt文件。其中pybind11_add_module()中的<strong>Example</strong>代表等会生成的连接库文件的名字(可以换成其他的名字)，<strong>example.cpp</strong>则是包含要调用函数或者类的cpp文件，如果有多个cpp文件，就将多个cpp文件都加上去，用空格”“隔开。set(PYTHON…………..)那三行找到你电脑里面的python文件，将exe文件、lib文件、include文件夹的绝对地址换进去。比如你用的python3.8，那第二行就要找的是python38.lib的绝对地址，以此类推，但注意的是这里选择的python和你后面解释python程序时用的python解释器必须是同一个python(比如你现在填的3.8后面就一定要用3.8去解释)</p><h2 id="编写要调用的cpp文件">编写要调用的cpp文件</h2><h3 id="c函数的例子">C++函数的例子</h3><p>//example.cpp <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;pybind11/pybind11.h></span></span><span class="token keyword">namespace</span> py <span class="token operator">=</span> pybind11<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">,</span> <span class="token keyword">int</span> j<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> i <span class="token operator">+</span> j<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token function">PYBIND11_MODULE</span><span class="token punctuation">(</span>example<span class="token punctuation">,</span> m<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token comment">// 可选，说明这个模块是做什么的</span>    m<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token string">"pybind11 example plugin"</span><span class="token punctuation">;</span>    <span class="token comment">//def( "给python调用方法名"， &amp;实际操作的函数， "函数功能说明" ，py::arg()初始化). 其中函数功能说明和初始化为可选</span>    m<span class="token punctuation">.</span><span class="token function">def</span><span class="token punctuation">(</span><span class="token string">"add"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>add<span class="token punctuation">,</span> <span class="token string">"A function which adds two numbers"</span><span class="token punctuation">,</span> py<span class="token double-colon punctuation">::</span><span class="token function">arg</span><span class="token punctuation">(</span><span class="token string">"i"</span><span class="token punctuation">)</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span> py<span class="token double-colon punctuation">::</span><span class="token function">arg</span><span class="token punctuation">(</span><span class="token string">"j"</span><span class="token punctuation">)</span><span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h3 id="c类的例子">C++类的例子</h3><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">//example.cpp</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;pybind11/pybind11.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream></span></span><span class="token keyword">namespace</span> py <span class="token operator">=</span> pybind11<span class="token punctuation">;</span><span class="token comment">// 绑定一个类</span><span class="token keyword">class</span> <span class="token class-name">SomeClass</span><span class="token punctuation">&#123;</span><span class="token keyword">public</span><span class="token operator">:</span>    <span class="token function">SomeClass</span><span class="token punctuation">(</span><span class="token keyword">float</span> scale_<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">scale</span><span class="token punctuation">(</span>scale_<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span>    <span class="token keyword">float</span> <span class="token function">multiply</span><span class="token punctuation">(</span><span class="token keyword">float</span> input<span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">float</span> res <span class="token operator">=</span> input <span class="token operator">*</span> scale<span class="token punctuation">;</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"res:"</span> <span class="token operator">&lt;&lt;</span> res <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>        <span class="token keyword">return</span> res<span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token keyword">private</span><span class="token operator">:</span>    <span class="token keyword">float</span> scale<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token function">PYBIND11_MODULE</span><span class="token punctuation">(</span>example<span class="token punctuation">,</span> m<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    py<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">class_</span><span class="token generic class-name"><span class="token operator">&lt;</span>SomeClass<span class="token operator">></span></span></span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> <span class="token string">"SomeClass"</span><span class="token punctuation">)</span>       <span class="token comment">// 绑定一个类</span>        <span class="token punctuation">.</span><span class="token function">def</span><span class="token punctuation">(</span><span class="token string">"multiply"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>SomeClass<span class="token double-colon punctuation">::</span>multiply<span class="token punctuation">)</span> <span class="token comment">// 绑定一个成员函数</span>        <span class="token punctuation">.</span><span class="token function">def</span><span class="token punctuation">(</span>py<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">init</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">float</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token comment">// 绑定一个构造函数</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="通过cmake构建动态连接库文件">通过cmake构建动态连接库文件</h2><p>在根目录创建一个名为build的文件夹，进入文件夹那级目录，在终端依次输入：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token punctuation">..</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">cmake <span class="token parameter variable">--build</span> <span class="token builtin class-name">.</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> (<span class="hide"><object><p>当然如果你装了和cmake有关的插件(Cmake和CmakeTools)也可以用神秘小按钮代替命令</p></object></span> )</p><p>(<span class="hide"><object><p>Cmake为CmakeLists.txt增加高亮等功能，CmakeTools在下方增加了方便构建的按钮</p></object></span> )这时你的build文件夹里出现了很多文件，在里面找到Debug(也可能是Release)文件夹，在其中找到一个.pyd(或者.so)结尾的文件，那就是动态链接库文件，后续会用到。</p><h2id="编写python文件并引入c写的模块">编写python文件，并引入C++写的模块</h2><h3 id="引入函数情况的例子">引入函数情况的例子</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># example.py</span><span class="token keyword">import</span> sys<span class="token comment"># 添加生成的模块路径</span>sys<span class="token punctuation">.</span>path<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">"D:/....../your_project/build/Debug"</span><span class="token punctuation">)</span><span class="token comment"># 或者sys.path.append("D:/....../your_project/build/Release")</span><span class="token keyword">import</span> example <span class="token keyword">as</span> hw  <span class="token comment"># 测试调用</span><span class="token keyword">print</span><span class="token punctuation">(</span>hw<span class="token punctuation">.</span>add<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>     <span class="token operator">//</span>result：<span class="token number">3</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="引入类情况的例子">引入类情况的例子</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># example.py</span><span class="token keyword">import</span> sys<span class="token comment"># 添加生成的模块路径</span>sys<span class="token punctuation">.</span>path<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">"D:/....../your_project/build/Debug"</span><span class="token punctuation">)</span><span class="token comment"># 或者sys.path.append("D:/....../your_project/build/Release")</span><span class="token keyword">import</span> example <span class="token keyword">as</span> epa <span class="token operator">=</span> ep<span class="token punctuation">.</span>SomeClass<span class="token punctuation">(</span><span class="token number">3.0</span><span class="token punctuation">)</span>a<span class="token punctuation">.</span>multiply<span class="token punctuation">(</span><span class="token number">2.0</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>sys.path.append()将包含 .pyd (或者.so)文件的目录添加到 sys.path中，便于模块导入。</p><p>导入以后就可以直接运行了，切记，要用和之前set(PYTHON…………..)里面填的一样的python解释器去运行，不然不一定会成功，如果你的集成开发环境安装了runcode这样的插件，也记得换成python解释器，run code跑不了一点。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Python 作为一种解释型语言，虽然易于编写和维护，但在执行速度上可能不如
C++ 这样的编译型语言。C++
提供了高度优化的性能，尤其是在计算密集型任务中。
有时候，你可能已经有大量用 C++ 编写的现有代码或库，重新用 Python
实现这些功能费时费力。你或许想过通过调用 C++
代码来复用这些现有的模块和算法。</summary>
    
    
    
    <category term="技术笔记" scheme="https://fallingnight.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://fallingnight.com/tags/C/"/>
    
    <category term="Python" scheme="https://fallingnight.com/tags/Python/"/>
    
    <category term="Ctype" scheme="https://fallingnight.com/tags/Ctype/"/>
    
    <category term="Pybind" scheme="https://fallingnight.com/tags/Pybind/"/>
    
  </entry>
  
  <entry>
    <title>在Arknights 主题中通过valine配置评论区</title>
    <link href="https://fallingnight.com/2024/10/08/%E5%9C%A8Arknights-%E4%B8%BB%E9%A2%98%E4%B8%AD%E9%80%9A%E8%BF%87valine%E9%85%8D%E7%BD%AE%E8%AF%84%E8%AE%BA%E5%8C%BA/"/>
    <id>https://fallingnight.com/2024/10/08/%E5%9C%A8Arknights-%E4%B8%BB%E9%A2%98%E4%B8%AD%E9%80%9A%E8%BF%87valine%E9%85%8D%E7%BD%AE%E8%AF%84%E8%AE%BA%E5%8C%BA/</id>
    <published>2024-10-08T10:10:35.000Z</published>
    <updated>2025-04-18T16:17:16.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="安装valine环境">安装valine环境</h1><p>输入命令 <pre class="line-numbers language-none"><code class="language-none">npm install valine --save<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> <span id="more"></span></p><h1 id="获取appidappkey和server_url">获取AppID、AppKey和server_url</h1><p>AppID、AppKey和server_url通过后端服务平台<ahref="https://console.leancloud.app/">LeanCloud</a>获取，记得最好是国际版（问就是国内版没配成功。。。）点击左上角创建应用 <imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308021649179.png" />取个名字，然后选开发版应用创建好以后，进入刚刚创建的应用，选择左边的设置&gt;应用凭证，然后就能看到你的AppID、AppKey和server_url了。<imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308021740180.png" />注意，在应用凭证这个界面里，server_url对应的是REST API 服务器地址</p><h1 id="配置文件">配置文件</h1><p>复制上述的三串东西，在你对应主题的_config文件里把地址黏贴在valine对应位置<pre class="line-numbers language-none"><code class="language-none">valine:  enable: true  app_id:   app_key:   server_url:    avatar: &#39;gravatar&#39; # (&#39;&#39;&#x2F;mp&#x2F;identicon&#x2F;monsterid&#x2F;wavatar&#x2F;robohash&#x2F;retro&#x2F;hide)  avatar_cdn: &#39;https:&#x2F;&#x2F;dn-qiniu-avatar.qbox.me&#x2F;avatar&#x2F;&#39; # 自定义 avatar cdn<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></p><h1 id="安全域名">安全域名</h1><p>在之前<ahref="https://console.leancloud.app/">LeanCloud</a>的设置栏下的安全中心中，在Web安全域名框里填下你的博客网址。<br /><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308021508202.png" />之后，评论区就配置好了</p><h1 id="管理评论">管理评论</h1><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308021830140.png" />在数据存储-&gt;结构化数据-&gt;Comment里面可以看到你博客下发送的评论，你也可以根据需求删除或对这些评论进行其他操作。</p><h1 id="自定义头像">自定义头像</h1><p>在<ahref="https://gravatar.com/">gravatar</a>用邮箱注册一个账户并设置头像，以后如果在valine评论区配置中的<strong>avatar:</strong>参数为<strong>‘gravatar’</strong>的博客中评论，头像就会变成你在<ahref="https://gravatar.com/">gravatar</a>设置的头像。头像设置完有个缓存期，期间评论没有头像不必心急。</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;安装valine环境&quot;&gt;安装valine环境&lt;/h1&gt;
&lt;p&gt;输入命令 &lt;pre class=&quot;line-numbers language-none&quot;&gt;&lt;code class=&quot;language-none&quot;&gt;npm install valine --save&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="hexo" scheme="https://fallingnight.com/tags/hexo/"/>
    
    <category term="valine" scheme="https://fallingnight.com/tags/valine/"/>
    
  </entry>
  
  <entry>
    <title>Hello World(第一次使用hexo框架搭博客的过程)</title>
    <link href="https://fallingnight.com/2024/10/06/hello-world/"/>
    <id>https://fallingnight.com/2024/10/06/hello-world/</id>
    <published>2024-10-05T16:00:00.000Z</published>
    <updated>2025-09-13T12:24:29.184Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/blog/assets/css/APlayer.min.css"><script src="/blog/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023923486.png" /></p><p>第一次写博客，就简述一下我用hexo搭建博客的过程吧。 <span id="more"></span></p><h1 id="要安装的环境">要安装的环境</h1><h2 id="git">git</h2><p>Git 是一个开源的分布式版本控制系统，git自带的gitbash可以让你在如windows这样的操作系统上也能执行Linux的命令。这在后续安装hexo时执行安装命令，以及部署hexo到github上时，会发挥其作用。git的下载网站如下：<a href="https://git-scm.com/">git官网</a>。下载完毕以后，记得打开 Path 变量，添加本地环境安装目录。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-06%20200948.png" /></p><p>安装以后，就可以右键菜单中找到并使用git bash了</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-06%20201724.png" /></p><h2 id="node.js">node.js</h2><p>运行 Hexo 需要 JavaScript 环境, Hexo 的命令行工具（如 hexo init、hexogenerate、hexo deploy 等）都是 JavaScript 脚本，它们依赖于 node.js来运行。因此，安装 Node.js 是为了提供执行 Hexo 的环境。node.js下载网站如下：<ahref="https://nodejs.org/en/">node官网</a>。记得直接下载那个LTS版本。</p><h2 id="hexo">hexo</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> hexo-cli<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>直接在任意地方打开git bash输入上述指令就行，hexo会被安装到你的 npm全局目录，它的执行文件会被加入到环境变量path中，之后你就可以在任意终端中执行hexo命令。</p><h1 id="在本地搭建博客">在本地搭建博客</h1><h2 id="初始化">初始化</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo init blog<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在磁盘中找一个好位置（通常就是你平时新建项目的地方）通过上述命令初始化 Hexo 项目（当然，上述命令中的blog也可以改成其他名字）之后你就得到了一个叫blog（或者其他名字）的项目文件夹，初始化的工作就完成了。</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-06%20205114.png" /></p><h2 id="生成">生成</h2><p>随后用一个你平时常用的集成开发环境（推荐vscode、WebStorm）打开之前得到的项目文件夹（blog）。在blog这一级文件夹中使用命令：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo g<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>该指令的作用是在Hexo站点根目录下自动生成静态文件，这些文件通常被保存在一个名为“public”的文件夹中。（通常是html文件）如果命令执行失败了，可以试试执行： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>再重新执行之前的指令。</p><h2 id="启动本地服务器">启动本地服务器</h2><p>生成完毕以后，就可以在本地浏览先前生成的网页了。 通过执行<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo s<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 在终端获得一个网站</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-06%20211446.png" /></p><p>打开网站就进入了通过hexo生成的初始博客界面</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-06%20211554.png" /></p><h2 id="主题">主题</h2><p>刚刚生成的博客界面较为简陋，可以通过替换主题令其符合我们喜欢风格主题可以在<a href="https://hexo.io/themes/">官网提供的主题栏</a>下载。点开想要下载的主题后一般会进入相应的github仓库，随后跟着相应的readme文件教程配置就行。</p><h1 id="部署">部署</h1><p>只能在本地运行就意味着别人看不到，这与我们的期望相悖了，想要让博客可以在网上被别人查看，我们可以将其部署在githubpage上，再关联一个域名。</p><h2 id="新建仓库">新建仓库</h2><p>先在github新建一个仓库，一定要注意的是，仓库名要设置为username.github.io,其中username就是你github的账户名，不这么取名就部署不了。</p><h2 id="配置_config.yml文件">配置_config.yml文件</h2><p>在blog目录下找到_config.yml文件，在文件的末尾加上如下代码：<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">deploy</span><span class="token punctuation">:</span>  <span class="token key atrule">type</span><span class="token punctuation">:</span> git  <span class="token key atrule">repository</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//github.com/username/username.github.io.git  <span class="token key atrule">branch</span><span class="token punctuation">:</span> main<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>其中，username替换成你github的账户名（repository就是那个仓库的网址）</p><h2 id="执行部署命令">执行部署命令</h2><p>在终端输入： <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 之后完成部署</p><h2 id="查看博客">查看博客</h2><p>在浏览器的网址栏输入username.github.io,也就是之前的仓库名，就能进入你博客的首页了。</p><h2 id="关联域名">关联域名</h2><p>虽然通过username.github.io就可以查看自己的博客，但是在平时的生活经验中，网址的后缀一般都是.com、.cn这种，.github.io这种结尾在其他人看来会十分突兀，我们当然希望别人可通过.com、.cn这种符合生活经验的网址来查看我们的博客。要实现这点，我们可以关联一个域名到原本的githubpage上面，这样我们通过原本username.github.io这样的网址和新的网址就都可以访问博客了。</p><h3 id="获取域名">获取域名</h3><p>国内我们可以在阿里云、腾讯云这样的网站购买域名，像.com这样的域名会贵一些，.cn、.top之类的价格就民亲多了。价格还会和域名的名字有关，名字是要你自己取的，可以在官方平台查询你取的域名在不同后缀的价格。阿里云官网查询的网址如下：<ahref="https://wanwang.aliyun.com/domain?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.22.54712f3d7XBoz4&amp;scm=20140722.S_card@@%E4%BA%A7%E5%93%81@@3417315._.ID_card@@%E4%BA%A7%E5%93%81@@3417315-RL_%E5%9F%9F%E5%90%8D-LOC_search~UND~card~UND~item-OR_ser-PAR1_2150461f17283693878245823ebb0d-V_3-RE_cardNew"><阿里云域名查询></a>进去直接在搜索框输入你取的域名就行，如果你取了类似aaa这样的域名的话，你可能会看见打底几万的天价，所以取名的时候尽量避免这种特殊的名字，如果你取的名字实在太贵可以在后面加几个数字试试。正常情况下你会看见如下的价位：</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20154636.png" /></p><p>追求性价比的话选个top的后缀也不错，当然，如果你要选com和cn也完全没问题,就是可能贵点。直接点注册就行，第一次注册域名会要求你实名认证，照着提示认证就行（不然后面解析和续费啥的都会受影响）。注册完域名以后，我们就有了一个可以关联到之前githubpage的新网址。</p><h3 id="解析域名">解析域名</h3><p>在<ahref="https://www.aliyun.com/?spm=5176.20180516001.console-base_top-nav.dlogo.14094babVNCrB0">阿里云首页</a>点击右上角控制台，进入控制台后点击左上角菜单点击域名</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20160219.png" /></p><p>点击左边域名列表，就能查看到之前注册的域名了，在操作一栏选择解析，再点击添加记录，之后按照如下填法添加两条记录：</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20161154.png" /></p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20161319.png" /></p><p>其中记录值那里就填你先前在githubpage浏览博客时用的网址(不用带http)</p><h3 id="github-page配置">github page配置</h3><p>之后进入原先的代码仓库，点击setting，然后点击左侧菜单的page选项</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20165317.png" /></p><p>进入之后，找到Custom domain</p><p><imgsrc="https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/2024-10-08%20165439.png" /></p><p>在其中填入你之前注册的新域名，一开始可能会失败，失败了就等待一会再试试成功了以后，新域名就可以访问你的博客了，而且原先.github.io的域名也可以访问，也就是说现在，你有两个网址可以打开你的博客。</p><h3 id="注意">注意</h3><p>配置好githubpage之后在你的github仓库里面会生成一个名叫CNAME的文件，记得把这个文件拷贝到本地，不然在后续更新博客的时候会把仓库里面的CNAME文件抹去，CNAME文件没了就只能重新进行githubpage配置了，否则用新域名就无法访问博客了。</p><h1 id="更新博客">更新博客</h1><h2 id="上传更新的内容">上传更新的内容</h2><p>在修改了博客的内容之后，想要更新之前上传在github的博客内容，在终端输入<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo deploy <span class="token parameter variable">-g</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre> 就能将更新的内容上传了。</p><h2 id="修改文章内容">修改文章内容</h2><p>在blog/source/_posts目录下，你会发现.md文件，这种文件支持markdown语法，通过修改这些文件的内容就可以实现对文章内容的修改。</p><h2 id="增加新的页面">增加新的页面</h2><p>在终端中执行 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo new page <span class="token string">'pagename'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>可以新建一个页面，这个页面会以文件夹的形式生成在blog/source下，其中pagename可以替换成其他名字，在网页中，新的页面和Home以及Achieve同级</p><h2 id="增加新的文章">增加新的文章</h2><p>在终端中执行 <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo new <span class="token string">"postname"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>可以新建一个文章，这个文章生成在blog/source/_posts下，其中postname可以替换成其他名字，生成的文件是.md文件，可以通过markdown语法编写。</p><p>到这里，基础的hexo使用方法就这样了，想要有更加炫酷的界面，可以参考主题和插件。其他的实在暂时想不到了，想到了再加，开摆！</p><link rel="stylesheet" href="/blog/css/spoiler.css" type="text/css"><script src="/blog/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img
src=&quot;https://fallingnight131.oss-cn-shanghai.aliyuncs.com/blog/image/20250308023923486.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一次写博客，就简述一下我用hexo搭建博客的过程吧。</summary>
    
    
    
    <category term="心得分享" scheme="https://fallingnight.com/categories/%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="hexo" scheme="https://fallingnight.com/tags/hexo/"/>
    
  </entry>
  
</feed>
