粒子群算法与优化储能策略python实践

粒子群优化算法(Particle Swarm Optimization,简称PSO), 是1995年J. Kennedy博士和R. C. Eberhart博士一起提出的,它是源于对鸟群捕食行为的研究。粒子群优化算法的基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的最优解。

1. 粒子群优化算法的基本原理

在粒子群优化算法中,目标空间中的每个解都可以用一只鸟(粒子)表示,问题中的需求解就是鸟群所要寻找的食物源。在寻找最优解的过程中,每个粒子都存在个体(Personal)行为和群体(Team)行为。每个粒子都会学习同伴的飞行经验和借鉴自己的飞行经验去寻找最优解。每个粒子都会向两个值学习,一个值是个体的历史最优值 p b e s t p_{best} pbest;;另一个值是群体的历史最优值(全局最优值) g b e s t g_{best} gbest。粒子会根据这两个值来调整自身的速度和位置,而每个位置的优劣都是根据适应度值来确定的。适应度函数是优化的目标函数。

在这里插入图片描述

2. 粒子群优化算法的关键要素

2.1. 适应度

适应度在粒子群优化算法中是一个核心概念,它用于评估解的质量,指导算法搜索的方向。适应度通常由目标函数定义,而目标函数是需要被优化的问题的数学表达。

适应度函数的具体形式取决于优化问题本身,它可以是一个简单的数学函数,也可以是一个复杂的评价模型,取决于问题的复杂性和实际需求。例如,在测试粒子群算法的优化性能时,可能会使用多维多极值的数学函数来进行仿真。

在粒子群算法中,每个粒子都会根据其适应度来更新个体最优位置(pbest)和全局最优位置(gbest)。这些最优位置的发现是算法搜索过程中的关键,它们指导粒子群向潜在的最优解区域移动。粒子通过模仿这两个最优位置来调整自己的速度和位置,从而在解空间中进行高效的搜索。

总的来说,适应度在粒子群优化算法中起到了评价和引导的作用,它帮助算法判断哪些区域更有可能包含最优解,并据此调整搜索策略。

2.2. 速度和位置更新

粒子群优化算法中,粒子的运动是通过维护速度向量和位置向量来描述的。具体来说:

  • 速度向量:速度向量 v i v_i vi 描述了粒子在每一维上的移动速度和方向,它决定了粒子下一步迭代中移动的距离和方向。
  • 位置向量:位置向量 x i x_i xi 则表示粒子在解空间中的具体位置。

在粒子群优化算法中,每个粒子的速度和位置更新公式可以表示为:

v i d k + 1 = ω v i d k + c 1 r 1 ( p i d , pbest k − x i d k ) + c 2 r 2 ( p g d , gbest k − x i d k ) v_{id}^{k+1} = \omega v_{id}^{k} + c_1 r_1 (p_{id,\text{pbest}}^{k} - x_{id}^{k}) + c_2 r_2 (p_{gd,\text{gbest}}^{k} - x_{id}^{k}) vidk+1=ωvidk+c1r1(pid,pbestkxidk)+c2r2(pgd,gbestkxidk)

位置更新公式:
x i d k + 1 = x i d k + v i d k + 1 x_{id}^{k+1} = x_{id}^{k} + v_{id}^{k+1} xidk+1=xidk+vidk+1

其中:

  • v i d k + 1 v_{id}^{k+1} vidk+1 是粒子 i i i 在第 d d d 维上的速度向量的新值。
  • x i d k + 1 x_{id}^{k+1} xidk+1 是粒子 i i i 在第 d d d 维上的位置向量的新值。
  • ω \omega ω 是惯性权重,用于控制粒子保持当前速度的能力。
  • c 1 c_1 c1 c 2 c_2 c2 是学习因子,分别代表个体和社会认知的影响。
  • r 1 r_1 r1 r 2 r_2 r2 是介于 [ 0 , 1 ] [0, 1] [0,1] 之间的随机数。
  • p i d , pbest k p_{id,\text{pbest}}^{k} pid,pbestk 是粒子 i i i 在第 d d d 维上的个人最佳位置。
  • p g d , gbest k p_{gd,\text{gbest}}^{k} pgd,gbestk 是全局最佳位置的第 d d d 维坐标。
  • k k k 表示当前的迭代次数。

