智能解决装箱问题:使用优化算法实现高效包装

news2024/10/6 16:23:31

组合优化问题

组合优化(Combinatorial Optimization,CO)数学优化研究的一个分支。主要关注的是从有限的对象集合中寻找最优解的问题。这个词的由来主要是由“组合”和“优化”两部分构成。“组合”指的是从有限的对象集合中选择一部分的过程,而“优化”则指的是在满足一定条件下,使得某个目标函数达到最大或最小。即:组合优化问题的解集合有限个的,要做的事情是在有限的集合里面找到目标最优的集合。
组合优化问题在许多实际情况中都有出现,包括经济管理、工业制造、交通运输等领域。比如:

  • 0-1 背包问题:如何把体积有限、价值有限,装入容积有限的背包里,获得最大价值的装包?
  • 装箱问题,bin packing,如何装箱使得所用的箱子最少?
  • TSP的旅行商问题:如何选择一条道路遍历每个城市,路径最短?
  • 车间调度问题:车间的加工顺序如何安排完工时间最小?
  • 地图块着色问题:如何采用少量的颜色给地图块着色,两两相邻颜色不一样?

组合优化问题特征:

  • 解可数的,可行域是有限的
  • 最优解一定存在
  • 可行方案非常多,无法用枚举的方案,NP-hard的问题

解组合优化的方式有:

  • 数学规划的方法,利用数学规划求解器,寻找精确最优解。缺点:耗时。
  • 启发式算法:近似方法、贪婪算法、基于规则等。解的质量有基础保证,但是耗时不确定。
  • 元启发式算法:遗传算法、蚁群算法、禁忌搜索、模拟退火等。不同的问题需要调参数,解的质量不可靠。
  • 机器学习算法:监督学习、强化学习、图神经网络。此方法还在探索的算法领域,对于同分布的数据,机器学习后能进行快速的求解。

本文将以一个简化的装箱问题为例,来讲解采用数学规划的方法来解决装箱这个组合优化问题。

什么是装箱问题?

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

在数学领域,装箱问题通常被建模为整数规划问题。它的变体众多,包括一维装箱问题、二维装箱问题、多维装箱问题等,以及它们各自的约束条件,如容器容量、物品形状、摆放方向限制等。

装箱问题可以用在什么场景?

在这里插入图片描述

装箱问题广泛应用于各种实际场景,几个典型的应用示例包括:

  1. 物流与配送: 确定最小数量的货车来运输一定量的货物,同时考虑每辆货车的载重限制、体积限制以及货物的装载平衡。
  2. 仓库存储: 如何利用有限的仓储空间存储尽可能多的库存货物,或如何将货物高效地摆放到货架上,以便节省空间并方便存取。
  3. 生产包装: 在产品的包装过程中,决定最少的包装盒数量来装载不同大小的产品,或者在确保产品安全的前提下,使得各个包装盒中的空隙最小化。
  4. 计算资源分配: 在计算机科学领域,将不同的任务分配给有限数量的处理器或内存资源,以求最大化资源的使用效率。
  5. 切割优化和材料利用: 在制造业中,比如钢材、木材、玻璃等材料的切割,如何从原材料中切割出所需部件,以减少材料浪费。
  6. 行李装载: 确定如何在飞机的货舱内或个人行李箱中高效地安置行李和货物,以保证安全、均衡且有效地利用空间。
  7. 云计算资源优化: 决定如何在云计算环境中分配虚拟机到物理服务器上,以最小化服务器的数量和能耗。

装箱问题

假设我们有一批货物要运输走,这批货物包装盒的比较整齐,侧面面尺寸一样,仅厚度不同、重量不同。运输货车里可以放两列,如上图示意。
货车的总承重是10吨。为了行驶平稳,希望左右摆的货物质量差异不超过500公斤。货车可装货物的总长度(厚度)是5米。
要装的货物的信息如此表格文件所示: data/items-1010.csv
部分数据如下:


序号包装和厚(cm)重量(kg)
1101505
261305
3126630
………………
10085765
………………
20060600
………………
101080640

当数据维度太高的时候,采用数学规划方式计算会很慢。
我们可以拆解问题,比如分块去算某100个货物的装载方案,切割前100条数据为 data/items-100.csv 。更多分块数据方案用户可以进data文件夹自己修改。

装箱问题的数学规划建模

下面我们采用数学规划的方法来建模这个问题。


首先:定义几何,描述数据,方便后面引用

  • 货物集合 I I I
    • 它的描述信息参数是 厚度 l i l_{i} li 和 重量 w i w_{i} wi
  • 假设有车辆集合 B B B
  • 问题中有左侧和右侧的问题,定义集合 s = l e f t , r i g h t s = { left, right } s=left,right
  • 关于左右侧的差异在500kg以内,在表达式上,会需要一个绝对值,属于非线性。变更成线性更简单。这里我们假设所有的火车上都是左边的重,右边的轻。则左边重量上限 W l e f t m a x = 5250 W_{leftmax} = 5250 Wleftmax=5250 kg ,右边重量上限 W r i g h t m a x = 4750 W_{rightmax} = 4750 Wrightmax=4750 kg。左边比右边重的差异上限是 W l e g t r i g h t = 500 W_{legt_right} = 500 Wlegtright=500 kg
  • 两边的装货厚度要求是参数 L m a x = 500 L_{max} = 500 Lmax=500 cm

然后,设置变量来表达要解决的问题。

  • 货物如何摆放,设置 0-1 变量 x i , b , s x_{i,b,s} xi,b,s,其中 i ∈ I i \in I iI, b ∈ B b \in B bB, s ∈ S s \in S sS。 当变量取值为1的时候,则代表货物摆放在该位置,为0的时候则不放置。

由此,我们可以用来表达装货的约束。

  • 每个货物只能放一个位置,且至少是一个位置: ∑ b ∈ B , s ∈ S x i , b , s = 1 , ∀ i ∈ I \sum_{b \in B, s \in S} x_{i,b,s} = 1, \forall i \in I bB,sSxi,b,s=1,iI
  • 每个货车上,装载的货物重量限制:
    • 左边限制: ∑ i ∈ I x i , b , l e f t ⋅ W i ≤ W l e f t m a x , ∀ b ∈ B \sum_{i \in I} x_{i,b,left} \cdot W_{i} \leq W_{leftmax} , \forall b \in B iIxi,b,leftWiWleftmax,bB
    • 右边限制: ∑ i ∈ I x i , b , r i g h t ⋅ W i ≤ W r i g h t m a x , ∀ b ∈ B \sum_{i \in I} x_{i,b,right} \cdot W_{i} \leq W_{rightmax} , \forall b \in B iIxi,b,rightWiWrightmax,bB
    • 左右差异限制: 0 ≤ ( ∑ i ∈ I x i , b , l e f t ⋅ W i ) − ( ∑ i ∈ I x i , b , r i g h t ⋅ W i ) ≤ W l e g t r i g h t , ∀ b ∈ B 0 \leq (\sum_{i \in I} x_{i,b,left} \cdot W_{i}) - (\sum_{i \in I} x_{i,b,right} \cdot W_{i}) \leq W_{legt_right} , \forall b \in B 0(iIxi,b,leftWi)(iIxi,b,rightWi)Wlegtright,bB
  • 每辆货车的每一边的装货长度不超过5米
    ∑ b ∈ B x i , b , s ⋅ L i ≤ L m a x , ∀ b ∈ B , s ∈ S \sum_{b \in B} x_{i,b,s} \cdot L_{i} \leq L_{max}, \forall {b \in B, s \in S} bBxi,b,sLiLmax,bB,sS

此外,我们需要设置目标,用的车辆数最少。

