群体智能算法-黏菌寻找食物最优路线行为模拟 2

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

经过查找一些资料,发现目前比较好的理论支撑有元胞自动机,其中的分形理论中的扩散限制凝聚模型与黏菌的网络比较贴切。 经过反复的调整。现在购机了一个黏菌的网络。如图: 第一个图为模拟的过程 第二图为最终图的放大

其中依然有有几个假设 1、黏菌的生命力,随着扩展,生命力降低 2、随着扩展完之后,黏菌在整个扩展范围内,随机生成一些感触点,然后感触点生成网络      感触点的生长原则,则是最大可能从生命力低的地方向生命力高的地方生长,直至生长到了有网络的地方,或者是黏菌的核心。 不足的地方: 在模拟行为中采用的是元胞为小方块,所以会出现图中的一些对角线的直线。 备注: 其中图片采用的是jpg,为200*200像素。加载的是一个全白的图片,后面的黑点为程序模拟出来的 源码如下

package main
import (
"fmt"
"image"
"image/jpeg"
// "io"
"image/color"
"math/rand"
"os"
"path"
"runtime"
"sync"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
for {
select {}
}
}
var max_x int = 200
var max_y int = 200
var lock *sync.RWMutex
var im image.Image
var AllPart []Parts
var wg *sync.WaitGroup
type Parts []*Part
type Part struct {
x      int
y      int
en     int
black  bool
walked bool
}
func NewPart(x, y int) *Part {
p := Part{x, y, 0, false, false}
return &p
}
func initImage() error {
f, err := os.Open("200.jpg")
if err != nil {
fmt.Println(err)
return err
}
defer f.Close()
im, err = jpeg.Decode(f)
if err != nil {
fmt.Println(err)
return err
}
return nil
}
func Print() {
tick := time.Tick(1 * time.Second)
count := 1
for {
select {
case <-tick:
func() {
p := path.Join("./worm", fmt.Sprintf("%d.jpg", count))
lock.Lock()
f, _ := os.OpenFile(p, os.O_RDWR|os.O_CREATE, 0x666)
jpeg.Encode(f, im, nil)
f.Close()
lock.Unlock()
count++
}()
}
}
}
func init() {
initImage()
wg = &sync.WaitGroup{}
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[max_y/2][max_x/2].en = 200
AllPart[max_y/2][max_x/2].black = true
AllPart[max_y/2][max_x/2].walked = true
SetBlack(max_x/2, max_y/2)
for i := 0; i < 500; i++ {
rand.Seed(rand.Int63())
y1 := int(rand.Int31()) % max_y
x1 := int(rand.Int31()) % max_x
if x1 == max_x/2 && y1 == max_y/2 {
continue
}
AllPart[y1][x1].black = true
SetBlack(x1, y1)
}
for y := 0; y < max_y; y++ {
for x := 0; x < max_x; x++ {
wg.Add(1)
}
}
for y := 0; y < max_y; y++ {
for x := 0; x < max_x; x++ {
go AllPart[y][x].run()
}
}
go Print()
}
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 SetBlack(x, y int) {
p := im.(*image.YCbCr)
if !(image.Point{x, y}.In(p.Rect)) {
return
}
yi := p.YOffset(x, y)
ci := p.COffset(x, y)
p.Y[yi], p.Cb[ci], p.Cr[ci] = color.RGBToYCbCr(0, 0, 0)
}
func (p *Part) run() {
wg.Done()
wg.Wait()
tick := time.Tick(1 * time.Second)
for {
select {
case <-tick:
if p.walked {
return
}
func() {
other := make(map[*Part]int)
max_node := 0
otherblack := 0
getmax := func(xi, yi int) {
en := getEn(xi, yi)
if en > 0 {
other[AllPart[yi][xi]] = en
if AllPart[yi][xi].black {
otherblack++
}
}
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 p.en == 0 {
if max_node > 0 {
p.en = max_node - 1
}
return
}
if p.black {
//maxwalk
ensum := 0
havewalked := 0
nextother := make(map[*Part]int)
for np, en := range other {
if en > p.en {
nextother[np] = en
ensum += en
if np.walked {
havewalked++
}
}
}
if len(nextother) <= 1 {
for np, en := range other {
if en == p.en {
nextother[np] = en
ensum += en
if np.walked {
havewalked++
}
}
}
}
if len(nextother) == 0 {
for np, en := range other {
if en < p.en {
nextother[np] = en
ensum += en
if np.walked {
havewalked++
}
}
}
}
if havewalked > 0 {
p.walked = true
return
}
if ensum > 0 {
rand.Seed(rand.Int63())
rn := int(rand.Int31()) % ensum
for np, _ := range nextother {
rn = rn - np.en
if rn <= 0 {
np.black = true
SetBlack(np.x, np.y)
p.walked = true
return
}
}
}
}
}()
}
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

你的代码糟粕比精华要多得多

你的代码糟粕比精华要多得多 新的研究发现,一个程序的核心功能仅在于一小部分封装的代码。 如果你是一个软件开发人员,有人问你,你写的代码中有多少是真正在实现实际...

2475
来自专栏CDA数据分析师

R语言的好与坏丨讲座中字视频丨附讲座PDF

R是一种用于分析数据的领域特定语言。为什么数据分析需要自己的领域特定语言(DSL) ? R语言擅长些什么,不擅长什么?开发人员该如何利用R语言的优势并减轻其弱点...

2209
来自专栏华章科技

人生苦短,为什么我要用Python?

导读:随着机器学习的兴起,Python 逐步成为了「最受欢迎」的语言。它简单易用、逻辑明确并拥有海量的扩展包,因此其不仅成为机器学习与数据科学的首选语言,同时在...

341
来自专栏数据小魔方

仪表盘图表

很抱歉最近几天骨折忙考试,连着四天都没有自己写教程了,不过为了不辜负大家对小魔方的期待,我也是精挑细选从哪些活跃的PPT达人那里转载了几篇关于PPT图文排版的帖...

3525
来自专栏数据小魔方

创意玫瑰图(Rose chart)

今天跟大家分享的图表是创意玫瑰图! ▽▼▽ 这种图表形似玫瑰,故而得名,其效果与我们常用的饼图,圆环图及雷达图类似。 ? 可以反映数据结构的比例、大小,但因其形...

35710
来自专栏Spark学习技巧

第1篇:数据库需求与ER建模

数据库需求与ER建模 前言 在数据库建设过程中,哪一步最重要?绝大多数资料会告诉你,是需求分析阶段。这一步的好坏甚至直接决定数据库项目的成败。 需求分析阶段,也...

3847
来自专栏跨界架构师

[译文]Domain Driven Design Reference(四)—— 柔性设计

  要让一个项目加速发展,而不是被其自身的历史包袱所拖累,需要一个能与之良好协作的设计,它会带来改变。一个柔性设计。

702
来自专栏二进制文集

吐槽下《MongoDB 实战》(第二版)的翻译

最近在研究 Mongo,买了华中科技大学出版社的《MongoDB 实战》第二版,但是在看了一个小时后就发现,全书的翻译满满的槽点,不吐不快。

593
来自专栏walterlv - 吕毅的博客

WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则

发布于 2018-05-05 07:43 更新于 2018-08...

401
来自专栏积累沉淀

ActionScript 3.0 概要

翻译:衡-----------蓝色理想——经典论坛 --- 类型:转载 ActionScript 3.0 演变成一门强大的面向对象的编程语言意味着flash平台...

1785

扫码关注云+社区