从公式的角度来看,PSO算法中的速度更新包含了三个部分:

  • 记忆项: ω v i k \omega v_i^k ωvik,表示粒子当前速度对下一次速度的影响,有助于保持粒子的运动惯性。
  • 个体认知项: c 1 × r 1 × ( p i d , pbest k − x i d k ) c_1 \times r_1 \times (p_{id, \text{pbest}}^{k} - x_{id}^{k}) c1×r1×(pid,pbestkxidk),表示粒子向自身历史最佳位置学习的趋势。
  • 社会认知项: c 2 × r 2 × ( p g d , gbest k − x i d k ) c_2 \times r_2 \times (p_{gd, \text{gbest}}^{k} - x_{id}^{k}) c2×r2×(pgd,gbestkxidk),表示粒子向全局最佳位置学习的趋势,体现了粒子间的协同合作和知识共享。

通过这种方式,粒子的速度和位置会根据个体经验和群体经验不断更新,从而使粒子向最优解靠近。粒子群优化算法的这种机制使得它在解决优化问题时具有很强的搜索能力和较快的收敛速度。

2.3. 惯性权重和学习因子

惯性权重( ω ω ω)控制粒子当前速度对下一次速度的影响程度,有助于保持粒子的运动惯性。学习因子( c 1 c_1 c1) 和 ( c 2 c_2 c2)则分别影响粒子向个体历史最佳位置和全局最佳位置学习的权重。这些参数的选择对算法的性能有重要影响。

3. 算法流程

  1. 确定目标函数。

首先,需要明确优化问题的目标函数,即需要最小化或最大化的函数。目标函数是粒子群优化算法搜索方向的基础,它决定了粒子的适应度如何计算。

  1. 初始化:设定粒子群的大小、粒子的初始位置和速度、惯性权重、学习因子等参数。
  • 粒子群大小:确定参与搜索的粒子数量,它影响着搜索的广度和深度。
  • 初始位置和速度:随机生成粒子的初始位置和速度,确保它们在解空间内均匀分布。
  • 惯性权重:设置影响粒子速度保持能力的惯性权重,它影响着算法的收敛速度和搜索能力。
  • 学习因子:设置个体学习因子和社会学习因子,它们决定了粒子向个体历史最佳位置和全局最佳位置学习的权重。
  1. 评估适应度:根据适应度函数计算每个粒子的适应度值。

适应度函数用于评估粒子在解空间中的位置优劣,它是算法选择粒子移动方向的基础。根据目标函数计算粒子的适应度值,为后续的更新步骤提供依据。

  1. 更新个体历史最佳位置:比较当前粒子的适应度值与个体历史最佳位置的适应度值,如果当前位置更优,则更新个体历史最佳位置。

对于每个粒子,记录其个体历史最佳位置,即适应度值最优的位置。通过比较当前位置和个体历史最佳位置的适应度值,更新个体历史最佳位置。

  1. 判断速度和位置是否超出边界范围。

在更新粒子的速度和位置之前,需要检查它们是否超出了预设的边界范围。如果超出边界,需要进行适当的处理,如将速度或位置限制在边界内,或者重新初始化粒子的位置。

  1. 更新全局最佳位置:从所有粒子的个体历史最佳位置中选择适应度值最优的位置作为全局最佳位置。

全局最佳位置是整个粒子群在搜索过程中发现的适应度值最优的位置。通过比较所有粒子的个体历史最佳位置的适应度值,选择适应度值最优的位置作为全局最佳位置。

  1. 更新速度和位置:根据速度和位置更新公式,计算每个粒子的新速度和位置。

根据速度和位置更新公式,结合个体历史最佳位置和全局最佳位置的信息,计算每个粒子的新速度和位置。这一步骤是粒子群优化算法的核心,通过不断更新粒子的速度和位置,使得粒子群能够向最优解逼近。

  1. 迭代:重复步骤3至步骤7,直到达到预设的迭代次数或满足停止条件。

在每次迭代中,重复执行适应度评估、个体历史最佳位置更新、全局最佳位置更新、速度和位置更新的步骤,直到达到预设的迭代次数或者满足其他停止条件(如适应度值达到预设阈值、连续多次迭代适应度值无显著改进等)。最终,算法将输出全局最佳位置作为优化问题的解。

在这里插入图片描述

4. python实践代码