我们可以设置新的变量,增加约束来表述和上面的装载方案 x i , b , s x_{i,b,s} xi,b,s的关系。

  • 设置新变量车辆是否有使用 y b ∈ { 0 , 1 } y_{b} \in \{0,1\} yb{0,1}
  • 由此,目标函数表达为: m i n i m i z e ∑ b ∈ B y b minimize \sum_{b \in B} y_{b} minimizebByb
  • 增加约束:
    • 每个车辆上货物的摆放变量加和大于等于车辆被使用。
      • 即如果没有放货物,都是0,等于关系。如果有放1个货物,都是1,等于关系。如果放两个及以上货物,x的加和大于y。
      • 数学公式表达为: ∑ i ∈ I , s ∈ S x i , b , s ≥ y b , ∀ b ∈ B \sum_{ i \in I, s \in S} x_{i,b,s} \geq y_{b}, \forall b \in B iI,sSxi,b,syb,bB
    • 再构造y大于x的限制。有车辆被使用的y大于等于每一个x,即如果车辆被使用,y是1,和这个车有关系的x是1或者0,
      • 数学公式表达为: y b ≥ x i , b , s , ∀ i ∈ I , b ∈ B , s ∈ S y_{b} \geq x_{i,b,s}, \forall i \in I, b \in B, s\in S ybxi,b,s,iI,bB,sS

汇总得到数学公式如下:


min ⁡ ∑ b ∈ B y b s.t. ∑ i ∈ I x i , b , l e f t ⋅ W i ≤ W l e f t m a x , ∀ b ∈ B ∑ i ∈ I x i , b , r i g h t ⋅ W i ≤ W r i g h t m a x , ∀ b ∈ B 0 ≤ ( ∑ i ∈ I x i , b , l e f t ⋅ W i ) − ( ∑ i ∈ I x i , b , r i g h t ⋅ W i ) ≤ W l e g t r i g h t , ∀ b ∈ B ∑ b ∈ B x i , b , s ⋅ L i ≤ L m a x , ∀ b ∈ B , s ∈ S ∑ i ∈ I , s ∈ S x i , b , s ≥ y b , ∀ b ∈ B y b ≥ x i , b , s , ∀ i ∈ I , b ∈ B , s ∈ S x i , b , s ∈ { 0 , 1 } y b ∈ { 0 , 1 } \begin{array}{rll} \min & \sum_{b \in B} y_{b} & \\ \text{s.t.} & \sum_{i \in I} x_{i,b,left} \cdot W_{i} \leq W_{leftmax} , & \forall b \in B \\ & \sum_{i \in I} x_{i,b,right} \cdot W_{i} \leq W_{rightmax} , & \forall b \in B \\ & 0 \leq (\sum_{i \in I} x_{i,b,left} \cdot W_{i}) - (\sum_{i \in I} x_{i,b,right} \cdot W_{i}) \leq W_{legt_right} , & \forall b \in B \\ & \sum_{b \in B} x_{i,b,s} \cdot L_{i} \leq L_{max}, & \forall b \in B, s \in S \\ & \sum_{ i \in I, s \in S} x_{i,b,s} \geq y_{b}, & \forall b \in B \\ & y_{b} \geq x_{i,b,s}, & \forall i \in I, b \in B, s\in S \\ & x_{i,b,s} \in\{0,1\} & \\ & y_{b} \in \{0,1\} & \\ \end{array} mins.t.bBybiIxi,b,leftWiWleftmax,iIxi,b,rightWiWrightmax,0(iIxi,b,leftWi)(iIxi,b,rightWi)Wlegtright,bBxi,b,sLiLmax,iI,sSxi,b,syb,ybxi,b,s,xi,b,s{0,1}yb{0,1}bBbBbBbB,sSbBiI,bB,sS


采用建模语言 MindOpt APL 编程和求解

下面的内容包含了code源码,如果您当前在浏览项目内容页,请复制项目后,点击右上角的NoteBook按钮,进入NoteBook环境中查看和运行代码。
In [1]:

clear model;
option modelname binpacking_01; #定义存储文件名

