mopso算法代码程序_micro:bit图形化编程入门4——算法与程序流程

开始

你好啊!欢迎来到《micro:bit图形化编程入门》系列文章。在计算机领域中,流行着“程序=数据结构+算法”这样一个公式,看上去虽然有些绝对,但也表明了数据结构和算法在程序设计中的核心地位。上节课中,我们知道了如何在程序中使用变量来处理数据,今天就让我们一起走进算法的世界吧!

任务1:农夫过河

为了更好地理解算法的概念,先来看一个经典的问题——农夫过河。故事说的是农夫赶集买回了两只羊和一只狗,狗很凶,没有农夫不在时就会咬羊。半路上遇到一条河,河上只有一条小船,农夫每次只能带走一只羊或一只狗过河。问:农夫怎样才能把狗和羊都送过河去,并且不让狗咬到羊?

442758714e89a74a91e8e2cb065bfc24.png

农夫过河问题

动脑思考一下,用笔画一画,相信你一定能得出正确答案。反思一下求解过程,要想得到这个相对复杂问题的解法,我们需要将问题分解为若干个步骤,让每个步骤都满足问题的限定条件,最终将这些步骤按顺序组合到一起,就得到了一个准确而完整的解题方案了。而这个解题方案,就是算法

算法的概念

算法(Algorithm)是指解题的步骤。例如下图中求解二元一次方程组的过程,也是一种算法,只不过它使用数学语言来描述。

7ff59d90fa58a8543a47559979abe620.png

解方程

程序设计中,算法最终要使用计算机能看得懂的语言来描述,从而利用计算机的强大功能帮助我们来解决问题。例如下图,是上节课中我们用MakeCode图形化编程语言来实现电子记分牌功能的程序代码。

db02dd45ad1f0de122946331ce4c7588.png

记分牌

任务2:micro:bit跳舞机

接下来,让我们通过一个案例来学习如何设计算法,并最终将算法转换为可执行的程序代码。

2-1 问题定义

使用micro:bit来制作一款跳舞机,相信很多同学都见过或者体验过跳舞机,如下图所示是一种家用跳舞机,你能分析一下跳舞机的玩法吗?

55dcb5c60ee1e5cd710df78145d32e5b.gif

跳舞机产品

2-2 功能分析

跳舞机的种类丰富多样,功能上也会略有不同,你可以试着分析一下你所玩过的跳舞机的玩法,为了方便使用micro:bit实现,这里将跳舞机的玩法定义如下:

  1. 屏幕上循环显示指向不同方向的箭头;
  2. 玩家识别箭头方向,踩下跳舞机的方向按键;
  3. 如果方向一致则得分,如果踩错或者不踩则减少机会次数(共3次机会);
  4. 机会次数减少为0时,游戏结束并显示得分。

2-3 流程图绘制

完成了对跳舞机的功能分析,接下来我们是不是就可以进行编程了呢?答案通常是不行的。上面我们所进行的分析也是解决问题的算法,但使用自然语言描述的算法过于抽象,或者说概括,很难直接翻译成计算机看得懂的代码。因此,在解决较为复杂的问题时,往往需要将对功能的分析进一步细化绘制成为流程图,再对照流程图来进行编程。

9b8ae339acd98487ce8b35e88c85bca5.png

跳舞机流程图

上面就是micro:bi跳舞机的流程图了,流程图比较长,可以与功能分析中的内容对照着来读。仔细观察发现流程图中包含几种不同形状的图形,不同图形所代表的意义如下图所示。与自然语言相比,使用流程图来描述算法更加具体、直观,每一个方框中的内容都可以翻译成为一两条程序语句,而将这些程序语句按照流程图中流程线所示的顺序组合起来,就可以得到一段相对完整的程序代码了。

299a0b6d6b8284f672fe16b64c8decf4.png

流程图中的形状元素

2-4 基本结构

在上述流程图中,可以找到程序设计的三种基本结构:顺序结构、分支结构和循环结构。顺序结构就是最简单的从上到下依次执行每一条语句;分支结构也叫选择结构,根据是否满足判断条件程序会执行不同的语句,例如在跳舞机流程图中,我们使用分支结构来判断显示箭头的方向,以及显示方向与操作方向是否一致等等;循环结构中,如果满足条件则反复执行循环体中的语句,直到不满足条件时跳出循环,执行后面的语句,例如在上面的流程图中,我们反复执行游戏主体,直到失败次数达到三次出循环结束游戏。找出流程图中的结构类型后,就可以使用相应的条件分支语句或循环语句来实现代码的流程控制逻辑了。

4963eaaf5527eecd5f27f850a30dd945.png

三种基本结构

2-5 编写代码并调试程序

在完成了算法的设计工作之后,就可以开始编写程序了。大家在刚开始学习编程的时候,建议要先将整个问题分解为若干个部分,例如在跳舞机流程图中,我们将整个算法分解为:初始化、随机显示方向、玩家操作方向、比较二者是否一致、以及判断游戏结束显示得分等五个部分。按照设计依次完成每一部分的编程,就可以避免出现面对复杂问题时无从下手的尴尬局面。程序编写完成之后,一般还需要进行反复的修改调试,最终才能实现我们所需的功能。

