GLPK(GNU线性规划工具包)介绍
GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包),可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库,最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载,仅包含源码,最新版本为5.0。
GLPK是用C实现的,旨在解决线性规划(LP, Linear Programming)、混合整数线性规划(MIP, Mixed Integer linear Programming)和其他相关问题。MIP问题是一种LP问题,其中某些变量需要额外满足整数条件。
之前在 https://blog.csdn.net/fengbingchun/article/details/146341096 中介绍过通过Pyomo调用glpk解决饮食问题,这里通过调用GLPK API接口实现,测试代码如下:
int test_glpk()
{constexpr int total_foods{ 9 };const std::vector<std::string> foods{ "food1", "food2", "food3", "food4", "food5", "food6", "food7", "food8", "food9" };const std::vector<float> unit_prices{ 0.886, 0.863, 0.855, 0.917, 0.237, 0.856, 0.833, 0.904, 0.876 };const std::vector<std::array<float, 2>> bounds{ {1.0, 55.0}, {1.0, 55.0}, {1.0, 55.0}, {1.0, 55.0}, {7.0, 9.0}, {1.0, 55.0}, {1.0, 55.0}, {1.0, 55.0}, {1.0, 55.0} };constexpr int num_nutrients{ 4 };const std::vector<std::string> nutrients{ "nutrient1", "nutrient2", "nutrient3", "nutrient4" };const std::vector<std::array<float, 4>> nutrient_values{ {0.21, 65.10, 0.72, 88.5}, {0.08, 64.58, 0.63, 76.9}, {0.22, 64.81, 0.53, 86.1}, {0.58, 65.84, 1.09, 57.8}, {0.033, 46.07, 14.15, 0},{0.059, 65.25, 0.39, 87.2}, {0.14, 64.25, 0.57, 93.7}, {0.033, 63.06, 1.36, 79.0}, {0.076, 65.20, 0.59, 99.0} };const std::vector<std::array<float, 2>> nutrient_limit{ {0., 49.}, {6200., 6230.}, {9.9, 782.}, {6500., 7000.} };constexpr float total_quantity{ 99. };const std::string mandatory_food{ "food5" };constexpr int num_select_foods{ 5 };if (foods.size() != total_foods) {std::cerr << "Error: number of foods mismatch" << std::endl;return -1;}if (unit_prices.size() != total_foods) {std::cerr << "Error: number of unit_prices mismatch" << std::endl;return -1;}if (bounds.size() != total_foods) {std::cerr << "Error: number of bounds mismatch" << std::endl;return -1;}if (nutrient_values.size() != total_foods) {std::cerr << "Error: number of nutrient_values mismatch" << std::endl;return -1;}if (nutrients.size() != num_nutrients) {std::cerr << "Error: number of nutrients mismatch" << std::endl;return -1;}if (nutrient_limit.size() != num_nutrients) {std::cerr << "Error: number of nutrient_limit mismatch" << std::endl;return -1;}int mandatroy_food_index{ 0 };for (auto i = 0; i < total_foods; ++i) {if (mandatory_food == foods[i]) {mandatroy_food_index = i;break;}}auto lp = glp_create_prob(); // create problem objectglp_set_prob_name(lp, "diet problem");glp_set_obj_dir(lp, GLP_MIN); // minimize objective function// add col variablesglp_add_cols(lp, 2 * total_foods); // first total_foods: number of each food; last total_foods: binary variables, whether the food is selectedfor (auto j = 0; j < total_foods; ++j) {// set food number variableglp_set_col_name(lp, j + 1, foods[j].c_str());glp_set_col_kind(lp, j + 1, GLP_CV); // GLP_IV: number of foods can only be an integer, use MIP; default is GLP_CVglp_set_col_bnds(lp, j + 1, GLP_LO, 0.0, 0.0);glp_set_obj_coef(lp, j + 1, unit_prices[j]); // set cost coefficient// set binary select variablesstd::string name = "S_" + foods[j];glp_set_col_name(lp, total_foods + j + 1, name.c_str());glp_set_col_kind(lp, total_foods + j + 1, GLP_BV);glp_set_obj_coef(lp, total_foods + j + 1, 0.);}// add row constraintsglp_add_rows(lp, num_nutrients);for (auto i = 0; i < num_nutrients; ++i) {glp_set_row_name(lp, i + 1, nutrients[i].c_str());glp_set_row_bnds(lp, i + 1, GLP_DB, nutrient_limit[i][0], nutrient_limit[i][1]);}// add select constraintsglp_add_rows(lp, 2);glp_set_row_name(lp, num_nutrients + 1, "select_total");glp_set_row_bnds(lp, num_nutrients + 1, GLP_FX, num_select_foods, num_select_foods);// add mandatory food constraintglp_set_row_name(lp, num_nutrients + 2, "must_have_food");glp_set_row_bnds(lp, num_nutrients + 2, GLP_FX, 1., 1.);// add total_quantity constraintglp_add_rows(lp, 1);glp_set_row_name(lp, num_nutrients + 3, "total_quantity");glp_set_row_bnds(lp, num_nutrients + 3, GLP_FX, total_quantity, total_quantity);// constraint matrix:// glp_load_matrix(lp, ne, ia, ja, ar): for k = 1,..., ne, where ia[k] is the row index, ja[k] is the column index, and ar[k] is a numeric value of corresponding constraint coefficient// parameter ne specifies the total number of (non-zero) elements in the matrix to be loadedint ia[1 + 1000]{}, ja[1 + 1000]{}, k{ 0 };double ar[1 + 1000]{};// nutrients constraintfor (auto i = 0; i < num_nutrients; ++i) {for (auto j = 0; j < total_foods; ++j) {k++;ia[k] = i + 1, ja[k] = j + 1;ar[k] = nutrient_values[j][i];}}// select total constraintfor (auto j = 0; j < total_foods; ++j) {k++;ia[k] = num_nutrients + 1, ja[k] = total_foods + j + 1;ar[k] = 1.;}// mandatory food constraintk++;ia[k] = num_nutrients + 2, ja[k] = total_foods + mandatroy_food_index + 1;ar[k] = 1.;// total_quantity constraintfor (auto j = 0; j < total_foods; ++j) {k++;ia[k] = num_nutrients + 3, ja[k] = j + 1;ar[k] = 1.;}// add relationship constraint between food quantity and select variablefor (auto j = 0; j < total_foods; ++j) {// lower constraint: quantity_j >= min_j * select_jglp_add_rows(lp, 1);glp_set_row_name(lp, num_nutrients + 4 + 2 * j, "quantity_min");glp_set_row_bnds(lp, num_nutrients + 4 + 2 * j, GLP_LO, 0., 0.);// quantity_j coefficient: 1.0k++;ia[k] = num_nutrients + 4 + 2 * j, ja[k] = j + 1;ar[k] = 1.;// select_j cofficient: -min_jk++;ia[k] = num_nutrients + 4 + 2 * j, ja[k] = total_foods + j + 1;ar[k] = -bounds[j][0];// upper constraint: quantity_j <= max_j * select_jglp_add_rows(lp, 1);glp_set_row_name(lp, num_nutrients + 4 + 2 * j + 1, "quantity_max");glp_set_row_bnds(lp, num_nutrients + 4 + 2 * j + 1, GLP_UP, 0., 0.);k++;ia[k] = num_nutrients + 4 + 2 * j + 1, ja[k] = j + 1;ar[k] = 1.;k++;ia[k] = num_nutrients + 4 + 2 * j + 1, ja[k] = total_foods + j + 1;ar[k] = -bounds[j][1];}glp_load_matrix(lp, k, ia, ja, ar);// verify constraint matrix and variablesstd::cout << "number of constraints: " << glp_get_num_rows(lp) << std::endl;for (auto i = 1; i <= glp_get_num_rows(lp); ++i)std::cout << "i: " << i << "; type: " << glp_get_row_type(lp, i) << "; lower: " << glp_get_row_lb(lp, i) << "; upper: " << glp_get_row_ub(lp, i) << std::endl;std::cout << "number of variables: " << glp_get_num_cols(lp) << std::endl;for (auto j = 1; j <= glp_get_num_cols(lp); ++j) // Note: the value of glp_get_col_prim is different in different positionsstd::cout << "j: " << j << "; kind: " << glp_get_col_kind(lp, j) << "; primal value: " << glp_get_col_prim(lp, j) << "; lower: " << glp_get_col_lb(lp, j) << "; upper: " << glp_get_col_ub(lp, j) << "; coef: " << glp_get_obj_coef(lp, j) << std::endl;auto ret = glp_write_lp(lp, nullptr, "../../../testdata/model.lp");if (ret != 0) {std::cerr << "Error: failed to write problem data, error code: " << ret << std::endl;glp_delete_prob(lp);return -1;}double quantity_sum{ 0. };if (0) { // LP(Linear Programming)glp_smcp parm{};glp_init_smcp(&parm);parm.msg_lev = GLP_MSG_ERR; // warning and error messages onlyparm.presolve = GLP_ON;ret = glp_simplex(lp, &parm); // solve LP problem with the primal or dual simplex methodif (ret != 0) {std::cerr << "Error: failed to solve: error code: " << ret << std::endl;glp_delete_prob(lp);return -1;}ret = glp_get_status(lp);if (ret != GLP_OPT) {std::cerr << "Error: there is no optimal solution, status: " << ret << std::endl;glp_delete_prob(lp);return -1;}std::cout << "minimum cost: " << glp_get_obj_val(lp) << std::endl;for (auto j = 0; j < total_foods; ++j) {auto qty = glp_get_col_prim(lp, j + 1);auto selected = glp_get_col_prim(lp, total_foods + j + 1);if (selected > 0.5) {std::cout << foods[j] << ": quantity: " << qty << ", limit: [" << bounds[j][0] << "," << bounds[j][1] << "]" << std::endl;quantity_sum += qty;}}}else { // MIP(Mixed Integer linear Programming)glp_iocp parm;glp_init_iocp(&parm);parm.presolve = GLP_ON;parm.msg_lev = GLP_MSG_ERR; // close information output promptret = glp_intopt(lp, &parm);if (ret != 0) {std::cerr << "Error: failed to solve: error code: " << ret << std::endl;glp_delete_prob(lp);return -1;}ret = glp_mip_status(lp);if (ret != GLP_OPT) {std::cerr << "Error: there is no optimal solution, status: " << ret << std::endl;glp_delete_prob(lp);return -1;}std::cout << "minimum cost: " << glp_mip_obj_val(lp) << std::endl;for (auto j = 0; j < total_foods; ++j) {auto qty = glp_mip_col_val(lp, j + 1);auto selected = glp_mip_col_val(lp, total_foods + j + 1);if (selected > 0.5) {std::cout << foods[j] << ": quantity: " << qty << ", limit: [" << bounds[j][0] << "," << bounds[j][1] << "]" << std::endl;quantity_sum += qty;}}}std::cout << "result quantity sum: " << quantity_sum << "; require quantity sum: " << total_quantity << std::endl;glp_delete_prob(lp);return 0;
}
测试数据说明:饮食问题,目标是选择以最低成本满足每日营养需求的食物,测试数据无实际意义
total_foods:食物种类总数。
foods:每种食物的名称。
unit_prices:每种食物的价格。
bounds:每种食物可取的食物份数限制,变量的界限。
num_nutrients:每种食物含有的营养成分个数,每种食物含有相同的营养成分个数。
nutrients:每种食物含有的营养成分名称。
nutrient_values:每种食物含有的营养成分含量。
nutrient_limit:每种营养成分消耗总量约束。
total_quantity:被选中食物总份数约束。
mandatory_food:被选中食物中必选要包含的食物约束。
num_select_foods:被选中食物种类数约束。
使用到的GLPK函数:接口详细描述参考源码中的doc/glpk.pdf
glp_create_prob:创建一个新的问题对象(problem object),该对象最初是"empty",即没有行和列。该函数返回指向所创建对象的指针,该指针应在对该对象的任何后续操作中使用。
glp_delete_prob:删除问题对象,释放分配给该对象的所有内存。
glp_set_prob_name:给问题对象分配问题名,长度要求1至255个字符,如果参数名称为nullptr或空字符串,则将删除问题对象的现有问题名。
glp_set_obj_dir:设置(更改)目标函数优化方向标志,GLP_MIN表示最小化目标函数;GLP_MAX表示最大化目标函数。默认情况,最小化目标函数。
glp_add_cols:将新列添加到问题对象。新列始终添加到列表的末尾,因此现有列的序数不会改变。每个新添加的列初始值固定为零,并且约束系数列表为空。
glp_set_col_name:分配(更改)第j列列名,长度要求1至255个字符,如果参数名称为nullptr或空字符串,则将删除第j列的现有名称。
glp_set_col_kind:按照参数类型指定的方式设置(更改)第j列的类型(kind)。GLP_CV表示连续变量;GLP_IV表示整数变量;GLP_BV表示二元变量。
glp_get_col_kind:返回第j列的类型(kind)。
glp_set_col_bnds(lp,j,type,lb,ub):设置(更改)第j列类型和界限。支持的类型如下图所示:如果列没有下限(lower bound),则忽略参数lb。如果列没有上限(upper bound),则忽略参数ub。如果列是固定(fixed)类型,则仅使用参数lb,而忽略参数ub。添加到问题对象后,每列的初始值都固定为零,即其类型为GLP_FX,且两个界限均为0。
glp_get_num_cols:返回指定问题对象中的列数。
glp_set_obj_coef(lp,j,coef):设置(更改)第j列目标系数(objective coefficient)。新的目标系数值由参数coef指定。
glp_get_obj_coef:返回第j列的目标系数。
glp_get_col_prim:返回与第j列关联变量的原始值(primal value)。注:此函数在调用glp_simplex前后得到值不同
glp_get_col_lb:返回第j列的下限,即相应变量的下限。如果该列没有下限,则返回-DBL_MAX。
glp_get_col_ub:返回第j列的上限,即相应变量的上限。如果该列没有上限,则返回+DBL_MAX。
glp_add_rows:将新行添加到问题对象。新行始终添加到行列表的末尾,因此现有行的序号不会改变。添加的每个新行最初都是free(unbounded),并且约束系数列表为空。
glp_set_row_name:分配(更改)第i行行名,长度要求1至255个字符,如果参数名称为nullptr或空字符串,则将删除第i行的现有名称。
glp_set_row_bnds(lp,i,type,lb,ub):设置(更改)第i行类型和界限。支持的类型与glp_set_col_bnds相同。如果行没有下限(lower bound),则忽略参数lb。如果行没有上限(upper bound),则忽略参数ub。如果行是固定(fixed)类型,则仅使用参数lb,而忽略参数ub。添加到问题对象中的每一行最初都是free,即其类型为GLP_FR。
glp_get_num_rows:返回指定问题对象中的行数。
glp_get_row_type:返回第i行的类型,支持的类型与glp_set_col_bnds相同。
glp_get_row_lb:返回第i行的下限,如果该行没有下限,则返回-DBL_MAX。
glp_get_row_ub:返回第i行的上限,如果该行没有上限,则返回+DBL_MAX。
glp_load_matrix(lp,ne,ia,ja,ar):加载(替换)整个约束矩阵(constraint matrix),将传入数组ia,ja和ar的约束矩阵加载到指定的问题对象中。加载前,约束矩阵的当前内容将被销毁。
约束系数(约束矩阵的元素)应指定为三元组(triplets)(ia[k], ja[k], ar[k]),其中k=1, ..., ne,其中ia[k]是行索引,ja[k]是列索引,ar[k]是相应约束系数(constraint coefficient)的数值。参数ne指定要加载的矩阵中(非零)元素的总数。不允许使用索引相同的系数(同一行和列的索引组合只能出现一次)。允许使用零系数,但是,它们不会存储在约束矩阵中。如果参数ne为0,则参数ia、ja和/或ar可以指定为nullptr。
glp_write_lp:将LP/MIP问题数据以CPLEX LP格式写入文本文件。可用于检查约束是否正确。
glp_init_smcp:使用默认值初始化simplex求解器(solver)使用的控制参数。
glp_simplex:使用simplex方法求解线性规划问题,并将计算结果存储回问题对象。
glp_get_status:报告指定问题对象当前基本解的通用状态,返回可能的状态如下图所示:
glp_get_obj_val:返回目标函数的当前值。求目标函数的最小值或最大值,由glp_set_obj_dir指定。
glp_init_iocp:使用默认值初始化branch-and-cut求解器使用的控制参数。
glp_intopt:使用branch-and-cut方法求解混合整数线性规划问题。
glp_mip_status:报告MIP求解器找到的MIP解决方案的状态,返回可能的状态如下图所示:
glp_mip_obj_val:返回MIP解决方案的目标函数值。求目标函数的最小值或最大值,由glp_set_obj_dir指定。
glp_mip_col_val:返回与MIP解决方案的第j列关联变量的值。
使用到的MIP接口包括:glp_set_col_kind/glp_get_col_kind、glp_init_iocp、glp_intopt、glp_mip_status、glp_mip_obj_val、glp_mip_col_val。
按照以上给的测试数据,共需18个变量(cols);共需25个约束(rows)。执行结果如下图所示:
注:在GLPK中,C API要求矩阵元素从索引1开始,row[i]对应第i个约束条件,col[j]对应第j个决策变量。通过约束矩阵即ia(行)、ja(列)、ar(系数)关联二者。
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:
GLPK(GNU线性规划工具包)介绍
GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包),可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库,最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载,仅包含源码,最新版本为5.0。 GLPK是…...
技嘉主板BIOS升级
截图可能不同的BIOS长的不一样,但大概相同,BIOS不下错,逐个版本升级就没问题 准备工作 准备工作一个fat32格式的U盘,用来存放BIOS确认主板型号 和当前BIOS版本 方式1:去系统信息里面 方式2: 去BIOS设置…...
自定义类型:结构体进阶
一、结构体类型的声明 前⾯我们在学习操作符和初阶结构体的时候,已经学习了结构体的知识,这⾥稍微复习⼀下。 1.1结构体的回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag…...
linux perf top分析系统性能
1,看到内核宏是否支持perf功能 perf top -g 查看linux 内核宏定义 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 确保帧指针支持以捕获完整堆栈 2,使用perf top -g 报错 Access to performance monitoring and observability operations is l…...
串口屏调试 1.0
http://wiki.tjc1688.com 先把商家的链接贴过来 淘晶驰T1系列3.2寸串口屏tft液晶屏显示屏HMI触摸屏超12864液晶屏 这是主包的型号 打开这个玩意 有十个基本的功能区 新建工程 在界面的右边,指令一定要写在page前面,这里的波特率等等什么的都可以…...
Python面向对象编程:初识类与对象
面向对象编程(OOP)是Python编程中最重要的范式之一。本文将从零开始介绍Python中类和对象的基本概念,帮助初学者快速掌握面向对象编程的核心思想。 一、什么是面向对象编程? 面向对象编程(Object-Oriented Programming)是一种以"对象"为核心…...
局域网常用的测速工具,Iperf3使用教程
目录 下载方式 Windows Linux 使用方法:测试局域网带宽 步骤一:服务端准备 步骤二:客户端发起连接 步骤三:查看结果 参数说明 1. Iperf常用参数(测试够用) 2. 通用参数(Server端和Cli…...
[架构之美]linux常见故障问题解决方案(十九)
[架构之美]linux下常见故障问题解决方案 一,文本文件忙 问题一:rootwh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/ cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙 在Linux系统中遇到“文本文件忙”错误时…...
Java与Go语言对比教程
Java vs. Go:程序员的双节棍与瑞士军刀之战 🎯 先看一张灵魂对比图 🤖 Java老大哥 🚀 Go小钢炮 出生年份 1995(中年稳健) 2009(年轻活力&…...
计算机大类专业数据结构下半期实验练习题
1068: 图的按录入顺序深度优先搜索 #include"iostream" using namespace std; #include"cstring" int visited[100]; char s[100]; int a[100][100]; int n; void dfs(int k,int n) {if(visited[k]0){visited[k]1;cout<<s[k];for(int i0;i<n;i){i…...
Android 关闭Activity切换过渡动画
Android 9.0以前关闭过渡动画效果只需要把开发者模式中过渡动画缩放设为0就可以。也就是把def_window_transition_scale改为0% frameworks/base/packages/SettingsProvider/res/values/defaults.xml <fraction name"def_window_transition_scale">100%<…...
iperf3的介绍与舒勇
在 CentOS 7 中使用 iperf3 进行网络性能测试,分为客户端和服务器两部分。以下是使用步骤: 1. 安装 iperf3 首先,你需要在 CentOS 7 上安装 iperf3。可以通过以下命令进行安装: sudo yum install epel-release sudo yum install…...
Python 包管理新选择:uv
在 Python 中,uv 是由 Astral 公司开发的 Rust 高性能包管理工具,旨在替代传统 pip 并提供更快的依赖管理、Python 版本控制等功能。 https://github.com/astral-sh/uv 在 github 上已有 53k star 一、uv 的核心优势 极速性能:比 pip 快 10-100 倍。多版本 Python 管理:支…...
从需求到用例的AI路径:准确率与挑战
用工作流生成测试用例和自动化测试脚本! 引言:用例的黄金起点 在软件工程中,“测试用例”是连接需求理解与质量保障之间的关键桥梁。一份高质量的测试用例,不仅是验证功能实现是否符合需求的工具,更是产品风险感知、用…...
JavaSE核心知识点02面向对象编程02-06(泛型)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点02面向对象编程02-06&#…...
xml与注解的区别
功能xml配置注解定义bean bean标签 id属性 class属性 Component Controller Service Repository ComponentScan 设置依赖注入 setter注入(set方法) 构造器注入(构造方法) Autowired Qualifier Value 配置第三方bean bean标签 静…...
进阶 DFS 学习笔记
字数:12017字。 文章盗的图注明了出处,全部出自 y 总的算法提高课。 不知道为啥这个时候才开始学这个东西,好像是很多同龄人都已经学完了。 进阶 DFS 具体来说好几个东西,所以可能内容有一些些多。 默认 DFS 和 BFS 已经掌握了…...
计算机设计大赛山东省赛区软件开发赛道线上答辩复盘
流程回顾: 1.抽签顺序: 抽签顺序并不一定代表是最终顺序,要注意看通知不要遗漏。 2.答辩形式: 线上答辩,加入腾讯会议,进会议时自己的备注是作品编号,等轮到自己组答辩时主持人会把人拉进来…...
第7次课 栈A
课堂学习 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等&…...
TXT编码转换工具iconv
iconv.exe是实现TXT编码转换的命令行工具,支持几百种编码格式的转换,利用它可以在自主开发程序上实现TXT文档编码的自动转换。 一、命令参数格式 Usage: iconv [-c] [-s] [-f fromcode] [-t tocode] [file ...] or: iconv -l 二、转换的示例 将UTF-8…...
基于Spring Boot + Vue的高校心理教育辅导系统
一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…...
关于甲骨文(oracle cloud)丢失MFA的解决方案
前两年,申请了一个招商的多币种信用卡,然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间,人家要启用MFA验证。 啥叫MFA验证,类似与短信验证吧,就是绑定一个手机,然后下载一个app,每…...
Linux系统管理与编程17:自动化部署ftp服务
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 #virtual用户管理:passerbyA、captain和admin三个虚拟用户 # passerbyA只能看,captain可看读写上传,但不能删除。admin全部权限 [rootshell shell]…...
C++STL——stack,queue
stack与queue 前言容器适配器deque 前言 本篇主要讲解stack与queue的底层,但并不会进行实现,stack的接口 queue的接口 ,关于stack与queue的接口在这里不做讲解,因为通过前面的对STL的学习,这些接口都是大同小异的。 …...
HC-SR04超声波测距传感器
1.基本信息 供电电压5v,测量范围2cm~400cm,测量精度正负3mm,超声波频率40khz 2.连接引脚: 3.工作原理 TRIG引脚发送至少10us的高电平信号,ECHO引脚负责接受信号; 接受方式:计算测量高电平持续的时间,从一…...
内存安全暗战:从 CVE-2025-21298 看 C 语言防御体系的范式革命
引言 2025 年 3 月,美国 CERT 发布的《年度漏洞报告》揭示了触目惊心的数据:C/C 相关漏洞占全年高危漏洞的 68%,其中内存安全问题贡献了 92% 的远程代码执行风险。当 CVE-2025-21298 漏洞在某工业控制软件中被利用,导致欧洲某核电…...
Linux笔记---System V共享内存
1. System V共享内存简介 System V共享内存是一种在Linux系统中用于进程间通信的机制。顾名思义,就是申请一段可供多个进程共享的内存,以用于进程间通信,相对于管道机制要更加直接。 1.1 原理 System V共享内存通过创建和使用一个特定的IP…...
MySQL 1366 - Incorrect string value:错误
MySQL 1366 - Incorrect string value:错误 错误如何发生发生原因: 解决方法第一种尝试第二种尝试 错误 如何发生 在给MySQL添加数据的时候发生了下面的错误 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…...
慈缘基金会“蝴蝶飞”助西藏女孩白玛卓嘎“折翼重生”
历经六个月、178天的艰难治疗,来自西藏拉萨的15岁女孩白玛卓嘎,终于在4月底挺直脊梁,带着自信的笑容踏上了回家的路。这场跨越雪域高原与首都北京的“生命蜕变之旅”,不仅改写了这位藏族少女的人生轨迹,更见证了公益力…...
【生存技能】ubuntu 24.04 如何pip install
目录 原因解决方案说明 在接手一个新项目需要安装python库时弹出了以下提示: 原因 这个报错是因为在ubuntu中尝试直接使用 pip 安装 Python 包到系统环境中,ubuntu 系统 出于稳定性考虑禁止了这种操作 这里的kali是因为这台机器的用户起名叫kali,我也不知道为什么…...
TDengine 在智能制造中的核心价值
简介 智能制造与数据库技术的深度融合,已成为现代工业技术进步的一个重要里程碑。随着信息技术的飞速发展,智能制造已经成为推动工业转型升级的关键动力。在这一进程中,数据库技术扮演着不可或缺的角色,它不仅承载着海量的生产数…...
代码随想录第41天:图论2(岛屿系列)
一、岛屿数量(Kamacoder 99) 深度优先搜索: # 定义四个方向:右、下、左、上,用于 DFS 中四向遍历 direction [[0, 1], [1, 0], [0, -1], [-1, 0]]def dfs(grid, visited, x, y):"""对一块陆地进行深度…...
C语言复习--柔性数组
柔性数组是C99中提出的一个概念.结构体中的最后⼀个元素允许是未知大小的数组,这就叫做柔性数组成员。 格式大概如下 struct S { int a; char b; int arr[];//柔性数组 }; 也可以写成 struct S { int a; char b; int arr[0];//柔性数组 }; …...
《Python星球日记》 第55天:迁移学习与预训练模型
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、迁移学习基础1. 什么是迁移学习?2. 迁移学习的优势3. 迁移学习的…...
Python项目75:PyInstaller+Tkinter+subprocess打包工具1.0(安排 !!)
这个打包工具包含以下功能: 1.主要功能:选择Python脚本文件,设置打包选项(单文件打包、无控制台窗口),自定义程序图标,指定输出目录,实时显示打包日志。 2.自适应布局改进ÿ…...
互联网大厂Java面试实录:从基础到微服务的深度考察
互联网大厂Java面试实录:从基础到微服务的深度考察 面试场景 面试官:风清扬(严肃且技术深厚) 求职者:令狐冲(技术扎实但偶尔含糊) 第一轮:Java基础与框架 风清扬:令狐…...
学习黑客5 分钟深入浅出理解Linux进程管理
5 分钟深入浅出理解Linux进程管理 🖥️ 大家好!今天我们将探索Linux系统中的进程管理——这是理解系统运行机制和进行安全分析的基础知识。在TryHackMe平台上进行网络安全学习时,了解进程如何工作以及如何监控和控制它们,对于识别…...
Kubernetes应用发布方式完整流程指南
Kubernetes(K8s)作为容器编排领域的核心工具,其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例,详细讲解从配置编写到高级发布的完整流程,帮助开发者掌握Kubernetes应用部署的核心步…...
JVM——即时编译器的中间表达形式
中间表达形式(IR):编译器的核心抽象层 1. IR的本质与作用 在编译原理的体系中,中间表达形式(Intermediate Representation, IR)是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR,而后…...
Js 判断浏览器cookie 是否启用
验证时 google浏览器 135.0.7049.117 不生效 cookie.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>Cookie 检测</title> </head> <body><h1>检测是否启用 Cookie<…...
数字相机的快门结构
数字相机(DC/DSLR等)的快门结构和传统相机有所不同,除了机械快门以外,还存在电子快门,实际上是二者的混合体。我写这篇文章大概介绍一下数字相机的快门结构,希望能抛砖引玉。 要讨论数字相机的快门结构,首先先要了解一下数字相机的结构分类,根据成像原理不同,数字相机大…...
LeetCode --- 448 周赛
题目列表 3536. 两个数字的最大乘积 3537. 填充特殊网格 3538. 合并得到最小旅行时间 3539. 魔法序列的数组乘积之和 一、两个数字的最大乘积 由于数据都是正数,所以乘积最大的两个数,本质就是找数组中最大的两个数即可,可以排序后直接找到…...
添加物体.
在cesium中我们可以添加物体进入地图.我们以广州塔为例 //生成广州塔的位置var position2 Cesium.Cartesian3.fromDegrees(113.3191,23.109,100)viewer.camera.setView({//指定相机位置destination: position2, 运行后如图 我们使用cesium官网提供的代码为广州塔在地图上标点…...
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例
ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例 在现代工业自动化系统中,设备之间的互联互通至关重要。Profibus DP和Modbus TCP是两种常见的通信协议,分别应用于不同的场景。为了实现这两种协议的相互转换,Profibus …...
Yocto中`${S}`和`${WORKDIR}`的联系与区别
在Yocto项目中,${S}和${WORKDIR}是构建过程中两个核心路径变量,它们的关系及用途如下: 定义与层级关系${WORKDIR}(工作目录) 是Recipe所有任务执行的基础目录,路径结构为: build/tmp/work/<arch>/<recipe-name>/<version>/。 该目录包含源码解压后的所…...
CDGP历次主观题真题回忆
(一)【论述】 1如何设计企业的数据安全体系?活动+方法+DSMM 2如何管理公司混乱的数据质量?活动+遵循原则+建立质量维度+质量改进生命周期+高阶指标。...
Java学习手册:Spring Cloud 组件详解
一、服务发现组件 - Eureka 核心概念 :Eureka 是一个服务发现组件,包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册中心,负责维护服务实例的注册信息;Eureka Client 则是集成在应用中的客户端࿰…...
【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通
使用 LLaMA-Factory 进行模型微调:从入门到精通 一、环境搭建:奠定微调基础(一)安装依赖工具(二)创建 conda 环境(三)克隆仓库并安装依赖 二、数据准备:微调的基石&#…...
sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离
前言 sensitive-word-admin 最初的定位是让大家知道如何使用 sensitive-word,所以开始想做个简单的例子。 不过秉持着把一个工具做好的原则,也收到很多小伙伴的建议。 v2.0.0 在 ruoyi-vue(也非常感谢若依作者多年来的无私奉献)…...
HTML属性
HTML(HyperText Markup Language)是网页开发的基石,而属性(Attribute)则是HTML元素的重要组成部分。它们为标签提供附加信息,控制元素的行为、样式或功能。本文将从基础到进阶,全面解析HTML属性…...