# ----------建模--------Start----
# binpacking_01.mapl



## 导入数据-------
print "导入数据-------";

param fileDir = "data/";
set Items = {read fileDir+"items.csv" as "<1n>" skip 1}; #读取货物序号
print "总共有{}个货物待装载"% card(Items);

param ItemSize[Items] = read fileDir+"items.csv" as "<1n> 2n" skip 1; #读取货物的长度(厚度),单位厘米cm
param ItemWeight[Items]  = read fileDir+"items.csv" as "<1n> 3n" skip 1; #读取货物的重量,单位千克kg
param BinLength = 500; #货车的长度,单位厘米cm
param BinLoadCapacity = 10*1000; #货车的载重,单位kg

param BinLeftRightBalanceDiff = 500; #或者左右两边的重量差异千克
# 因为左右无定数,假设货物都是重的放左边,轻的右边,则左边载重不超过 5250,右边不超过4750.
param BinLoadCapacity_Left  = BinLoadCapacity * 0.5 + 500 * 0.5; 
param BinLoadCapacity_right = BinLoadCapacity * 0.5 - 500 * 0.5; 



# 假设总共有x辆货车
param Bin_Num = 20;
set Bins = {1..Bin_Num};
print "先假设有{}辆货车"%Bin_Num;

## 左右两边
set Sides = {"left","right"};

## 数学建模-------
print  "数学建模--------------";


# 变量----
var x_Item2Bin[Items*Bins*Sides]  >= 0 binary; #货物放在哪个车的哪一边
var x_BinUsed[Bins]  >= 0 binary;; #总共被使用的货车数


# 目标----
# 目标函数:最小化使用货车数量
minimize TotalBins: sum { b in Bins} x_BinUsed[b];

# 货车的总承重是10吨。为了行驶平稳,希望左右摆的货物质量差异不超过500公斤。货车可装货物的总长度(厚度)是5米。 要装的货物的信息如下表格所示:
# 约束----


# 每个货物只能放一个位置,且至少是一个位置
subto constraint_0:
    forall {i in Items}
         sum {b in Bins, s in Sides} x_Item2Bin[i,b,s] == 1;


# 每辆货车总载重上限是10吨 , 左右两边差异有限制500kg
# 假设左边的重,变换上限和差异,定义左边比右边重
subto constraint_1:
    forall {b in Bins}
         sum {i in Items} x_Item2Bin[i,b,"left"] * ItemWeight[i] <= BinLoadCapacity_Left;
subto constraint_1_2:
    forall {b in Bins}
         sum {i in Items} x_Item2Bin[i,b,"right"] * ItemWeight[i] <= BinLoadCapacity_right;
subto constraint_1_3:
    forall {b in Bins}
         0 <= (sum {i in Items} x_Item2Bin[i,b,"left"]* ItemWeight[i]  
         - sum {i in Items} x_Item2Bin[i,b,"right"] * ItemWeight[i]) <= BinLeftRightBalanceDiff;
  


# 每辆货车的每一边的装货长度不超过5米
subto constraint_2:
    forall {b in Bins}
        forall { s in Sides}
            sum { i in Items} x_Item2Bin[i,b,s] * ItemSize[i] <= BinLength;
          
# 车被用了
subto constraint_3:
    forall {b in Bins}
        sum {i in Items, s in Sides} x_Item2Bin[i,b,s] >= x_BinUsed[b];
      
subto constraint_4:
    forall {b in Bins}
        forall { s in Sides}
            forall { i in Items}
                x_BinUsed[b] >=  x_Item2Bin[i,b,s];
      

#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
#option mindopt_options 'max_time=600'; #设置求解器参数
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解

# 结果打印和检查结果
print "----------------结果打印和存文件--------------";
#display; 

print "最小需要货车数 = ",sum { b in Bins} x_BinUsed[b];