4.1. 算法实现

本文此处源代码来自优秀的博文[1]。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def fit_fun(x):  # 适应函数
    return sum(100.0 * (x[0][1:] - x[0][:-1] ** 2.0) ** 2.0 + (1 - x[0][:-1]) ** 2.0)

class Particle:
    # 初始化
    def __init__(self, x_max, max_vel, dim):
        self.__pos = np.random.uniform(-x_max, x_max, (1, dim))  # 粒子的位置
        self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim))  # 粒子的速度
        self.__bestPos = np.zeros((1, dim))  # 粒子最好的位置
        self.__fitnessValue = fit_fun(self.__pos)  # 适应度函数值

    def set_pos(self, value):
        self.__pos = value

    def get_pos(self):
        return self.__pos

    def set_best_pos(self, value):
        self.__bestPos = value

    def get_best_pos(self):
        return self.__bestPos

    def set_vel(self, value):
        self.__vel = value

    def get_vel(self):
        return self.__vel

    def set_fitness_value(self, value):
        self.__fitnessValue = value

    def get_fitness_value(self):
        return self.__fitnessValue

class PSO:
    def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):
        self.C1 = C1
        self.C2 = C2
        self.W = W
        self.dim = dim  # 粒子的维度
        self.size = size  # 粒子个数
        self.iter_num = iter_num  # 迭代次数
        self.x_max = x_max
        self.max_vel = max_vel  # 粒子最大速度
        self.tol = tol  # 截至条件
        self.best_fitness_value = best_fitness_value
        self.best_position = np.zeros((1, dim))  # 种群最优位置
        self.fitness_val_list = []  # 每次迭代最优适应值

        # 对种群进行初始化
        self.Particle_list = [Particle(self.x_max, self.max_vel, self.dim) for i in range(self.size)]

    def set_bestFitnessValue(self, value):
        self.best_fitness_value = value

    def get_bestFitnessValue(self):
        return self.best_fitness_value

    def set_bestPosition(self, value):
        self.best_position = value

    def get_bestPosition(self):
        return self.best_position

    # 更新速度
    def update_vel(self, part):
        vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) \
                    + self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())
        vel_value[vel_value > self.max_vel] = self.max_vel
        vel_value[vel_value < -self.max_vel] = -self.max_vel
        part.set_vel(vel_value)

    # 更新位置
    def update_pos(self, part):
        pos_value = part.get_pos() + part.get_vel()
        part.set_pos(pos_value)
        value = fit_fun(part.get_pos())
        if value < part.get_fitness_value():
            part.set_fitness_value(value)
            part.set_best_pos(pos_value)
        if value < self.get_bestFitnessValue():
            self.set_bestFitnessValue(value)
            self.set_bestPosition(pos_value)

    def update_ndim(self):

        for i in range(self.iter_num):
            for part in self.Particle_list:
                self.update_vel(part)  # 更新速度
                self.update_pos(part)  # 更新位置
            self.fitness_val_list.append(self.get_bestFitnessValue())  # 每次迭代完把当前的最优适应度存到列表
            print('第{}次最佳适应值为{}'.format(i, self.get_bestFitnessValue()))
            if self.get_bestFitnessValue() < self.tol:
                break

        return self.fitness_val_list, self.get_bestPosition()

if __name__ == '__main__':
    pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)
    fit_var_list, best_pos = pso.update_ndim()
    print("最优位置:" + str(best_pos))
    print("最优解:" + str(fit_var_list[-1]))
    plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)

4.2. 算法应用

用粒子群算法实现储能配置优化,已知24小时负荷曲线、24小时峰谷平电价,采用峰谷套利商业模式,以经济最优为目标函数,寻找最优的储能容量,求解储能容量,输出收益和储能容量。

目标函数:

Maximize p r o f i t = ∑ t = 0 24 p t , d i s c h a r g e p r i c e t − ∑ t = 0 24 p t , c h a r g e ( p r i c e t + p p r i c e ) − ∑ t = 0 24 η C m a x p r i c e t \text{Maximize} \quad profit = \sum_{t=0}^{24} p_{t, \text discharge} price_t - \sum_{t=0}^{24} p_{t, \text charge} (price_t+pprice) - \sum_{t=0}^{24} \eta C_{max}price_t Maximizeprofit=t=024pt,dischargepricett=024pt,charge(pricet+pprice)t=024ηCmaxpricet

  • 其中,充电与放电相等, ∑ t = 0 24 p t , c h a r g e = ∑ t = 0 24 p t , d i s c h a r g e \sum_{t=0}^{24} p_{t, \text charge} =\sum_{t=0}^{24} p_{t, \text discharge} t=024pt,charge=t=024pt,discharge p r i c e t price_t pricet对应price24中的数据。

  • η \eta η是变压器系统效率

