经典报童问题的2类扩展实例:带广告的报童问题和多产品报童问题

news2024/9/23 0:15:53

文章目录

  • 1 引言
  • 2 经典报童问题
  • 3 带广告的报童问题
    • 3.1 论文解读
    • 3.2 样本均值近似方法
  • 4 多产品报童问题
    • 4.1 论文解读
    • 4.2 算法模型
    • 4.3 简单实例求解
    • 4.4 复杂实例求解
  • 5 总结
  • 6 相关阅读

1 引言

中秋已过,国庆未至,趁着这个空窗期,学点新知识,充实一下自己,多是一件美事!

这次要学习的内容,可以看做是一文了解经典报童模型的扩展问题的延续。在那篇文章里,经典报童模型的扩展问题被分成了5种类型:扩展目标函数、增加约束条件、增加优化变量、扩展模型参数和扩展问题场景。至于每种扩展问题应该如何求解,并没有再过多介绍。

从我个人的认知来看,只了解综述,不清楚如何求解的话,会觉得理解的深度有点浅;另一方面,扩展问题类型太多,又不太可能把所有问题类型都求解一遍,所以本文将选择两类比较常见的扩展问题来求解:带广告的报童问题(single-period problem with advertising,SPPWA)和多产品报童问题(multi-product Newsboy problem, MPNP),其中前者属于扩展模型参数的类型,后者属于增加优化变量的类型。

正文见下。

2 经典报童问题

在研究扩展问题前,再回顾一下经典报童模型(SPP)。

经典报童模型可以描述为:报童每天从供应商处采购一定数量的报纸用于当天的销售。已知每份报纸的成本价 c c c,销售价 p p p,需求量 d d d是个不确定参数,通过历史的数据可知其概率分布函数,如果当天卖不完,会按回收价 s s s将未卖完的报纸卖给回收站。

该模型的核心诉求是:确定报童的最佳订购量 x x x,使得报童的净收入 θ ( x ) \theta(x) θ(x)最大化。其中 θ ( x ) \theta(x) θ(x)的表达式为
θ ( x ) = p ⋅ E [ min ⁡ ( x , d ) ] + s ⋅ E [ max ⁡ ( x − d , 0 ) ] − c x \theta(x)=p·E[\min(x,d)]+s·E[\max(x-d,0)]-cx θ(x)=pE[min(x,d)]+sE[max(xd,0)]cx
其中,第一项是售卖报纸的收益,第二项是回收报纸的收益,第三项是购买报纸的成本。

SPP的求解算法,可以参考:随机规划:求解报童问题期望值模型的算法方案。

3 带广告的报童问题

SPPWA相比SPP的区别是:报童可以给予报纸一定的广告投入,投入广告后,会改变(大概率是增加)原有的需求量,为了最大化收益,需要在决策订购量的同时,决策投入的广告预算。

3.1 论文解读

在研究SPPWA的论文中,本文选择如下这篇进行介绍:Linking advertising and quantity decisions in the single-period inventory model。这篇文章发表于2003年,虽然年代有些久远,但是初步阅读下来发现,这篇文章对于SPPWA的求解还是很有启发性的。

其核心内容是:针对SPPWA,当广告和需求的关系是如下表中的三种关系之一时,分别设定目标函数为最大化预期利润和最大化达到目标利润的概率,均可推导出解析最优解。

广告和需求的关系需求分布函数
CVC:需求的均值增加,方差不变均匀分布、正态分布
CCVC:需求的均值和方差同比例增加均匀分布、正态分布、指数分布
ICVC:需求的均值和方差都增加,但是方差增长的更快均匀分布、正态分布

需要说明的是,由于调研的精力有限,该文章不一定是求解SPPWA的最佳方案,只是看到这篇文章后,感觉已经解答了我心中所惑,所以就选择了这篇文章。

本节接下来的重点,不是还原论文推导的原过程,而是在原文理解的基础上,尝试通过其他更简单和直观的方法,去求解SPPWA,同时和解析解的结果做对比,从而加深对此类问题的理解。

3.2 样本均值近似方法

