群体智能算法-黏菌寻找食物最优路线行为模拟
时间:2022-05-03
本文章向大家介绍群体智能算法-黏菌寻找食物最优路线行为模拟,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
昨天看了一个视频(http://www.tudou.com/programs/view/4QmfLMMBZBg) 讲的就是黏菌 寻找食物时候会构造一个强大的网络。
如下图
通过对黏菌行为的观察。我想通过一个分布式的群体算法来模拟黏菌的行为,来实现最优路径的寻找。
目前实现了简单的行为模拟。 主要有两个方面
1、黏菌的扩张行为。
首先定义了一个生命力值来模拟。在黏菌的位置,生命力是最强的。随着黏菌的扩张,扩张的边缘的生命力会递减。黏菌会不断的扩张。
2、食物的获取
在这里假设,黏菌的扩张部分只能吸收食物,但不能将食物转换成能量。犹如人体一样,只有胃能够消化食物,将食物转换成能量供人体吸收。
假设黏菌的核心才能将食物转换成能量,其他部分只能是吸收传递能量。
那么表现为能量的传输为从生命力低的地方传送到生命力高的地方,也就只有在黏菌的初始位置。
程序模拟
1、黏菌的各个部分只能从其周围的部分获取到信息。也只能与周围的部分进行信息交流,以及食物的传递。
目前只简单的用数组来演示。没有做界面演示。
首先说明下 数组中的含义【生命力,食物含量,食物传送数量统计】
其中黏菌的初始位置在【10,0,0】处,食物防在图中的【0,5000,0】
源代码如下
package main
import (
"fmt"
"sync"
"time"
)
func main() {
for {
select {}
}
}
var max_x int = 10
var max_y int = 10
var AllPart []Parts
type Parts []*Part
var lock *sync.RWMutex
func Print() {
tick := time.Tick(1 * time.Second)
for {
select {
case <-tick:
fmt.Println("-------------------------------------------------")
lock.Lock()
for y := 0; y < max_y; y++ {
for x := 0; x < max_x; x++ {
fmt.Printf("%d,%d,%dt", AllPart[y][x].en, AllPart[y][x].food, AllPart[y][x].countfood)
}
fmt.Println()
}
lock.Unlock()
}
}
}
func init() {
lock = &sync.RWMutex{}
AllPart = make([]Parts, max_y, max_y)
for y := 0; y < max_y; y++ {
AllPart[y] = Parts(make([]*Part, max_x, max_x))
}
for y := 0; y < max_y; y++ {
for x := 0; x < max_x; x++ {
AllPart[y][x] = NewPart(x, y)
}
}
AllPart[8][3].en = 10
AllPart[8][3].ismother = true
AllPart[3][8].food = 5000
AllPart[3][8].isfood = true
for y := 0; y < max_y; y++ {
for x := 0; x < max_x; x++ {
go AllPart[y][x].run()
}
}
go Print()
}
type Part struct {
x int
y int
en int
food int
countfood int
ismother bool
isfood bool
}
func NewPart(x, y int) *Part {
p := Part{x, y, 0, 0, 0, false, false}
return &p
}
func getEn(x, y int) int {
if x < 0 || y < 0 {
return -1
}
if x >= max_x || y >= max_y {
return -1
}
return AllPart[y][x].en
}
func (p *Part) run() {
tick := time.Tick(1 * time.Second)
for !p.ismother {
select {
case <-tick:
func() {
lock.RLock()
defer lock.RUnlock()
max_node := 0
maxcount := 0
other := make(map[*Part]int)
getmax := func(xi, yi int) {
en := getEn(xi, yi)
if en > p.en {
maxcount++
other[AllPart[yi][xi]] = en
}
if en > max_node {
max_node = en
}
}
getmax(p.x-1, p.y-1)
getmax(p.x, p.y-1)
getmax(p.x+1, p.y-1)
getmax(p.x-1, p.y)
getmax(p.x+1, p.y)
getmax(p.x-1, p.y+1)
getmax(p.x, p.y+1)
getmax(p.x+1, p.y+1)
if max_node > p.en {
p.en = max_node - 1
}
if p.en == 0 || p.food <= 0 || maxcount <= 0 {
return
}
food := p.food
if p.isfood {
food = 8
}
avf := food / maxcount
for k, _ := range other {
k.food += avf
p.countfood += avf
p.food -= avf
}
}()
}
}
}
- SSH【史上最详细整合】
- Github 项目推荐 | TensorFlow 项目模板架构最佳实践
- 两个死锁的实例 (r5笔记第90天)
- SSM【史上最详细整合】
- 终结 finalize()和垃圾回收(garbage collection)
- 代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN
- 【SSH测试整合Demo】企业人事管理系统
- Hybris 项目工程配置
- 购物车案例【简单版】
- 再学习之MyBatis.
- 用户登陆注册【JDBC版】
- 学习思考之《编程之美》.
- 干货 | 深度剖析服务发现组件Netflix Eureka
- 多线程编程学习一(Java多线程的基础).
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 起飞 | 应用YOLOV4 - DeepSort 实现目标跟踪
- 如何将elastic search 的健康状态由红色red变为绿色green
- 拥抱K8s系列-01
- elastic search 修改日志级别为warn
- prometheus学习笔记(3)-使用exporter监控mysql
- elasticsearch query里面的slop选项
- 彻底明白Android设计模式—(动态)代理模式
- elastic search 如何将yellow 状态变为green健康状态
- All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
- Failed to instantiate org.mybatis.spring.SqlSessionTemplate Constructor threw exception
- 护网之Linux应急处理操作手册
- 对新版安全狗学习
- redis key的删除策略及LRU的实现
- 护网Linux应急处置操作手册-Tools篇
- 加密,编码三问