约束条件包括:

  1. 每个时段的负荷需求必须得到满足。
  2. 储能充放电有先后顺序,最开始能量是0,从0开始充电,最后放到0。
  3. 储能容量定义为 C m a x = max ⁡ ( C t ) C_{max}= \max(C_t) Cmax=max(Ct)
  4. 储能最大充电功率是 P max charge = 0.5 C m a x P_{\text{max charge}}=0.5C_{max} Pmax charge=0.5Cmax,储能最大放电功率是 P max discharge = 0.5 C m a x P_{\text{max discharge}}=0.5C_{max} Pmax discharge=0.5Cmax
  5. 负荷需求平衡: P t from grid + P t discharge = P t load + P t charge P_t^{\text{from grid}} + P_t^{\text{discharge}} = P_t^{\text{load}} + P_t^{\text{charge}} Ptfrom grid+Ptdischarge=Ptload+Ptcharge,其中,4个变量分别是电网供电功率、储能放电功率、负荷功率、储能充电功率。其中, P t load P_t^{\text{load}} Ptload对应load24中的数据。
  6. 充放电功率限制: 0 ≤ P t charge ≤ P max charge 0 \leq P_t^{\text{charge}} \leq P_{\text{max charge}} 0PtchargePmax charge 0 ≤ P t discharge ≤ P max discharge 0 \leq P_t^{\text{discharge}} \leq P_{\text{max discharge}} 0PtdischargePmax discharge
  7. 当前储能能量: C t = C t − 1 + P t charge + P t discharge C_t =C_{t-1} + P_t^{\text{charge}} + P_t^{\text{discharge}} Ct=Ct1+Ptcharge+Ptdischarge
  8. 负载小于变压器容量: p t , c h a r g e + p t , d i s c h a r g e < C m a x p_{t, \text charge} + p_{t, \text discharge} <C_{max} pt,charge+pt,discharge<Cmax

粒子群算法中的每个粒子将代表一种可能的24小时充放电策略,而适应度(fitness)将由这个目标函数计算得出。粒子24个维度,位置代表着储能充放电功率(或电量),正数为充电,负数为放电,粒子速度代表充放电变化率,便于算法调优。

详见参考代码。

import numpy as np

class Particle:
    def __init__(self, dim, max_charge):
        #self.__charge = np.random.uniform(-max_charge, max_charge, dim)  # 粒子的充放电策略
        half_dim = dim // 2
        charge_positive = np.random.uniform(0, max_charge, half_dim)
        charge_negative = -charge_positive
        charge_last = np.concatenate((charge_positive[1:], charge_negative))
        np.random.shuffle(charge_last)  # 打乱顺序,使得充电和放电时段随机分布
        self.__charge = np.concatenate((charge_positive[0:1], charge_last))
        
        
        self.__transformer_capacity = np.random.uniform(2500, 3000)  # 变压器容量
        self.__velocity = np.random.uniform(0, 100, dim)  # 粒子的速度,初始设为0
        self.__fitness_value = float('-inf')  # 适应度函数值

    def set_charge(self, value):
        self.__charge = value

    def get_charge(self):
        return self.__charge

    def set_velocity(self, value):
        self.__velocity = value

    def get_velocity(self):
        return self.__velocity

    def set_transformer_capacity(self, value):
        self.__transformer_capacity = value

    def get_transformer_capacity(self):
        return self.__transformer_capacity

    def set_fitness_value(self, value):
        self.__fitness_value = value

    def get_fitness_value(self):
        return self.__fitness_value


