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

说明:此文章为腾讯云机器自动从本人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,%d\t", 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
                }

            }()

        }
    }
}

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BestSDK

【干货教程】可视化大数据最易犯的10个错误:排序混乱,扭曲数据...

  从传播学的角度,这意味着以图片为载体的视觉叙事更加引人注意,更容易获得人们的好感。   通过可视化信息,我们的大脑可以更有效地合成和保留信息内容,增强对信息...

3326
来自专栏程序员叨叨叨

1.2 GPU VS CPU

从上节阐述了GPU的发展历史,那么为什么在CPU之外要发展GPU?GPU 的 vertex programmability 和 fragment program...

805
来自专栏钱塘大数据

可视化数据图表要怎么做才好看?

作者:整理自网络 可视化技术仿佛有一种化平凡为非凡的魔力,冷冰冰的数据,经过可视化技术的加工,便酒曲入瓮般幻化成视觉的盛宴,炫酷的、缤纷的、简约的、繁复的……数...

3447
来自专栏zhangdd.com

流媒体音视频参数概念及详解

分辨率是和图像相关的一个重要概念,它是衡量图像细节表现力的技术参数。分辨率高是保证彩色显示器清晰度的重要前提。分辨率是体现屏幕图像的精密度,是指显示器所能显示的...

792
来自专栏玉树芝兰

文科生如何理解卷积神经网络?

不愿意看那一堆公式符号,却想知道卷积神经网络(Convolutional Neural Network)如何做图像分辨?分享一段我给自己研究生的讲解答疑视频,希...

1063
来自专栏腾讯大讲堂的专栏

为啥你的报表越看越丑,而别人的却永远高大上?

982
来自专栏用户画像

Youtube视频推荐算法的前世今生

在这个阶段,YouTube认为应该给用户推荐曾经观看过视频的同类视频,或者说拥有同一标签的视频。然而此时,YouTube的视频已是数千万量级,拥有标签的部分却非...

602
来自专栏奇点大数据

什么是信息

说到这里,我的同事王小妹非常认真且煞有介事地跟我说:“我觉得数字、字母、图像,这些都是数据,跟信息不信息的没啥关系。”看着她认真地跟我抬杠,我觉得蛮好,至少在认...

25111
来自专栏飞总聊IT

BlinkDB及其问题

BlinkDB是UCBerkeley和MIT的Sam一起做出来的一个基于Sampling的系统,系统大致成型的时间在2012年前后,该论文也投过DB的会议一路被...

3317
来自专栏数据小魔方

Word天呀,气泡图居然还有这种操作~

在之前写实习僧爬虫可视化案例之时,曾经用过一个很类似气泡图的图表——气泡云图(superbubble)。 它的图表信息呈现与文字云非常相似,都是在控制一组元素的...

2653

扫描关注云+社区