要求解SPPWA,首先需要明确需求量 d d d和广告 B B B间的关系。这里采用论文中使用的表达式:
d = d 0 ( 1 + w B α ) d = d_0(1+wB^{\alpha}) d=d0(1+wBα)
其中, d 0 d_0 d0是没广告时的需求量, w w w α \alpha α是经验参数。特别地,(1)如果 w w w为0,表示需求和广告之间没有关系;(2)需要限制 0 ≤ α ≤ 1 0≤\alpha≤1 0α1,此时,随着广告预算 B B B的增加,需求量 d d d的增加效应是边际递减的,这才符合我们的一般认知。下图是三个具体的实例。

需要额外说明的是,这个表达式不具备一般通用性。在实际业务场景中,需求量 d d d和广告 B B B间的关系大概率需要单独开发一个因果推断模型来刻画,例如:
Δ d d = α ⋅ Δ B B + b \frac{\Delta d}{d} = \alpha · \frac{\Delta B}{B} + b dΔd=αBΔB+b
即两者的变化率是线性的。在此基础上,基于历史的广告和需求量数据,使用双重机器学习等因果推断算法得到 α \alpha α值。

如果换成这种表达式,论文中的解析表达式将会不再适用。为了让求解算法能适应更多场景,本节将以样本均值近似方法为基础,然后再将把广告预算这个额外待优化的变量考虑进来。此处选用样本均值近似方法的另一个原因是:相比SPP,SPPWA在本质上只是多了广告预算这一个优化变量,并不会大幅增加求解时间。

接下来,将以ICVC为实例,进行求解。此时需求量 d d d和广告 B B B间的关系为
μ = μ 0 ( 1 + w B α ) , σ = σ 0 ( 1 + w B α ) ( 1 + g B γ ) \mu = \mu_0(1+wB^{\alpha}), \sigma = \sigma_0(1+wB^{\alpha})(1+gB^{\gamma}) μ=μ0(1+wBα),σ=σ0(1+wBα)(1+gBγ)
仿真参数和论文保持一致: P = 100 P = 100 P=100 C = 60 C=60 C=60 V = 40 V=40 V=40 S = 10 S=10 S=10,这些参数的含义已经在代码中标出,需要注意的是,他们和第2节中的参数含义并不完全一致,这里主要是为了和论文保持一致,所以没有刻意对齐上文; d d d满足正态分布,且 μ = 1000 \mu=1000 μ=1000 σ = 200 \sigma=200 σ=200,广告相关参数为: α = 0.5 \alpha=0.5 α=0.5 w = 0.005 w=0.005 w=0.005 g = 0.02 g=0.02 g=0.02 γ = 0.4 \gamma=0.4 γ=0.4

以下为求解的Python代码。相比经典报童问题的求解代码,首先是多了一层针对广告预算 B B B的for循环;然后是目标函数里多了两项: − s ∗ max ⁡ ( cur d − cur x , 0 ) - s * \max(\text{cur}_d -\text{cur}_x, 0) smax(curdcurx,0) − B -B B,其中第一项表示减去缺货损失值,第二项表示减去广告预算值。

import numpy as np

if __name__ == '__main__':

    # 报童模型参数
    c = 60  # 成本价
    s = 10  # 缺货价
    p = 100  # 单位卖价
    v = 40  # 回收价

    # 广告模型参数
    w = 0.005
    alpha = 0.5
    g = 0.02
    gamma = 0.4

    # 最优解
    best_f = 0  # 最大收益
    best_x = 0  # 最佳购买量
    best_B = 0  # 最佳广告预算

    np.random.seed(42)

    # 遍历所有决策变量x
    for cur_x in range(500, 2000, 100):

        # 遍历所有广告预算
        for B in range(1000, 20000, 100):

            cur_f = 0

            # 需求分布,ICVC
            mu0 = 1000
            mu = mu0 + mu0 * w * B ** alpha
            sigma0 = 200
            sigma = sigma0 * (1 + w * B ** alpha) * (1 + g * B ** gamma)
            d = np.random.normal(mu, sigma, 10000)

            # 统计收益
            for cur_d_index in range(len(d)):
                cur_d = d[cur_d_index]
                # 计算当前决策变量和当前需求值时的值
                cur_f += p * min(cur_x, cur_d) + v * max(cur_x - cur_d, 0) - c * cur_x - s * max(cur_d - cur_x, 0) - B

            # 更新最优解
            if cur_f / len(d) > best_f:
                best_f = cur_f / len(d)
                best_x = cur_x
                best_B = B

    print('best_x: {}, best_B: {}, best_f: {}.'.format(best_x, best_B,best_f))