class PSO:
    def __init__(self, dim, size, iter_num, max_charge, load, price, pprice, efficiency, loss, penalty_factor=0.1, C1=2, C2=2, W=1):
        self.C1 = C1
        self.C2 = C2
        self.W = W
        self.dim = dim  # 粒子的维度,即时间段数量
        self.size = size  # 粒子个数
        self.iter_num = iter_num  # 迭代次数
        self.max_charge = max_charge # 储能最大充电功率
        self.load = load  # 负荷需求数据
        self.price = price  # 电价数据
        self.pprice = pprice  # 平准度电成本
        self.efficiency = efficiency  # 系统效率
        self.loss = loss  # 变压器损耗
        self.penalty_factor = penalty_factor  # 惩罚系数
        self.best_fitness_value = float('-inf')  # 种群最优适应度
        self.best_position = np.zeros(dim)  # 种群最优位置
        self.fitness_val_list = []  # 每次迭代最优适应值
        self.energy_cap = 2*max_charge  # 储能容量
        self.transformer_cap = max(load) # 变压器容量

        # 对种群进行初始化
        self.particles = [Particle(dim, max_charge) for _ in range(size)]

    # 计算适应度函数值
    def calculate_fitness(self, particle):
        charge = particle.get_charge()  # 粒子的充电策略
        transformer_capacity = particle.get_transformer_capacity()  # 变压器容量

        # 负载超负荷惩罚
        violation_penalty = 0

        # 负荷需求平衡约束和收益计算
        total_profit = 0
        energy = 0
        for t in range(self.dim):
            # 负载超负荷惩罚
            if charge[t] + self.load[t] >= transformer_capacity:
                violation_penalty += 10 # 计算违反约束的惩罚,可以根据实际情况调整惩罚系数 
            elif charge[t] + self.load[t] < 0:  
                violation_penalty += 20 # 计算违反约束的惩罚,可以根据实际情况调整惩罚系数         
            
            if t > 0:
                energy += charge[t-1] * self.efficiency  # 计算当前时刻的储能能量,考虑系统效率

            if energy < -1:
                violation_penalty += 10 + abs(energy)  # 计算违反约束的惩罚,需要满足负载需求

            # 计算当前时刻的收益
            if charge[t] >= 0:  # 充电
                profit_t = - charge[t] * (self.price[t] + self.pprice)

            else:               # 放电
                profit_t = - charge[t] * self.price[t]
                    
            total_profit += profit_t - transformer_capacity * self.loss

        if abs(energy) <= 1:
            violation_penalty += 1  # 违反充放电平衡的惩罚,可以根据实际情况调整惩罚系数

        # 应用惩罚项
        fitness = (total_profit - violation_penalty * self.penalty_factor)  # 使用惩罚系数对适应度进行惩罚
        
        print(total_profit, fitness)

        return fitness

    # 修改储能参数
    def update_energy_param(self, particle):
        charge = particle.get_charge()  # 粒子的充电策略

        energy = 0
        energy_list = []
        for t in range(self.dim):  
            if t > 0:
                energy += charge[t-1] * self.efficiency  # 计算当前时刻的储能能量,考虑系统效率
                energy_list.append(energy)
        # 取最大数为储能容量          
        self.Cap_max = max(energy_list)
        self.max_charge = 0.5*self.Cap_max
        self.max_discharge = -0.5*self.Cap_max   


    # 更新最优位置和最优适应度
    def update_best_position(self, particle):
        fitness_value = self.calculate_fitness(particle)
        if fitness_value > particle.get_fitness_value():
            particle.set_fitness_value(fitness_value)
            particle_charge = particle.get_charge()
            particle.set_best_charge(particle.get_charge())
            self.best_fitness_value = fitness_value
            self.best_position = particle_charge

    # 更新速度和位置
    def update_particle(self, particle):
        velocity = self.W * particle.get_velocity() + \
                    self.C1 * np.random.rand() * (particle.get_charge() - particle.get_charge()) + \
                    self.C2 * np.random.rand() * (self.best_position - particle.get_charge())
        # 边界检查
        charge = particle.get_charge()
    
        # 更新速度
        new_velocity = charge - velocity
        new_velocity[new_velocity > self.max_charge] = self.max_charge  # 速度上限
        new_velocity[new_velocity < -self.max_charge] = -self.max_charge  # 速度下限
        particle.set_velocity(new_velocity)    
        
        # 更新位置
        new_charge = charge + new_velocity
        new_charge[new_charge > self.max_charge] = self.max_charge  # 充电上限
        new_charge[new_charge < -self.max_charge] = -self.max_charge  # 放电下限
        particle.set_charge(new_charge)


    # 更新全局最优位置和适应度值
    def update_global_best(self):
        for particle in self.particles:
            self.update_best_position(particle)

    # 粒子群优化算法
    def optimize(self):
        for _ in range(self.iter_num):
            self.update_global_best()
            self.fitness_val_list.append(self.best_fitness_value)
            for particle in self.particles:
                self.update_particle(particle)
        return self.best_position, self.best_fitness_value, self.fitness_val_list