print "------每辆车----";
print "|车ID|左边货物数|右边货物数|……|左边厚度|右边厚度|……|左边重量|右边重量|左右重量差异|";
print "|--|--|--|--|--|--|--|--|--|--|";
forall {  in Bins with x_BinUsed[b] >= 0.5}
    print "|{}|{}|{}|……|{}|{}|……|{}|{}|{}|"
         %b,
         sum{i in Items} x_Item2Bin[i,b,"left"],
         sum{i in Items} x_Item2Bin[i,b,"right"], 
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemSize[i],
         sum{i in Items} x_Item2Bin[i,b,"right"]* ItemSize[i],
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemWeight[i],
         sum{i in Items} x_Item2Bin[i,b,"right"]* ItemWeight[i],
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemWeight[i] - sum{i in Items} x_Item2Bin[i,b,"right"]* ItemWeight[i] ;


#打印太长,注释。可以 cmd+/ 来批量注释和解除注释,或者加“and i <=5"来只打印前几行
print "------每个货物----";
print "|货物ID|包装厚度(cm)|重量(kg)|放置车辆|边|";
print "|--|--|--|--|--|";
forall {  in Items*Bins*Sides with x_Item2Bin[i,b,s] >= 0.5 and i <=5} 
    print "|{}|{}|{}|{}|{}|"
        %i,ItemSize[i],ItemWeight[i],b,s;
print "|……|……|……|……|……|";
           
# 存文件
print "车ID,左边货物数,右边货物数,……,左边厚度,右边厚度,……,左边重量,右边重量,左右重量差异" : "车辆装载情况.csv";
close "车辆装载情况.csv";
forall {  in Bins with x_BinUsed[b] >= 0.5}
    print "{},{},{},……,{},{},……,{},{},{}"
         %b,
         sum{i in Items} x_Item2Bin[i,b,"left"],
         sum{i in Items} x_Item2Bin[i,b,"right"], 
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemSize[i],
         sum{i in Items} x_Item2Bin[i,b,"right"]* ItemSize[i],
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemWeight[i],
         sum{i in Items} x_Item2Bin[i,b,"right"]* ItemWeight[i],
         sum{i in Items} x_Item2Bin[i,b,"left"] * ItemWeight[i] - sum{i in Items} x_Item2Bin[i,b,"right"]* ItemWeight[i]
          >> "车辆装载情况.csv";
close "车辆装载情况.csv";


print "货物ID,包装厚度(cm),重量(kg),放置车辆,放置边" : "货物装载方案.csv";
close "货物装载方案.csv";
forall {  in Items*Bins*Sides with x_Item2Bin[i,b,s] >= 0.5}
    print "{},{},{},{},{}"
        %i,ItemSize[i],ItemWeight[i],b,s
        >> "货物装载方案.csv";
close "货物装载方案.csv";

print "结果文件存储在: [车辆装载情况.csv](车辆装载情况.csv) 和 [货物装载方案.csv](货物装载方案.csv)";

运行上述代码,结果如下:

导入数据-------
总共有100个货物待装载
先假设有20辆货车
数学建模--------------
Running mindoptampl
wantsol=1
print=0
MindOpt Version 1.1.0 (Build date: 20240123)
Copyright (c) 2020-2024 Alibaba Cloud.

Start license validation (current time : 01-MAR-2024 11:22:15).
License validation terminated. Time : 0.011s


OPTIMAL; objective 9.00