运行代码后,可以得到最优解如下。

best_x: 1500, best_B: 3700, best_f: 39198.29929996124.

从论文可知,解析解为
x = 1613 , B = 3602 , f = 38940 x=1613, B = 3602, f = 38940 x=1613,B=3602,f=38940
对比两组解发现,两者的差异并不大,主要差异应该是来源于 d d d B B B的离散化处理,整体上是符合预期的。

4 多产品报童问题

MPNP相比SPP的区别是:报童可以采购的报纸类型有多种,每一种类型的报纸成本、销售价、需求量和回收价均不同;同时报童的总预算上限有约束。为了最大化收益,就需要同时决策每一种报纸的订购量。

4.1 论文解读

在研究MPNP的论文中,本文选择如下这篇进行介绍::Exact, approximate, and generic iterative models for the multi-product Newsboy problem with budget constraint。

这篇文章的核心内容是:针对MPNP,提出了一种通用的迭代求解算法,如果需求的分布为均匀分布,可以得到精确解;如果需求的分布为一般化的函数,则随着迭代次数的增加,可以逐步逼近期望的精度水平。

和上一章类似,本章接下来的内容,不是复现原文,而是在对原文理解的基础上,尝试使用其他方法替代文中迭代求解的方法,去求解MPNP。

4.2 算法模型

针对MPNP,目标函数为
min ⁡   E = ∑ τ = 1 N [ c τ x τ + h τ ∫ 0 x τ ( x τ − D τ ) f τ ( D τ ) d D τ + v τ ∫ x τ ∞ ( D τ − x τ ) f τ ( D τ ) d D τ ] \min \ E=\sum_{\tau=1}^N[c_{\tau}x_{\tau}+h_{\tau}\int_0^{x_{\tau}}(x_{\tau}-D_{\tau})f_{\tau}(D_{\tau})dD_{\tau}+v_{\tau}\int_{x_{\tau}}^{\infty}(D_{\tau}-x_{\tau})f_{\tau}(D_{\tau})dD_{\tau}] min E=τ=1N[cτxτ+hτ0xτ(xτDτ)fτ(Dτ)dDτ+vτxτ(Dτxτ)fτ(Dτ)dDτ]
式中, E E E为预期费用,所以目标是最小化; τ ( = 1 , 2 , . . . , N ) \tau(=1,2,...,N) τ(=1,2,...,N)是产品编号, N N N是产品总数量; c τ c_{\tau} cτ是第 τ \tau τ个产品的单价; x τ x_{\tau} xτ是第 τ \tau τ个产品的订购量; h τ h_{\tau} hτ是第 τ \tau τ个产品未卖完情况下的剩余价值(残值); D τ D_{\tau} Dτ是第 τ \tau τ个产品的需求量; f τ ( D τ ) f_{\tau}(D_{\tau}) fτ(Dτ)是第 τ \tau τ个产品的需求概率密度函数; v τ v_{\tau} vτ是第 τ \tau τ个产品的利润。整体来看,上述公式可以理解为包含三类费用:第一项为购买产品的成本,第二项是多亏的钱,第三项为少赚的钱。

约束条件为
∑ τ = 1 N c τ x τ ≤ B G \sum_{\tau = 1}^N c_{\tau}x_{\tau}≤B_G τ=1NcτxτBG
式中, B G B_G BG指的是预算上限。

求解的过程可以分为三步:

(1) 假设不存在约束条件,MPNP可以直接转化为多个相互独立的SPP,然后分别求解得到 x τ ∗ x_{\tau}^{\ast} xτ

(2) 如果 x τ ∗ x_{\tau}^{\ast} xτ满足约束条件,则该解也是MPNP的最优解,直接退出;否则继续执行第三步。

(3) 从 x τ ∗ x_{\tau}^{\ast} xτ开始迭代,直至约束条件被满足。

