0%

线性规划(LP)问题:定义与求解方法

线性规划(Linear Programming,简称 LP)是运筹学中研究较早、应用广泛的优化模型,核心是在一组线性约束条件下,求解线性目标函数的最大值或最小值。它在资源分配、生产计划、物流优化等领域有重要应用。

LP 问题的核心构成

一个标准的 LP 问题包含三个要素:

  1. 决策变量:需要优化的未知量(通常记为x₁, x₂, ..., xₙ),代表实际问题中的可调整参数(如生产数量、运输量等)。
  2. 目标函数:关于决策变量的线性函数,需最大化(max)或最小化(min)。
    形式:max/min z = c₁x₁ + c₂x₂ + ... + cₙxₙcᵢ为系数,代表各变量对目标的贡献)。
  3. 约束条件:关于决策变量的线性等式或不等式,描述问题的限制(如资源总量、生产能力等)。
    形式:
    • 不等式约束:aᵢ₁x₁ + aᵢ₂x₂ + ... + aᵢₙxₙ ≤ bᵢ≥ bᵢi=1,2,...,m
    • 等式约束:aᵢ₁x₁ + ... + aᵢₙxₙ = bᵢ
    • 非负约束:xᵢ ≥ 0(通常默认决策变量非负)

示例:简单 LP 问题

某工厂生产 A、B 两种产品,A 每件利润 3 元,B 每件利润 5 元。生产 1 件 A 需 2 小时工时,生产 1 件 B 需 3 小时工时,总工时不超过 12 小时。求最大利润。

  • 决策变量:x₁(A 的产量),x₂(B 的产量)。
  • 目标函数:max z = 3x₁ + 5x₂(最大化利润)。
  • 约束条件:
    2x₁ + 3x₂ ≤ 12(工时约束),
    x₁ ≥ 0, x₂ ≥ 0(非负约束)。

LP 问题的求解方法

阅读全文 »

Yarn深度解析:分布式资源调度的核心框架

YARN(Yet Another Resource Negotiator)是 Hadoop 生态系统中的资源管理和调度平台,负责协调集群中的计算资源(CPU、内存等)并为应用程序分配资源。它将 MapReduce v1 中的 JobTracker 功能拆分为 资源管理作业监控 两部分,实现了资源与应用程序的解耦,支持多种计算框架(如 MapReduce、Spark、Flink 等)共享集群资源。本文将从 YARN 的架构、核心组件、调度策略到实战配置,全面解析其工作原理与优化方法。

YARN 核心架构与组件

YARN 采用 主从架构,由一个全局的 ResourceManager、每个节点上的 NodeManager、每个应用程序的 ApplicationMaster 以及资源容器 Container 组成。整体架构如下:

flowchart TD  
    subgraph 集群节点  
        A[ResourceManager
全局资源管理器] B[NodeManager
节点资源管理器] C[NodeManager
节点资源管理器] end subgraph 应用程序 D[ApplicationMaster
应用主控] E[Container
资源容器] F[Container
资源容器] end A -- 资源分配 --> B A -- 资源分配 --> C A -- 启动/监控 --> D D -- 申请资源 --> A D -- 管理任务 --> E D -- 管理任务 --> F B -- 提供容器 --> E C -- 提供容器 --> F

ResourceManager(RM):全局资源总管

ResourceManager 是 YARN 的核心组件,负责集群资源的全局管理和调度,主要功能包括:

核心职责
  • 接收客户端请求:处理应用程序的提交、终止等请求;
  • 资源分配与调度:将集群资源(CPU、内存)以 Container 形式分配给应用程序;
  • 监控 NodeManager:跟踪节点状态,处理节点故障;
  • 启动与监控 ApplicationMaster:为每个应用程序启动 ApplicationMaster,并监控其生命周期。
核心模块
  • 调度器(Scheduler):根据策略分配资源(不负责监控应用);
  • 应用管理器(ApplicationsManager):管理应用程序的生命周期(启动 AM、处理失败重试)。

NodeManager(NM):节点资源管家

NodeManager 是每个节点上的资源管理器,负责本节点的资源管理和任务监控:

核心职责
  • 资源管理:管理节点上的 CPU、内存等资源,向 ResourceManager 汇报节点资源使用情况;
  • 容器管理:创建、启动、停止 Container,监控容器的资源使用(如内存超限则杀死容器);
  • 与 AM 交互:接收 ApplicationMaster 的指令,执行具体任务(如启动 Map/Reduce 任务);
  • 日志管理:收集容器的日志并存储到 HDFS 或本地磁盘。
阅读全文 »

MySQL 注释用法详解

在 MySQL 中,注释是提高 SQL 语句可读性的重要手段,可用于解释逻辑、标注功能或临时屏蔽代码。MySQL 支持三种注释方式,适用于不同场景:

单行注释

1. # 开头的注释

  • 语法# 注释内容# 后直接跟注释文字,无需空格)。
  • 适用场景:单行注释,常用于 SQL 语句末尾或单独一行。
1
2
3
4
5
6
-- 示例 1:语句后注释
SELECT * FROM users WHERE status = 1; # 查询状态为1的用户

-- 示例 2:单独一行注释
# 以下语句用于统计今日新增订单
SELECT COUNT(*) FROM orders WHERE create_time >= CURDATE();

2. --开头的注释

  • 语法-- 注释内容(注意 -- 后必须跟至少一个空格,否则会被视为 SQL 语法的一部分)。
  • 适用场景:单行注释,与 # 功能类似,是 SQL 标准的注释方式。
阅读全文 »

MySQL 常用语句大全:从基础操作到系统信息查询

MySQL 提供了丰富的语句用于数据库管理、表操作及系统信息查询。本文整理了日常开发和运维中最常用的语句,涵盖数据库 / 表操作、状态查询、编码设置等场景,帮助快速掌握 MySQL 核心操作。

系统信息查询

1. 查看服务器状态与变量

1
2
3
4
5
6
7
8
-- 查看所有系统状态变量(session 级别,当前连接有效)
SHOW STATUS;

-- 查看全局系统状态变量(所有连接共享)
SHOW GLOBAL STATUS;

-- 过滤查询特定状态(如中断的客户端连接数)
SHOW STATUS LIKE 'Aborted_clients'; -- 支持通配符(% 匹配任意字符)
1
2
3
4
5
-- 查看所有系统配置变量(如字符集、连接数等)
SHOW VARIABLES;

-- 查看全局配置变量
SHOW GLOBAL VARIABLES LIKE 'max_connections'; -- 查看最大连接数

2. 版本与环境信息

阅读全文 »

Struts2 访问 Web 资源的两种方式详解

在 Struts2 框架中,Web 资源(如HttpServletRequestHttpSessionServletContext等)的访问方式分为与 Servlet API 解耦与 Servlet API 耦合两种。两种方式各有适用场景,下面详细解析其实现方式与使用场景。

与 Servlet API 解耦的方式

这种方式通过 Struts2 封装的 API 访问 Web 资源,不直接依赖 Servlet 原生类,便于进行单元测试,适合大多数业务场景。

1. 使用 ActionContext(核心方式)

ActionContext是 Struts2 的上下文对象,封装了当前请求的所有信息,可通过它间接访问 Web 资源对应的 Map 对象。

核心方法与示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import com.opensymphony.xwork2.ActionContext;
import java.util.Map;

public class UserAction {
public String execute() {
// 获取ActionContext实例(单例,与当前请求绑定)
ActionContext actionContext = ActionContext.getContext();

// 1. 获取application域(对应ServletContext)
Map<String, Object> applicationMap = actionContext.getApplication();
applicationMap.put("appKey", "全局应用数据"); // 存储数据
Object appValue = applicationMap.get("appKey"); // 获取数据

// 2. 获取session域
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("userName", "张三"); // 存储用户会话数据
Object user = sessionMap.get("userName");

// 3. 获取request域(需通过"request"键获取,Struts2未直接提供getRequest()方法)
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("msg", "请求数据");
Object msg = requestMap.get("msg");

// 4. 获取请求参数(封装为Map,键是参数名,值是参数值数组)
Map<String, Object> params = actionContext.getParameters();
String[] ids = (String[]) params.get("id"); // 适用于多值参数
String name = (String) params.get("name"); // 单值参数

return "success";
}
}
特点:
阅读全文 »