d3ecf686408b16a717ca8818e2158b28.png

microbit跳舞机程序

总结

在本节课中,我们了解了算法的概念,并以micro:bit跳舞机任务为例,学习了如何一步一步地定义问题、分析功能、设计算法、编写程序。相信经过不断的练习,你也可以独立设计实现一个完整的软件项目。

最后,再让我们通过习题来回顾一下今天所学的知识吧!

  1. 算法是指解题的(        ),在计算机科学中,算法要用(        )来描述。
  2. 程序流程图中的基本元素形状有哪些?
  3. 程序流程中的三种基本结构分别是:(        )  、(        )  和 (        )。
  4. 同学们在生活学习的过程中遇到复杂问题时,也不妨尝试运用流程图来分析解决问题!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Python的MOPSO算法代码程序,供您参考: ```python import random import math class Particle: def __init__(self, num_dimensions): self.num_dimensions = num_dimensions self.position = [random.uniform(0, 1) for _ in range(num_dimensions)] self.velocity = [random.uniform(0, 1) for _ in range(num_dimensions)] self.best_position = list(self.position) self.best_fitness = float('inf') self.fitness = float('inf') self.crowding_distance = 0 def update_velocity(self, global_best_position, inertia_weight, cognitive_weight, social_weight): for i in range(self.num_dimensions): r1 = random.uniform(0, 1) r2 = random.uniform(0, 1) cognitive_component = cognitive_weight * r1 * (self.best_position[i] - self.position[i]) social_component = social_weight * r2 * (global_best_position[i] - self.position[i]) self.velocity[i] = inertia_weight * self.velocity[i] + cognitive_component + social_component def update_position(self, bounds): for i in range(self.num_dimensions): self.position[i] += self.velocity[i] if self.position[i] > bounds[i][1]: self.position[i] = bounds[i][1] self.velocity[i] = 0 elif self.position[i] < bounds[i][0]: self.position[i] = bounds[i][0] self.velocity[i] = 0 def evaluate_fitness(self, objective_function): self.fitness = objective_function(self.position) if self.fitness < self.best_fitness: self.best_fitness = self.fitness self.best_position = list(self.position) class MOPSO: def __init__(self, objective_function, num_particles, num_iterations, num_dimensions, bounds, inertia_weight, cognitive_weight, social_weight): self.objective_function = objective_function self.num_particles = num_particles self.num_iterations = num_iterations self.num_dimensions = num_dimensions self.bounds = bounds self.inertia_weight = inertia_weight self.cognitive_weight = cognitive_weight self.social_weight = social_weight self.global_best_position = [random.uniform(bounds[i][0], bounds[i][1]) for i in range(num_dimensions)] self.global_best_fitness = float('inf') self.particles = [Particle(num_dimensions) for _ in range(num_particles)] def run(self): for i in range(self.num_iterations): for particle in self.particles: particle.update_velocity(self.global_best_position, self.inertia_weight, self.cognitive_weight, self.social_weight) particle.update_position(self.bounds) particle.evaluate_fitness(self.objective_function) if particle.fitness < self.global_best_fitness: self.global_best_fitness = particle.fitness self.global_best_position = list(particle.position) fronts = self.fast_non_dominated_sort(self.particles) for i, front in enumerate(fronts): self.calculate_crowding_distance(front) self.particles.sort(key=lambda particle: particle.crowding_distance, reverse=True) self.particles = self.particles[:self.num_particles] if len(self.particles) == self.num_particles: break return self.global_best_position, self.global_best_fitness def fast_non_dominated_sort(self, particles): fronts = [] remaining_particles = list(particles) while len(remaining_particles) > 0: front = [] for particle in remaining_particles: particle.domination_count = 0 particle.dominated_particles = [] for other_particle in remaining_particles: if particle == other_particle: continue if self.dominates(particle, other_particle): particle.dominated_particles.append(other_particle) elif self.dominates(other_particle, particle): particle.domination_count += 1 if particle.domination_count == 0: front.append(particle) fronts.append(front) for particle in front: remaining_particles.remove(particle) return fronts def dominates(self, particle1, particle2): for i in range(self.num_dimensions): if particle1.fitness[i] > particle2.fitness[i]: return False return True def calculate_crowding_distance(self, particles): num_particles = len(particles) for particle in particles: particle.crowding_distance = 0 for i in range(self.num_dimensions): particles.sort(key=lambda particle: particle.fitness[i]) particles[0].crowding_distance = float('inf') particles[num_particles - 1].crowding_distance = float('inf') fitness_range = particles[num_particles - 1].fitness[i] - particles[0].fitness[i] for j in range(1, num_particles - 1): distance = particles[j + 1].fitness[i] - particles[j - 1].fitness[i] particles[j].crowding_distance += distance / fitness_range ``` 这段程序是一个基于Python的MOPSO算法实现,包括一个粒子类和一个MOPSO类。程序实现了多目标优化问题的求解,其中使用了快速非支配排序和拥挤距离计算等技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值