if __name__ == '__main__':
    load24 = np.array([1336.8, 821.8, 594.5, 575.4, 546.9, 745, 933.1, 514.1, 140, 67.1, 61, 118.7, 1241.8, 1102, 1009.8, 1239.7, 826, 136.4, 76.1, 112.3, 103.4, 81.4, 355.5, 1859.6])
    price24 = np.array([0.32, 0.32, 0.32, 0.32, 0.32, 0.32, 0.32, 0.32, 0.69, 1.13, 1.13, 1.13, 0.69, 0.69, 0.69, 0.69, 0.69, 1.13, 1.13, 1.13, 1.13, 1.13, 0.69, 0.32])
    pprice = 0.44
    efficiency = 1.0  # 系统效率
    loss = 0.01  # 变压器损耗
    penalty_factor = 0.1  # 惩罚系数

    pso = PSO(dim=24, size=10, iter_num=30000, max_charge=500, load=load24, price=price24, pprice=pprice,
              efficiency=efficiency, loss=loss, penalty_factor=penalty_factor, C1=2, C2=2, W=0.5)
    best_position, best_profit, fitness_val_list = pso.optimize()

    print("最优充电策略:", best_position)
    print("最优收益:", best_profit)

10万次迭代输出结果:
在这里插入图片描述

注;在充放电顺序24个时序过程中,这些粒子位置是一维数据,在逐个累加过程中,需要确保累加电量始终大于0,到最后放完电归零,其中,首个是充电大于零。

输出结果很不理想,欢迎讨论如何设计更合理。

5. 总结

粒子群优化算法通过模拟鸟群捕食行为中的信息共享和协作机制,实现了在解空间中从无序到有序的搜索过程。通过不断更新粒子的速度和位置,算法能够逐渐逼近问题的最优解。在实际应用中,粒子群优化算法已广泛应用于各种优化问题,如函数优化、机器学习参数调整等。通过合理设置算法参数和适应度函数,可以进一步提高算法的搜索效率和求解质量。

参考:

[1]. 爱学习的贝塔. 粒子群算法python(含例程代码与详解). CSDN博客. 2020.10

[2]. zadarmo_. 第二次培训之粒子群算法. CSDN博客. 2020.07

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【办公类-26-01】20240422 UIBOT网络教研(自动登录并退出多个账号,半自动半人工)

作品展示&#xff1a; 背景需求&#xff1a; 每学期有多次网络教研 因为我有历任搭档的进修编号和登录密码&#xff0c; 所以每次学习时&#xff0c;我会把历任搭档的任务也批量完成。 但是每次登录都要从EXCEL里复制一位老师的“进修编号”“密码”&#xff0c;还要点击多次…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…

53.基于微信小程序与SpringBoot的戏曲文化系统设计与实现(项目 + 论文)

项目介绍 本站采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的戏曲文化系统设计与实现管理工作系统化、规范化。 技术选型 后端:…

Aigtek功率放大器的工作特点有哪些方面

功率放大器是电子设备中常见的元器件&#xff0c;用于将输入信号的功率增加到所需的输出功率水平。它在各种应用中发挥着重要作用&#xff0c;如音频放大、射频信号处理、通信系统等。功率放大器具有以下几个工作特点&#xff1a; 放大功能&#xff1a;功率放大器主要的工作特点…

用户请求经过哪些处理(公网)

DNS服务器之间协作&#xff1a; 递归DNS查询&#xff1a;用户的请求首先发送到递归DNS服务器。 查询根DNS服务器&#xff1a;递归DNS服务器查询根DNS服务器&#xff0c;以找到管理.com顶级域的TLD DNS服务器。 查询TLD DNS服务器&#xff1a;根DNS服务器响应带有TLD DNS服务器…

深入Doris实时数仓:导入本地数据

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景不大同&#xff0c;没有一种通用的解决方…