第一步单产品最优解 x τ ∗ x_{\tau}^{\ast} xτ的求解可以参考之前的文章:随机规划:求解报童问题期望值模型的算法方案。这里已经不再是重点,直接给出最终公式为
F τ ( x τ ∗ ) = v τ − c τ v τ + h τ = θ τ F_{\tau}(x_{\tau}^{\ast})=\frac{v_{\tau}-c_{\tau}}{v_{\tau}+h_{\tau}}=\theta_{\tau} Fτ(xτ)=vτ+hτvτcτ=θτ
此处, F τ ( x τ ∗ ) F_{\tau}(x_{\tau}^{\ast}) Fτ(xτ) x τ ∗ x_{\tau}^{\ast} xτ的累积分布函数。

第二步验证 x τ ∗ x_{\tau}^{\ast} xτ是否满足约束,也无需赘述。

所以重点是,第三步的详细步骤,接下来将详细描述。

对于带约束的优化问题,一种可行的方案是:拉格朗日乘子法。在该场景中,目标函数变为
min ⁡   L = ∑ τ = 1 N [ c τ x τ + h τ ∫ 0 x τ ( x τ − D τ ) f τ ( D τ ) d D τ + v τ ∫ x τ ∞ ( D τ − x τ ) f τ ( D τ ) d D τ ] + λ ( ∑ τ = 1 N c τ x τ − B G ) \min \ L=\sum_{\tau=1}^N[c_{\tau}x_{\tau}+h_{\tau}\int_0^{x_{\tau}}(x_{\tau}-D_{\tau})f_{\tau}(D_{\tau})dD_{\tau}+v_{\tau}\int_{x_{\tau}}^{\infty}(D_{\tau}-x_{\tau})f_{\tau}(D_{\tau})dD_{\tau}] + \lambda (\sum_{\tau = 1}^N c_{\tau}x_{\tau}-B_G) min L=τ=1N[cτxτ+hτ0xτ(xτDτ)fτ(Dτ)dDτ+vτxτ(Dτxτ)fτ(Dτ)dDτ]+λ(τ=1NcτxτBG)
最优解变为
F τ ( x τ ∗ ∗ ) = v τ − c τ ( 1 + λ ) v τ + h τ F_{\tau}(x_{\tau}^{\ast \ast})=\frac{v_{\tau}-c_{\tau}(1+\lambda)}{v_{\tau}+h_{\tau}} Fτ(xτ∗∗)=vτ+hτvτcτ(1+λ)
从上式可知,只要得到了 λ \lambda λ的值, x τ ∗ ∗ x_{\tau}^{\ast \ast} xτ∗∗的值也就得到了。

4.3 简单实例求解

为了更好地展示如何得到 λ \lambda λ的过程,我们先找个具体的实例来感受一下。

最简单的实例应该是: D τ D_{\tau} Dτ的分布为均匀分布。假设最大值为 b τ b_{\tau} bτ,最小值为 a τ a_{\tau} aτ,则 D τ D_{\tau} Dτ的累积分布函数为

把上式代入 F τ ( x τ ∗ ∗ ) F_{\tau}(x_{\tau}^{\ast \ast}) Fτ(xτ∗∗),可以得到
x τ ∗ ∗ = ( b τ − a τ ) ⋅ v τ − c τ ( 1 + λ ) v τ + h τ + a τ x_{\tau}^{\ast\ast}=(b_{\tau}-a_{\tau})·\frac{v_{\tau}-c_{\tau}(1+\lambda)}{v_{\tau}+h_{\tau}}+a_{\tau} xτ∗∗=(bτaτ)vτ+hτvτcτ(1+λ)+aτ

由于 x τ ∗ x_{\tau}^{\ast} xτ不满足预算约束,且 x τ ∗ ∗ x_{\tau}^{\ast\ast} xτ∗∗为最优解,所以此时的约束变为硬约束
∑ τ = 1 N ( c τ x τ ∗ ∗ ) − B G = 0 \sum_{\tau=1}^N (c_{\tau}x_{\tau}^{\ast\ast})-B_G=0 τ=1N(cτxτ∗∗)BG=0
将上上式代回上式,便可以解出 λ \lambda λ
λ = Δ C ∑ τ = 1 N ( b τ − a τ ) ⋅ [ c τ 2 / ( v τ + h τ ) ] \lambda=\frac{\Delta C}{\sum_{\tau=1}^N (b_{\tau}-a_{\tau})·[c_{\tau}^2/(v_{\tau}+h_{\tau})]} λ=τ=1N(bτaτ)[cτ2/(vτ+hτ)]ΔC
此处 Δ C = ∑ τ = 1 N ( c τ x τ ∗ ) − B G \Delta C=\sum_{\tau=1}^N (c_{\tau}x_{\tau}^{\ast})-B_G ΔC=τ=1N(cτxτ)BG,可以理解为 x τ ∗ x_{\tau}^{\ast} xτ情况下约束不满足的程度。

