手推粒子群算法,并求最大值(单目标函数和多目标函数)

本文介绍了使用Python实现的粒子群优化算法,分别处理单目标函数和多目标函数求解,通过迭代更新粒子位置和速度寻找最优解。
摘要由CSDN通过智能技术生成

单目标函数

import random


# 定义适应度函数
def fitness_function(position):
    x = position[0]
    return -(x ** 2 - 4 * x + 4)  # 求反 PSO 以求最大值


class Particle:
    def __init__(self, position):
        self.position = position
        self.velocity = [random.uniform(-1, 1) for _ in range(len(position))]
        self.best_position = position
        self.best_fitness = fitness_function(position)


# 粒子群优化功能
def particle_swarm_optimization(pop_size, num_generations, inertia_weight, cognitive_weight, social_weight, lower_bound,
                                upper_bound):
    particles = [Particle([random.uniform(lower_bound, upper_bound)]) for _ in range(pop_size)]
    global_best_position = particles[0].position
    global_best_fitness = particles[0].best_fitness

    for generation in range(num_generations):
        for particle in particles:
            # 更新粒子速度和位置
            for i in range(len(particle.position)):
                r1 = random.random()
                r2 = random.random()
                cognitive_component = cognitive_weight * r1 * (particle.best_position[i] - particle.position[i])
                social_component = social_weight * r2 * (global_best_position[i] - particle.position[i])
                particle.velocity[i] = inertia_weight * particle.velocity[i] + cognitive_component + social_component
                particle.position[i] += particle.velocity[i]

            # 更新粒子最佳位置和适应度
            fitness = fitness_function(particle.position)
            if fitness > particle.best_fitness:
                particle.best_position = particle.position
                particle.best_fitness = fitness

            # 更新全局最佳位置和适应度
            if fitness > global_best_fitness:
                global_best_position = particle.position
                global_best_fitness = fitness

    return global_best_position, -global_best_fitness


if __name__ == "__main__":
    pop_size = 50
    num_generations = 100
    inertia_weight = 0.7
    cognitive_weight = 1.4
    social_weight = 1.4
    lower_bound = -10
    upper_bound = 10

    best_position, best_fitness = particle_swarm_optimization(pop_size, num_generations, inertia_weight,
                                                              cognitive_weight, social_weight, lower_bound, upper_bound)

    print("Best position:", best_position)
    print("Best fitness:", best_fitness)

多目标函数

import random
import time

import numpy as np


# 多目标函数,我们需要优化的函数,求解该函数的最小值
def objective_function(x):
    return x[0] ** 2 + x[1] ** 2


# 粒子类
class Particle:
    def __init__(self, bounds):
        self.bounds = bounds  # 粒子的位置范围
        # 初始化粒子的位置
        self.position = np.array([random.uniform(bounds[i][0], bounds[i][1]) for i in range(len(bounds))])
        self.velocity = np.array([0.0 for _ in range(len(bounds))])  # 初始化粒子的速度
        self.best_position = self.position.copy()  # 粒子的最佳位置
        self.best_value = float('inf')  # 粒子的最佳值

    def update(self, global_best):
        # 参数设置
        w = 0.5  # 惯性权重
        c1 = 1  # 个体学习因子
        c2 = 2  # 社会学习因子
        v_max = 5  # 最大速度

        # 更新速度
        self.velocity = w * self.velocity + c1 * random.random() * (
                self.best_position - self.position) + c2 * random.random() * (global_best - self.position)

        # 限制速度,防止速度过大
        self.velocity = np.clip(self.velocity, -v_max, v_max)

        # 更新位置
        self.position += self.velocity

        # 确保粒子的位置在范围内
        self.position = np.clip(self.position, [b[0] for b in self.bounds], [b[1] for b in self.bounds])

        # 更新个体最优
        current_value = objective_function(self.position)
        if current_value < self.best_value:
            self.best_position = self.position.copy()
            self.best_value = current_value


# PSO算法
def particle_swarm_optimization(num_particles, bounds, num_iterations):
    particles = [Particle(bounds) for _ in range(num_particles)]  # 初始化粒子群
    global_best = np.array([float('inf'), float('inf')])  # 全局最佳位置
    global_best_value = float('inf')  # 全局最佳值

    for _ in range(num_iterations):
        for particle in particles:
            particle.update(global_best)

            # 更新全局最优
            if particle.best_value < global_best_value:
                global_best = particle.best_position.copy()
                global_best_value = particle.best_value

    return global_best, global_best_value


start_time = time.time()
# 使用示例
bounds = [(-10, 10), (-10, 10)]  # x和y的范围
best_position, best_value = particle_swarm_optimization(1000, bounds, 100)
print(f"最佳位置: {best_position}, 最佳值: {best_value}")
end_time = time.time()
print(f"函数执行时间为: {end_time - start_time} 秒")
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当设计手推磨3D打印模型时,我们需要考虑以下几个步骤: 1. 收集参考资料:在开始设计之前,我们应该收集一些关于手推磨的参考资料。这包括磨盘、磨轮、手柄等部分的形状和尺寸。 2. 绘制草图:根据收集到的参考资料,我们可以使用计算机辅助设计(CAD)软件或手绘草图来绘制手推磨的外观和细节。在绘制草图时,要确保考虑到易用性、人体工程学和功能性等因素。 3. 创建3D模型:根据草图,我们可以使用CAD软件将其转换为3D模型。在创建模型时,可以使用不同的工具和功能,如拉伸、旋转、放样等来构建各个部分。 4. 添加细节:一旦基本形状完成,我们可以添加一些细节来增加模型的真实感和美观性。这包括添加螺纹、刻纹、标识等。 5. 进行测试和修正:在完成3D模型之后,我们可以使用3D打印软件进行预览,并确保模型的尺寸和比例正确。如果需要,可以进行一些调整和修正。 6. 导出为3D打印文件:一旦模型满足我们的要求,我们可以将其导出为3D打印文件格式,如STL或OBJ。 7. 准备3D打印:在将文件导出后,我们需要准备3D打印机进行打印。这包括选择合适的打印材料、调整打印参数和设置支撑结构等。 8. 进行3D打印:将准备好的3D模型文件加载到3D打印机中,并启动打印过程。在打印过程中,需要确保打印机正常运行,并监控打印质量。 9. 清洁和后处理:当打印完成后,我们需要将模型从打印床上取下,并进行清洁和后处理。这包括去除支撑结构、修剪边缘、砂纸打磨等。 10. 完成模型:最后,我们可以对模型进行上色、上漆或其他装饰,以增加其美观性和逼真度。 以上是设计手推磨3D打印模型的基本过程。具体的设计步骤和方法可能因个人偏好和软件工具而有所不同,但总体思路是相似的。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值