【Java探索之旅】解密构造方法 对象初始化的关键一步

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、对象的构造及初始化1.1 构造方法1.2 构造方法的特性1.3 默认初始化1.4 就地初始化…

新手可以能做视频号小店,其实,视频号远没你想象中难!

大家好&#xff0c;我是电商花花。 最近注意到一个又一个新手小白提供视频号小店成功逆袭&#xff0c;实现了自己的创业梦想。 最近电商行业在飞速发展&#xff0c;越来越多的人开始关注视频号小店这个新兴的市场和平台。 有的新手拼命的往里扎&#xff0c;但是不少新手商家…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记&#xff1a; 事务的基本概念 事务 定义 用户定义的一个数据库操作系列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交&#xff0c;提交事务的所有操作 ROLLBACK 回滚&#xff0c…

UE5 GAS开发P35,36,37,38,39 将药水修改为AbilitySystem效果

这几节课都是将药水修改成更方便使用的AbilitySystem效果的Actor,分别为增加血量,增加蓝量,暂时获得最大生命值上限 AuraEffectActor.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #…

浅析Java的字符串的底层和相关知识(恳请大佬指正)

本期经验和建议的总结&#xff1a; 在拼接字符串的时候&#xff0c;如果大量拼接时建议使用StringBuilder&#xff0c;在转为字符串。 1&#xff1a;Java的号比较的原理&#xff1a; 在Java中&#xff0c;号在对基本数据类型进行比较时&#xff0c;比较的时具体的数值大小例…

【网络安全】跨站脚本攻击(XSS)

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、XSS简介 二、XSS漏洞危害 三、XSS漏洞类型 1.反射型XSS 2.存储型XSS 3.DOM型XSS 四、XSS漏洞防御 一、XSS简介 XSS&#xff08;Cross-Site Scripting&#xff09; XSS 被…

【认真白嫖】注册免费域名

一、eu.org官网 https://nic.eu.org/&#xff0c;始于1996年&#xff0c;对个人和组织是免费注册&#xff0c;页面还真有96年的风格&#xff0c;点进去注册就行。 二、注册 使用随机生成一个虚拟英国或者美国地址的网站&#xff0c;会提高通过的概率。 https://www.haoweic…

朴素贝叶斯算法分类

def loadDataSet():postingList[[my, dog, has, flea, problems, help, please], #切分的词条[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, posting, stupid, worthless, garbage],[mr, licks, ate, my, steak, …

微信小程序开发六(自定义组件)

自定义组件的创建&#xff1a; 如何创建&#xff1a; 右键选择新建component 创建完成之后需要打开app.json&#xff0c;这是全局使用这个组件&#xff0c;想要单独的页面使用&#xff0c;就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

为什么光电测径仪质量更稳定可靠?

光电测径仪与激光扫描式测径仪都是目前常用的外径自动化测量设备&#xff0c;他们能实现的功能相同&#xff0c;但为什么说光电测径仪更稳定可靠&#xff0c;下面一起来看一下。 光电测径仪测量原理 测头部件是测径仪的核心部件&#xff0c;它的作用是将被测物在CCD芯片上清晰…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段&#xff1a;创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说&#xff0c;发布版本的创建都需要一定的时间&#xff0c;其具体过程因各公司或组…

HarmonyOS开发案例:【闹钟】

介绍 使用后台代理提醒&#xff0c;实现一个简易闹钟。要求完成以下功能&#xff1a; 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表&#xff0c;并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 相关概念 [Canva…

翻译《The Old New Thing》 - Why are HANDLE return values so inconsistent?

Why are HANDLE return values so inconsistent? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040302-00/?p40443 Raymond Chen 2004年01月27日 简介 在处理 Windows 编程中的句柄时&#xff0c;开发者需要面对的一个挑战是不同函数可…

时间步长问题。tensorflow训练lstm时序模型,输出层实际输出维度和期待维度不一致

设置输出维度为1. Dense(1) 但结果跑出来的输出维度每次都是三维的。 模型设置&#xff1a; 输入x维度&#xff08;2250&#xff0c;48&#xff0c;2&#xff09; 输入y 维度&#xff08;2250&#xff0c;&#xff09; 和 &#xff08;2250&#xff0c;1&#xff09; 但模型预测…