过程挺简单的,再整理一下具体的求解过程,核心就三步:①确定累积分布函数 F τ ( D τ ) F_{\tau}(D_{\tau}) Fτ(Dτ);②使用累计分布函数反解 x τ ∗ ∗ x_{\tau}^{\ast\ast} xτ∗∗的表达式,此时表达式中包含 λ \lambda λ;③将 x τ ∗ ∗ x_{\tau}^{\ast\ast} xτ∗∗的表达式代入硬约束条件,求出 λ \lambda λ值。

4.4 复杂实例求解

如果 D τ D_{\tau} Dτ的分布不是均匀分布,而是更复杂的分布函数,上述的步骤①和②可以继续求解,但③可能无法得到 λ \lambda λ的解析表达式。

到了这一步,论文中使用泰勒展开式,按展开的项数,分别给出近似项和误差项,当误差项的值低于允许的误差最大值后,近似项就可以认为是最优解。

但事实上,步骤③的求解本质上就是个一元的求根问题,鉴于现在的数值优化能力已经足够强大,我们可以直接使用数值的方式高效求出 λ \lambda λ值,不用再去推导复杂的表达式。

接下来,我们看一个 D τ D_{\tau} Dτ的分布为指数分布的实例,此时
F τ ( D τ ) = 1 − e − μ τ D τ ,  for  D τ > 0 F_{\tau}(D_{\tau})=1-e^{-\mu_{\tau}D_{\tau}}, \ \text{for} \ D_{\tau} > 0 Fτ(Dτ)=1eμτDτ, for Dτ>0

x τ ∗ ∗ = − μ τ ln ⁡ ( 1 − v τ − c τ ( 1 + λ ) v τ + h τ ) x_{\tau}^{\ast\ast}=-\mu_{\tau} \ln(1-\frac{v_{\tau}-c_{\tau}(1+\lambda)}{v_{\tau}+h_{\tau}}) xτ∗∗=μτln(1vτ+hτvτcτ(1+λ))
其中, μ τ \mu_{\tau} μτ为第 τ \tau τ个产品的指数分布函数的参数。

将上述 x τ ∗ ∗ x_{\tau}^{\ast\ast} xτ∗∗代入硬约束,再调用scipy.optimize.fsolve函数便可求解出 λ \lambda λ

以下为求解的Python代码。其中,产品数量为6个,预算上限为3500,其他参数如 v τ v_{\tau} vτ h τ h_{\tau} hτ c τ c_{\tau} cτ μ τ \mu_{\tau} μτ也和论文中保持一致。

import math
from scipy.optimize import fsolve
import numpy as np


# 迭代计算模型
def f1(x, c, mu, v, h, b_g):
    return (c * (-mu) * np.log(1 - (v - c * (1 + x)) / (v + h))).sum() - b_g


if __name__ == '__main__':

    # MPNP参数
    item_cnt = 6  # 产品数量
    v = np.array([7, 12, 30, 30, 40, 45])  # 卖价
    h = np.array([1, 2, 4, 4, 2, 5])  # 滞销价
    c = np.array([4, 8, 20, 10, 13, 15])  # 成本价
    b_g = 3500  # 预算约束

    mu = np.array([200, 225, 112.5, 100, 75, 30])  # 指数分布参数

    x0 = []  # SPP的解
    delta_C = -b_g
    theta = []
    for i in range(item_cnt):
        theta.append((v[i] - c[i]) / (v[i] + h[i]))
        x0.append(- mu[i] * math.log(1 - theta[i]))
        delta_C += c[i] * x0[i]

    if delta_C <= 0:
        # SPP已经是最优解,直接输出
        print('SPP satisfies the constraint, best_x: {}'.format(x0))
    else:
        # SPP不是最优解,需要迭代
        theta = np.array(theta)
        sol = fsolve(f1, 0, args=(c, mu, v, h, b_g, ))  # 使用x0的解为初值,此时lambda0=0
        best_x = (-mu) * np.log(1 - (v - c * (1 + sol)) / (v + h))  # 基于最优解重新计算x
        print('SPP does not satisfy the constraint, best_x: {}'.format(best_x))

