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

来源:互联网 发布:陕西广电网络微信缴费 编辑:程序博客网 时间:2024/06/02 13:07
经过查找一些资料,发现目前比较好的理论支撑有元胞自动机,其中的分形理论中的扩散限制凝聚模型与黏菌的网络比较贴切。

经过反复的调整。现在购机了一个黏菌的网络。如图:
第一个图为模拟的过程
第二图为最终图的放大



其中依然有有几个假设
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
}
}
}

}
}()
}
}
}


 龚浩华

qq 29185807 月牙寂
2015年4月1日 
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车玻璃水冻住了怎么办 车里玻璃水冻了怎么办 做现货亏了60万怎么办 宿舍太吵晚上睡不着觉怎么办 脚扎了钉子肿了怎么办 龙血树叶子下垂怎么办 龙血树叶子卷曲怎么办 3岁宝宝长期便秘怎么办 4岁小儿便秘严重怎么办 3岁宝宝便秘严重怎么办 3岁宝宝一直便秘怎么办 11个月宝宝便秘怎么办 2个月的宝宝便秘怎么办 宝宝便秘拉不下来怎么办 5一6岁儿童便秘怎么办 3个月宝宝便秘怎么办 8个月宝宝便秘怎么办 孕5个月咳嗽厉害怎么办 孕8个月咳嗽厉害怎么办 拆石膏后关节僵硬怎么办 宝宝的小腿不直怎么办 鸡咳嗽有痰呼噜怎么办 风热感冒怎么办小窍门 吃完虾喝了牛奶怎么办 三文鱼头汤腥怎么办 晚上咳嗽厉害怎么办睡不着觉 刚怀孕发烧39度怎么办 刚怀孕发烧38度怎么办 怀孕10天发烧了怎么办 怀孕2个月发烧了怎么办 lol误封3年怎么办 心悦会员到期了怎么办 心悦游戏家到期怎么办 无间鬼后运气背怎么办 趣店被骗提现了怎么办 微转奇迹闪退怎么办 奇迹暖暖ios闪退怎么办 奇迹mu任务没做怎么办 外地人在北京上社保怎么办 医社保中间断了怎么办 社保断了2年怎么办