Completed.
----------------结果打印和存文件--------------
最小需要货车数 = 9
------每辆车----
|车ID|左边货物数|右边货物数|……|左边厚度|右边厚度|……|左边重量|右边重量|左右重量差异|
|--|--|--|--|--|--|--|--|--|--|
|1|5|5|……|500|462|……|4363|4237|126|
|3|7|10|……|488|411|……|3393|3046|347|
|6|6|5|……|499|474|……|4526|4053|473|
|8|5|5|……|482|499|……|3574|3112|462|
|9|6|4|……|491|488|……|4454|4412|42|
|10|6|5|……|461|488|……|4118|3812|306|
|11|6|6|……|487|440|……|3931|3816|115|
|13|4|5|……|492|469|……|4460|4135|325|
|14|5|5|……|414|492|……|3948|3544|404|
------每个货物----
|货物ID|包装厚度(cm)|重量(kg)|放置车辆|边|
|--|--|--|--|--|
|1|101|505|14|left|
|2|61|305|3|right|
|3|126|630|8|right|
|4|32|256|3|left|
|5|39|429|13|right|
|……|……|……|……|……|
结果文件存储在: [车辆装载情况.csv](车辆装载情况.csv) 和 [货物装载方案.csv](货物装载方案.csv)

求解结果

上面的打印的结果部分为:
总共有100个货物待装载, 先假设有20辆货车


最小需要货车数 = 9
------每辆车----

车ID左边货物数右边货物数……左边厚度右边厚度……左边重量右边重量左右重量差异
155……500462……43634237126
3710……488411……33933046347
665……499474……45264053473
855……482499……35743112462
964……491488……4454441242
1065……461488……41183812306
1166……487440……39313816115
1345……492469……44604135325
1455……414492……39483544404

------每个货物----

货物ID包装厚度(cm)重量(kg)放置车辆
110150514left
2613053right
31266308right
4322563left
53942913right
…………………………

另外,上面的结果还存在了文件 车辆装载情况.csv货物装载方案.csv,可在下文的案例地址中查看。

高阶方案尝试

读者可尝试复制本项目,增加难度进行调试。比如:

  1. 修改data文件夹的item.csv数据,如 data/items-100-2.csv,观察不同数据的结果区别。
  2. 增加分块的量去测试对速度的影响,如 data/items-200.csv 的200个货一起算装载方式。
  3. 将1010个货物的所有的装载方案计算完。
  4. 将货车分成不同型号和载重,更改模型进行测试。
  5. 改进上面的数学建模模型,使得计算更简单快速。

可在云上建模平台进行调试(免安装),案例地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1626237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1-内核开发环境ubuntu+virtualbox+mobaXterm搭建

内核开发环境 ubuntuvirtualboxmobaXterm搭建 目录 内核开发环境 ubuntuvirtualboxmobaXterm搭建 1.virtualbox 安装 2.ubuntu 安装 3.网络设置 4.虚拟机安装ssh 服务&#xff0c;更新ubuntu 源安装基本软件 5.mobaXterm 个人免费版本安装 6.总结 本课程教程从0-1开始教…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

为什么 React 比 Vue 难?你不知道的前端简史!

CSDN里有一个女粉问我&#xff0c;为什么都在说 React 比 Vue 难? 事实上&#xff0c;我不知道这个说法算是客观事实呢&#xff0c;还是“思想钢印”。 但是我第一反应就是盲猜一手&#xff0c;“React 比 Vue 难”这个说法可能源于后端攻城狮的主观评价&#xff0c;因为传统…

华为Pura 70系列,一种关于世界之美的可能

1874年&#xff0c;莫奈创作了《印象日出》的油画&#xff0c;在艺术界掀起了一场革命。当时的主流艺术&#xff0c;是追求细节写实&#xff0c;追求场面宏大的学院派。他们称莫奈等人是“印象派”&#xff0c;认为莫奈的画追求光影表达&#xff0c;追求描绘抽象的意境&#xf…

Oracle正則匹配練習一

