python_类鸟群:仿真鸟群

import sys, argparse
import math
from turtledemo.clock import tick, main

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy.spatial.distance import squareform, pdist, cdist
from numpy.linalg import norm

width, height = 640, 480  # 设置屏幕窗口的宽度和高度


class Boids:
    """class that represents Boids simulation"""

    def __init__(self, N):
        """initital the Boids simulation"""
        # initital position and velocities
        self.pos = [width / 2.0, height / 2.0] + 10 * np.random.rand(2 * N).reshape(N, 2)
        # normalized random velocities
        angles = 2 * math.pi * np.random.rand(N)
        self.vel = np.array(list(zip(np.sin(angles), np.cos(angles))))
        self.N = N
        # minimum distance of approach
        self.minDist = 25.0
        # maximum magnitude of velocities calculated by 'rules'
        self.maxRuleVel = 0.03
        # maximum magnitude of the final velocity
        self.maxVel = 2.0

    def tick(self, frameNum, pts, beak):
        """Update the simulation by one time step."""
        # get pairwise distances
        self.distMatrix = squareform(pdist(self.pos))
        # apply rules:
        self.vel += self.applyRules()
        self.limit(self.vel, self.maxVel)
        self.pos += self.vel
        self.applyBC()
        # Update data
        pts.ser_data(self.pos.reshape(2 * self.N)[::2],
                     self.pos.reshape(2 * self.N)[::2])
        vec = self.pos + 0 * self.vel / self.maxVel
        beak.set_data(vec.reshape(2 * self.N)[::2],
                      vec.reshape(2 * self.N)[::2])

    def limitVec(self, vec, maxVal):
        """Limit the magnitide of the 20 vector"""
        mag = norm(vec)
        if mag > maxVal:
            vec[0], vec[1] = vec[0] * maxVal / mag, vec[1] * maxVal / mag

    def limit(self, X, maxVal):
        """Limit the magnitide of the 2D vectors in array X to maxValue"""
        for vec in X:
            self.limitVec(vec, maxVal)

    def applyBC(self):
        """apply boundary conditions"""  # 设置边界条件
        deltaR = 2.0
        for coord in self.pos:
            if coord[0] > width + deltaR:
                coord[0] = - deltaR
            if coord[0] < - width + deltaR:
                coord[0] = width + deltaR
            if coord[1] > height + deltaR:
                coord[1] = - deltaR
            if coord[1] < - deltaR:
                coord[1] = height + deltaR

    def applyRules(self):
        # apply rule #1: Separation
        D = self.distMatrix < 25.0
        vel = self.pos * D.sum(axis=1).reshape(self.N, 1).D.dot(self.pos)
        self.limit(vel, self.maxRuleVel)

        # distance threshold for alignment (different from separation)
        D = self.distMatrix < 50.0

        # apply rule #2:Alignment
        vel2 = D.dot(self.vel)
        self.limit(vel2, self.maxRuleVel)
        vel += vel2

        # apply rule #3: Cohesion
        vel3 = D.dot(self.pos) - self.pos
        self.limit(vel3, self.maxRuleVel)
        vel += vel3

        return vel

    def buttonPress(self, event):
        """event handler for matplotlib button presses"""
        # left-click to add a boid
        if event.botton is 1:
            self.pos = np.concatenate((self.pos, np.array([[event.xdata, event.ydata]])), axis=0)

            # generate a random velocity
            angles = 2 * math.pi * np.random.rand(1)
            v = np.array(list(zip(np.sin(angles), np.cos(angles))))
            self.vel = np.concatenate((self.vel, v), axis=0)
            self.N += 1
        # right.click to scatter boids
        elif event.botton is 3:
            # add scattering velocity
            self.vel += 0.1 * (self.pos - np.array([[event.xdata, event.ydata]]))

    def tick(frameNum, pts, beak, boids):
        # print frameNum
        """Update function for animation"""
        boids.tick(frameNum, pts, beak)
        return pts, beak

    # main() function
    def main(self):
        # use sys.argv if needed
        print('starting boids...')

        parser = argparse.ArgumentParser(description="Implementing Craig Reynold's Boids...")

        # add arguments
        parser.add_argument('---num-boids', dest='N', required=False)
        args = parser.parse_args()

        # set the initial number of boids
        N = 100
        if args.N:
            N = int(args.N)

        # creat boids
        boids = Boids(N)

        # set up plot
        fig = plt.figure()
        ax = plt.axes(xlim=(0, width), ylim=(0, height))

        pts, = ax.plot([], [], markersize=10, c='k', marker='o', ls='None')
        beak, = ax.plot([], [], markersize=4, c='r', marker='o', ls='None')
        anim = animation.FuncAnimation(fig, tick, fargs=(pts, beak, boids), interval=50)

        # add a *button press*event handler
        cid = fig.canvas.mpl_connect('button_press_event', boids.buttonPress)

        plt.show()


# call main
if __name__ == '_main__':
    main()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
麻雀搜索算法(Swarm Intelligence Algorithm, SIA)是一种模拟自然界鸟觅食行为的优化算法,它结合了种群智能的特点,如鸟群觅食、飞行和信息交流。在MATLAB中实现麻雀搜索算法的改进策略通常会涉及以下几个步骤: 1. 初始化种群:创建一组随机解作为初始搜索点,代表鸟的位置。 2. 基本操作: - **位置更新**:每个鸟的位置根据当前速度和食物源(目标函数)进行更新,可能涉及随机漫步、认知地图等。 - **速度更新**:根据个体性能(如食物丰富度)调整飞行速度,可能包括领航者跟随、随机变异等。 - **领导权选择**:评估个体表现,选择最优鸟作为领导者,更新搜索策略。 3. **群体协作**:鸟之间通过信息交换(如位置和食物源信息)来协同搜索,这可能涉及到局部搜索和全局搜索的平衡。 4. **进化策略**:可能会引入一些进化策略,如遗传算法元素,例如交叉(crossover)、变异(mutation)和适应度函数,用于生成新解并淘汰较差个体。 5. **迭代过程**:重复执行上述步骤,直到达到预设的迭代次数或找到满意的解。 6. **代码示例**: ```matlab function [solution, fitness] = improved_sia(population, n_iterations, func) % 初始化参数 ... % 基础麻雀搜索算法 for iter = 1:n_iterations % 更新位置和速度 positions = updatePositions(positions, velocities, func); % 领导者更新和群体协作 ... % 适应度评估和选择 ... % 进化策略 ... end % 返回最优解和适应度值 solution = bestSolution; fitness = bestFitness; end % 辅助函数 function newPositions = updatePositions(oldPositions, oldVelocities, func) % 实现位置和速度的更新逻辑 ... end % 可能的进化策略 function evolvedPop = evolvePopulation(population, mutationRate) % 进行交叉、变异等操作 ... end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w要变强

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值