运行代码后,得到最优解如下。该解和论文中的解几乎一致,验证了求解方案的正确性。

SPP does not satisfy the constraint, best_x: [78.44198293 58.20266745 30.08242137 81.75608862 70.92060077 25.29557367]

5 总结

文章正文到此就结束了,本节做个简单的总结:

(1)针对带广告的报童问题,当广告和需求量的关系满足一定的关系时,可以得到解析解;使用样本均值近似方法也可以快速求解。

(2)针对多产品报童问题,采用迭代求解的方法,可以逐步逼近最优解;也可以使用数值求解的方法直接得到最优解。

6 相关阅读

带广告的报童问题:https://www.sciencedirect.com/science/article/abs/pii/S0925527303000082

多产品报童问题:https://www.sciencedirect.com/science/article/abs/pii/S0925527303002901

拉格朗日乘子法:https://mp.weixin.qq.com/s/cljmqvklV4OcBYov22ag3A?token=1853406253&lang=zh_CN

经典报童问题求解方案:https://mp.weixin.qq.com/s/4yzjz2YhkHbVYL8H78qX5w?token=1853406253&lang=zh_CN

经典报童模型扩展综述:https://mp.weixin.qq.com/s?__biz=MzIyMzc3MjIyMw==&mid=2247485123&idx=1&sn=068d9e682d3a27ad8af91f029bb49c53&chksm=e8186d93df6fe485ef4e455e110f6339e0cd67c73d32451e2bd9648480c5a5cf17685c042758&token=1111227419&lang=zh_CN#rd

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

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

相关文章

解决DockerDesktop启动redis后采用PowerShell终端操作

如图&#xff1a; 在启动redis容器后&#xff0c;会计入以下界面 &#xff1a; 在进入执行界面后如图&#xff1a; 是否会觉得界面过于单调&#xff0c;于是想到使用PowerShell来操作。 步骤如下&#xff1a; 这样就能使用PowerShell愉快地敲命令了&#xff08;颜值是第一生…

AttributeError: ‘Sequential‘ object has no attribute ‘predict_classes‘如何解决

今天跟着书敲代码&#xff0c;报错&#xff1a; Sequential object has no attribute predict_classes&#xff0c;如图所示&#xff1a; 上网百度&#xff0c;发现predict_classes函数在新版本中已经删除了&#xff0c;需要使用 model.predict() 替代 model.predict_classes()…

【java面经速记】Mysql和ES数据同步

目录 Mysql业务数据库 ES查询数据库 数据同步方案 同步双写 异步双写&#xff08;MQ方式&#xff09; 基于Mysql的定时扫描同步 基于Binlog实时同步 使用canal监听binlog同步数据到es&#xff08;流行方案&#xff09; 拓展:mysql的主从复制原理 canal原理&#xff1a…

Via浏览器自动关闭CSDN弹窗

不知道大家有没有突发灵感迫切需要在手机上搜索一些技术性博客的时候。 不知道大家是不是搜索到的基本都是CSDN的文章。 不知道大家是否也被CSDN各种弹窗确认搞得心态爆炸。 不知道大家现在在手机上用的是什么浏览器&#xff0c;一直以来&#xff0c;我用的都是夸克&#xf…

时钟的配置

在使用51单片机时&#xff0c;系统使用的时钟源是一个外部晶体振荡器&#xff0c;频率为12M。由于51单片机每个指令周期都是12分频的&#xff0c;所以实际工作频率仅为1M。2440作为一种性能远高于51的Soc&#xff0c;主频肯定要远远高于51&#xff0c;因此2440有着比51单片机复…

【Android】DataBinding的运用

引言 之前对databinding有了基础的运用与介绍&#xff0c;但databinding的用处不单单在于Text的绑定&#xff0c;接下来就一起看看吧&#xff01; 意义&#xff1a;让布局文件承担了部分原本属于页面的工作&#xff0c;使页面与布局耦合度进一步降低。允许用户界面&#xff0…

