建立一个简单的方程:y=x_1
x_1+x_2
x_2+x_3
x_3+x_4
x_4+x_5
x_5
目标设为求 min y
也就是求 min (x_1
x_1+x_2
x_2+x_3
x_3+x_4
x_4+x_5
x_5)
参数x_1,x_2,x_3,x_4和x_5的范围都设为[-5,5]
上面这个问题很简单,一眼就可以看出来解是(0,0,0,0,0)
但是这里只是为了试验Anylogic是否可以写一个简单的遗传算法,就没有必要一开始就解复杂的问题。
应该是建模!
首先是建立一个工程,命名就直接一点,就叫GA,然后就进入工程main智能体。
然后呢?
遗传算法的主要过程是怎么样的呢?
首先要确定用什么来储存基因编码,在python可以直接用列表来储存,Anylogic也有类似的类(Linkedlist),对就是用LinkedList来储存基因。
那每个个体除了基因还有适应度,怎同时储存基因和适应度呢?
也可以直接用LinkedList,但是在建模过程中会显得很不清晰,所以可以直接采用建立智能体。
在Agent库里拖拽agent到main里,选择Agent type only ,智能体类型命名为Individual
在工程树中双击该类型,进入Individual类型编辑,在智能体中添加一个LinkedList和变量就可以表示一个个体的基因和适应度。
然后将LinkedList和变量改为gene和value后,完成好了Individual类的建立了。
建立好了个体类型就需要确定如何给初始群体添加基因和计算适应度(也就是算出,该个体的值)。
解决这样的问题,可以通过建立函数的方式。
这里就建立两个函数,分别用于添加基因和计算适应度。
上图是我建立好的工程,图中的define_var_for_ind是定义个体的基因的函数,函数内容如下图,图中定义了两个参数,一个是ind,是需要添加基因的个体;另一个是vbounds,表示函数每个变量的限制区间,函数体是一个循环,该循环是对每个基因赋予范围内的随机数,并且在最后返回添加的个体的基因:
图中还有一个函数叫get_value名字很直接,就是获得个体的值。这个函数只需要输入个体然后根据之前的目标函数算出函数值。
在图中的右下角的三个状态的变迁过程实现了以上的过程。
choose_parents 是通过轮盘赌法随机选择两个个体用来杂交:
如图下图中,先随机选出两个个体,然后将他们储存在一个链表里。
选择父代的方法是轮盘赌法,先根据每个个体的适应度算出每个个体被选择的概率,然后生成一个0到1的随机数,根据该随机数在累计概率的位置确定,选择的个体。
选择好交叉的父代以后就进行杂交,杂交后根据各自的基因计算每个个体的适应度,如下图是杂交的过程。
杂交的函数需要三个参数,杂交的父代和乘子。然后根据算数算子的公式对基因上的每一位进行计算,产生两个子代,然后储存在一个链表并返回出去。
杂交过后的子代会一定概率产生变异,mutate状态就是进行产生随机变异的状态。在下图中对产生的子代列表的个体进行遍历,依次进行变异→进行边界调整→获得变异调整后的个体的适应度→将个体添加到种群之中→如果个体的值比最优个体更为优秀则将最优个体换为该个体。遍历了整个子代个体后清空该列表,为下次过程准备。
变异函数如下,函数需要输入三个参数,变异个体(ind)、变异因子(gamma)和变异概率(mu)。变异采用随机确定,先生成一个列表储存一串0到1的随机数,每个随机数对应一个基因片段,并确定该基因是否变异,如果随机数小于mu就进行变异,由gamma乘以一个-0.5到0.5的随机数来改变基因片段,否则就不变。
边界调整是对超出边界的个体的基因做出调整,具体函数如下:
函数需要输入两个参数,调整的个体和参数的边界。对每个基因片段进行两个判断,是否大于最大边界,如果是就将其改为边界值,如果不是就不变;是否小于最小边界,如果是就改为最小边界,不是就不变。
最后在变迁的Action中将选择的父代链表清空,为下一次选择准备列表。
以上循环到产生的个体达到该子代要求的个数时,跳出循环,进入sorted状态。
sorted状态是对每代的群体进行选择,使得群体个数保持不变,并且筛选出不好的个体进行丢弃。
sort_f函数需要输入两个参数,群体和群体保留的个体的个数。该函数体的大致过程是,外部循环进行(群体个体个数-保留个数)每次循环找出最大的值丢弃,这样就保留了最优的个体。
以上就是算法的主要过程了,我将建立的模型上传到csdn上面了,如果感兴趣的,可以搜索一下。
我最近一直在学习遗传算法,学习一个东习最好的办法就是用上它,然后我就用python写了一个简单的解多元二次方程的遗传算法,当我写完以后就开始了另一个想法: 可以用Anylogic写一个遗传算法吗?然后我就开始了:先确定求解的问题建立一个简单的方程:y=x_1x_1+x_2x_2+x_3x_3+x_4x_4+x_5x_5目标设为求 min y也就是求 min (x_1x_1+x_2x_2+x_3x_3+x_4x_4+x_5x_5)参数x_1,x_2,x_3,x_4和x_5的范围都设为[-5,5]
AnyLogic
6 模型是独立的Java 应用并在任何支持平台形式的Java 上运行,或者用JRE (Java Runtime Environment)的以下版本支持Java 浏览.
AnyLogic
6 也可能被安装到其它平台,不包含在这个列表里(比如其它Linux
分布),但是我们不能保证它的全平台形式兼容性。
用于
AnyLogic
的自定义库,允许您在运行的模型中调用Python。 它连接到Python的本地安装,从而使您可以使用任何Python库。
它可用于以下情况:
使用最初用Python编
写
的代码,而不必移植到Java
用Python编
写
可以用Java调用的复杂
算法
,可以选择在语言之间传递对象/数据
能够使用任何Python独有的库
使用模拟作为测试经过培训的人工智能策略的测试平台
这些说明将使Pypeline与
AnyLogic
集成在一起。 在提供的Wiki(用户指南迁移到的维基)中对它们进行了更全面的描述。
您需要在计算机上安装具有任何有效许可证(PLE,大学或专业)的
AnyLogic
,以及
一个
版本的Python。
从下载Pypeline.jar文件,并将其放置在不会移动(或意外删除)的位置。
将其添加到您的
AnyLogic
面板。
AnyLogic
帮助文
01 什么是
遗传算法
?
1.1
遗传算法
的科学定义
遗传算法
(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和...
要在
Anylogic
中导入HashMap,您需要执行以下步骤:
1. 前往
Anylogic
的“Project”面板,并右键单击您的项目名称,然后选择“Settings”选项。
2. 在弹出窗口的左侧导航栏中,选择“Java”选项。
3. 在“Additional libraries”下,单击“Add”按钮,并导航到包含HashMap类的.jar文件所在的目录。选择该文件,然后单击“OK”按钮。
4. 单击“Apply”按钮保存更改并关闭“Settings”窗口。
5. 现在,您可以在
Anylogic
模型中使用HashMap类。在您的代码中添加以下导入语句即可:
```java
import java.util.HashMap;
6. 在使用HashMap之前创建该对象:
```java
HashMap<String, Integer> map = new HashMap<String, Integer>(); // 创建
一个
新的HashMap对象
注意:在上述代码中,我们创建了
一个
名为map的HashMap对象,该对象的键类型为String,值类型为Integer。您可以根据您的需求自定义HashMap的键和值类型。
7. 可以使用put()方法将键和值添加到HashMap中:
```java
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
8. 可以使用get()方法检索HashMap中与指定键关联的值:
```java
int value = map.get("apple"); // value将被设置为1
现在,您已经成功地在
Anylogic
中导入和使用了HashMap!