1.使用分割符號 select regexp_substr(A_B_C, [^_], 1, 2) FROM DUAL 2.練習2 SELECT SUBSTR(path_string, INSTR(path_string, \, -1, 2) 1, INSTR(path_string, \, -1) - INSTR(path_string, \, -1, 2) - 1) AS extracted_string FROM (SELECT D:\SKY Image\A0-BOTC8…

一个VUE3的页面demo

样子是这样的 目录是这样的 index.vue文件内容 <template><div class"app-container"><div class"content"><div class"form" v-show"showSearch"><el-formref"queryRef":inline"true&qu…

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 &#xff0c;返回数组中最大数和最小数的最大公约数&#xff1b;2、两个数的最大公约数是能够被两个数整除的最大正整数&#xff1b;示例&#xff1a; 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

Python3.11修改并运行oneforall

遇到的问题 使用python3.11默认无法运行oneforall脚本&#xff0c;出现如下报错 # 解决方案 修改 /usr/local/lib/python3.11/dist-packages/exrex.py exrex.py具体文件路径报错中会显示 vim /usr/local/lib/python3.11/dist-packages/exrex.py# 修改前 from re import sre…

02_c/c++开源库ZeroMQ

1.安装 C库 libzmq sudo apt install libzmq3-dev 实例: https://zeromq.org/get-started/?languagec&librarylibzmq# 编译依赖: pkg-config --cflags --libs libzmq or cat /usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc -isystem /usr/include/mit-krb5 -I/usr/in…

Magnet for Mac:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet for Mac v2.14.0中文免激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&…

低代码将干掉65%软件开发工作:留给码农的时间不多了

IDC预测&#xff0c;到2024年&#xff0c;约有65%的应用软件将通过低代码开发方式实现&#xff0c;同样&#xff0c;Gartner也曾发布过类似的预测&#xff0c;结果与IDC的预测大致相符。 低代码领域的知名公司Mendix之前发布的一份调研报告指出&#xff1a; “在中国&#xf…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

C# 生成图形验证码

目录 应用场景 开发运行环境 设计 生成内容 生成图片 实现 核心代码 调用示例 小结 应用场景 我们当用户登录系统时经常会用到图形验证码技术&#xff0c;要求用户识别图片中的内容&#xff0c;并正确输入&#xff0c;方可尝试登录。类似的场景还有用户注册或者涉及…

探秘MySQL主从复制的多种实现方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘MySQL主从复制的多种实现方式 前言基于语句的复制原理实现方法应用场景及优缺点应用场景优点缺点 基于行的复制原理实现方法优势和适用性优势适用性 基于混合模式的复制混合模式复制的工作原理混合…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持&#xff0c;stomp协议作为websocket的子协议&#xff0c;Spring也做了很多封装&#xff0c;让我们在开发中易于使用。 学习使用Spring的Websocket模块&#xff0c;当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

链游:未来游戏发展的新风向

链游&#xff0c;即区块链游戏的一种&#xff0c;是一种将区块链技术与游戏玩法相结合的创新型游戏。它利用区块链技术的特性&#xff0c;如去中心化、可追溯性和安全性&#xff0c;为玩家提供了一种全新的游戏体验。链游通常采用智能合约来实现游戏的规则和交易系统&#xff0…

按现价和不变价计算与公布的统计指标主要有哪些

在经济统计和分析工作中 , 有些指标可以直接用实物量表示 , 如粮食和工业品产量等&#xff1b;而有些指标则是用价值量表示的 , 如全国居民人均可支配收入、社会消费品零售总额、商品房销售额等。在计算价值量指标时&#xff0c;一般均要考虑采用什么价格来计算。统计上常用的价…

新媒体运营-----短视频运营-----PR视频剪辑----PR特效

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. 混合和对比度1. 滤色2. 对比度 2. 3d和属性粘贴3. 参考线和锚点 1. 混合和对比度 1. 滤色 混合是PS&#xff…

【数据结构(邓俊辉)学习笔记】绪论04——算法分析

文章目录 0. 前言1. 算法分析2.级数2.1基本形式2.2 收敛级数 3.循环 vs 级数4.示例 0. 前言 通过以基本计算模型作为参照&#xff0c;并且以大O记号的形式在上面添加适当刻度&#xff0c;已经建立一套对DSA进行分析的完整工具和体系。不清楚的可以看看复杂度度量 、复杂度分析…

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1&#xff1a;将数据发往指定 partition 示例2&#xff1a;有 key 的…