Maven-一、分模块开发

Maven进阶 文章目录 Maven进阶前言创建新模块向新模块装入内容使用新模块把模块部署到本地仓库补充总结 前言 分模块开发可以把一个完整项目中的不同功能分为不同模块管理&#xff0c;然后模块间可以相互调用&#xff0c;该篇以一个SSM项目为目标展示如何使用maven分模块管理。…

操作系统之I/O设备管理

I/O系统的组成 I/O系统的结构 微机I/O系统 总线型I/O系统结构,CPU与内存之间可以直接进行信息交换&#xff0c;但是不能与设备直接进行信息交换&#xff0c;必须经过设备控制器。 主机I/O系统 I/O系统可能采用四级结构&#xff0c;包括主机、通道、控制器和设备。一个通道…

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥&#xff1f;、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是&#xff1a;A 解析&#xff1a; ‌‌‌‌  batch normalization 就…

TikTokDownloader 开源项目操作教程

TikTokDownloader TikTokDownloader 是一个开源的多功能视频下载工具&#xff0c;它专门用于从抖音和TikTok平台下载无水印的视频、图集和直播内容。这个工具支持批量下载账号作品、收藏内容&#xff0c;并可以采集详细数据。它提供了命令行和Web界面&#xff0c;具有多线程下…

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

re题(38)BUUCTF-[FlareOn6]Overlong

BUUCTF在线评测 (buuoj.cn) 运行一下.exe文件 查壳是32位的文件&#xff0c;放到ida反汇编 对unk_402008前28位进行一个操作&#xff0c;我们看到运行.exe文件的窗口正好是28个字符&#xff0c;而unk_402008中不止28个数据&#xff0c;所以猜测MessageBoxA&#xff08;&#x…

十一、 JDK17 新特性梳理

文章目录 为什么是JDK17语法层面新特性1、文本块2 、Switch 表达式增强3、instanceof的模式匹配4、var 局部变量推导 模块化及类封装1、记录类 record2 、隐藏类 Hidden Classes3 、密封类 Sealed Classes4、模块化 Module System1 、什么是模块化2、声明一个module3 、require…

从零开始讲DDR(4)——Xilinx方案

本文依据的是xilinx的PG150文档&#xff0c;主要介绍的是xilinx的ultrascale系列中内存资源的使用。 一、方案概述 Xilinx UltraScale™架构中的DDR3/DDR4 SDRAM ip核旨在支持高性能的内存接口解决方案。这些ip可以用于将DDR3和DDR4 SDRAM内存类型集成到设计中&#xff0c;提供…

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读&#xff1a;本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读&#xff0c;并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法&#xff0c;以供生产制造行业的从业者参考交流。

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

解决SVN蓝色问号的问题

桌面或文件夹右键&#xff0c;选择TortoiseSVN->Settings打开设置对话框&#xff0c;选择Icon Overlays->Overlay Handlers->取消钩选Unversioned。确定&#xff0c;重启系统即可

扫码挪车是怎么实现的呢?一篇文章带你了解一下!扫码挪车小程序基础版上线了!!!

挪车小程序系统源码的功能特点 快速定位与挪车请求&#xff1a;车主通过小程序可以快速定位车辆位置&#xff0c;并发送挪车请求。系统会自动将请求发送给附近的车主&#xff0c;提醒其尽快挪车。实时通信与交互&#xff1a;小程序支持实时通信功能&#xff0c;车主之间可以通…

【安当产品应用案例100集】017-助力软件服务商高效集成多因素认证

一、企业案例背景 在本案例中&#xff0c;某企业作为一家软件技术服务商&#xff0c;为包括银行、政府机构在内的多个行业提供定制化的软件服务。由于各个行业的安全需求各异&#xff0c;例如银行和政府机构倾向于使用UKEY进行身份验证&#xff0c;而其他企业则可能偏好使用数…

[Python学习日记-26] Python 中的文件操作

[Python学习日记-26] Python 中的文件操作 简介 操作模式 循环文件 其他功能 混合模式 修改文件 简介 在 Python 中的文件操作其实和我们平时使用的 Word 的操作是比较类似的&#xff0c;我们先说一下 Word 的操作流程&#xff0c;流程如下&#xff1a; 找到文件&#x…