1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
#粗糙地计算总路程上界
UpperBound = function(disM)
{
    mx = apply(disM,1,max)  #两城市间最长距离
    returnsum(mx) )       #最长旅行路径
}
 
#生成随机染色体
rndDNA = function(n)
{
    return( seq(1,n,1) )  #随机生成n条旅行路径
}
 
#对一个解计算总路程的距离
calcScores = function(dna,disM)
{
    = length(dna)         #城市总数
    tmp = cbind(dna[1:n],c(dna[2:n],dna[1])) #生成起始点城市
    len = apply(tmp,1,function(x) disM[x[1],x[2]])
    len = sum(len)
    return(len)      #返回此条旅行路径总距离
}
 
#根据每条染色体的分数计算权重,并以此抽样
roller = function(scores,k)
{
    scores = max(scores)-scores+1
    props = scores/sum(scores)
    = length(scores)
    mxind = which.max(scores)#保留最优染色体
    ans = sample((1:N)[-mxind],k-1,replace = F,prob = props[-mxind])
    return(c(mxind,ans))
}
 
#种群中的繁殖过程
crossEvolve = function(i,nGroup,crossGroup,prop)
{
    = nGroup[i,]
    = crossGroup[i,]
    = length(a)
    = max(1,trunc(n*prop))
 
    tmpa = a
 
    st = sample(1:n,1)
    ind = st:(st+m)      #indication 指示、索引
    if (st+m>n)
    {
        bind = which(ind>n)
        ind[bind] = ind[bind] %% + 1
    }
    cross = intersect(b,a[ind])
    tmpa[ind] = cross
    return(tmpa)
}
 
#染色体的自我变异
selfVariation = function(dna,prop)
{
    = length(dna)
    pos = which(runif(n)<prop)
    if (length(pos)==0)
        return(dna)
    pos = sample(pos,1)
    newind = sample((1:n)[-pos],1)
 
    if (pos>newind)
    {
        tmp = dna[newind:n]
        tmp = tmp[-(pos-newind+1)]
        dna[newind] = dna[pos]
        dna[(newind+1):n] = tmp
    }
    else
    {
        tmp = dna[1:newind]
        tmp = tmp[-pos]
        dna[newind] = dna[pos]
        dna[1:(newind-1)] = tmp
    }
    return(dna)
}
 
#以某条染色体代表的解做图
drawIt = function(dots,dna,xlab=NULL,ylab=NULL,main=NULL,sub=NULL,col=NULL)
{
#win.graph(width=800, height=800, pointsize=12)
 
    = dots[[1]]
    = dots[[2]]
      = dots[[4]]
      cols=dots[[5]]+10
    if (is.null(main))
    {
        scores = calcScores(dna,dots[[3]])
#画地图
 plot(border,border="#BBFFFF",col="#FF7F00",ylim = c(1854), panel.first = grid(),
      main=paste("总路程",scores,"公里"),xlab="经度",ylab="纬度",sub=paste('优化结束-第',sub,'代'));
#增加省会城市坐标点
           points(x,y,pch=19,col=cols)
           text(x,y,z,pos=1,cex=0.5)
      = length(dna)
    for (i in 1:(n-1)){ 
      Sys.sleep(0.3)
      lines(x[dna[i:(i+1)]],y[dna[i:(i+1)]],col="#00FFFF",lwd=3)}
    lines(x[dna[c(n,1)]],y[dna[c(n,1)]],col="#00FFFF",lwd=3)
 
    }
    else{
 
#画地图
plot(border,border="#BBFFFF",col="#FF7F00",ylim = c(1854),main=paste("总路程",main,"公里"),
     xlab="经度",ylab="纬度",sub=paste('第',sub,'代'))
points(x,y,pch=19,col=cols)
if(sub==1)Sys.sleep(5)
else{
 
      = length(dna)
    for (i in 1:(n-1)) 
      lines(x[dna[i:(i+1)]],y[dna[i:(i+1)]],col="#00FFFF",lwd=3)
    lines(x[dna[c(n,1)]],y[dna[c(n,1)]],col="#00FFFF",lwd=3)
}}}
 
 
#Genetic Algorithm for Traveller Salesman Problem
GA4TSP = function(dots,initDNA=NULL,N,cp,vp,maxIter,maxStay,maxElite,drawing)
{
    disM = dots[[3]]
    = nrow(disM)
    if (N %%2 >0)
        = N+1
    Group = t(sapply(rep(n,N),rndDNA))
     
      if (!is.null(initDNA)) Group[1,]=initDNA
         
    maxL = UpperBound(disM)
    stopFlag = FALSE
    iterCount = 1
    stayCount = 0
    allBest = maxL
    eliteBest = maxL
    elite = mat.or.vec(maxElite,n)
    elitecount = 0
    eracount = 0
 
    LastEra = maxL
    outputRecorder = NULL
    GenerationRecorder = NULL
    showScore=FALSE
    eliteInto=FALSE
    #初始化结束
     
    while (!stopFlag)
    {
        cat('Generation:',iterCount,'Era:',eracount,'Elite:',elitecount)
        scores = apply(Group,1,calcScores,disM)
        bestScore = min(scores)
        mind = which.min(scores)
        bestDNA = Group[mind,]#记录最佳染色体
 
        #更新时代、精英的信息
        if (bestScore<eliteBest)
        {
            stayCount = 0
            eliteBest = bestScore
            eliteDNA = bestDNA
            if (eliteBest<allBest)
            {
                allBest = eliteBest
                allDNA = eliteDNA
                outputRecorder = rbind(outputRecorder,allDNA)
                GenerationRecorder = c(GenerationRecorder,iterCount)
                if (drawing)
                    drawIt(dots,allDNA,main=as.character(allBest),sub=iterCount)
            }
        }
        else
            stayCount = stayCount+1
 
        if (stayCount == maxStay)
        {
            stayCount = 0
            eliteBest = maxL
            elitecount = elitecount+1
            elite[elitecount,] = eliteDNA
            scores = apply(Group,1,calcScores,disM)
            = which(scores == min(scores))
            nind = sample((1:N)[-a],length(a))
            Group[a,] = Group[nind,]
            eliteInto =TRUE
            scores = apply(Group,1,calcScores,disM)
            bestScore = min(scores)
            mind = which.min(scores)
            bestDNA = Group[mind,]
        }
 
        if (elitecount==maxElite)
        {
            Group[1:elitecount,]=elite
            elite = mat.or.vec(maxElite,n)
            elitecount = 0
            stayCount = 0
            eliteBest = maxL
            eracount = eracount+1
            maxStay = maxStay + 20
            showScore=TRUE
            scores = apply(Group,1,calcScores,disM)
            bestScore = min(scores)
            mind = which.min(scores)
            bestDNA = Group[mind,]
        }
         
        #对种群计算分数,产生繁殖与变异
        succind = roller(scores,N/2
        nGroup = Group[succind,]          #取最优和一半高权重优秀基因
        crossind = sample(succind,N/2)
        crossGroup = Group[crossind,]     #取最优和一半高权重优秀基因,打乱顺序
        crossans = t(sapply(1:(N/2),crossEvolve,nGroup,crossGroup,cp))
        crossGroup = rbind(nGroup,crossans)
 
        Group = t(apply(crossGroup,1,selfVariation,vp))
        if (eliteInto)
            eliteInto = FALSE
        else
            Group[1,] = bestDNA  
 
        stopFlag = (iterCount>=maxIter)
       iterCount = iterCount+1
        cat(' Best:',bestScore,'All:',allBest,'Stay:',paste(stayCount,'/',maxStay,sep=''),'\n')
        if (showScore)
        {
            scores = apply(Group,1,calcScores,disM)
            show(scores[1:(N/2)])
            show(scores[(N/2+1):(N)])
            #Sys.sleep(1)
            showScore=FALSE
        }
    }
    if (drawing)
        drawIt(dots,allDNA,sub=maxIter)
 return(list(DNA = outputRecorder,Generation=GenerationRecorder))
}
 
 
#生成初始染色体
CreatDNA = function(data,i)
{
hc=hclust(dist(data[,1:2]))
data\(col</code><code class="python keyword">=</code><code class="python plain">cutree(hc,&nbsp;k&nbsp;</code><code class="python keyword">=</code>&nbsp;<code class="python plain">i)&nbsp;</code><code class="python comments">#k&nbsp;=&nbsp;1&nbsp;is&nbsp;trivial</code></div><div class="line number250 index249 alt1"><code class="python plain">INITDNA</code><code class="python keyword">=</code><code class="python plain">data[order(data\)col),]
rownames(INITDNA)=NULL
    return(INITDNA)  
}

反馈与建议

  • Author:商丰瑞
  • 邮箱:shangfengrui@gmail.com
  • date: 2015年10月26日

感谢您阅读这份文档,分享。

R语言-GA算法脚本的更多相关文章

  1. R语言分类算法之随机森林

    R语言分类算法之随机森林 1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策 ...

  2. R语言 神经网络算法

    人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...

  3. R语言 推荐算法 recommenderlab包

    recommend li_volleyball 2016年3月20日 library(recommenderlab) library(ggplot2) # data(MovieLense) dim(M ...

  4. 用GA算法设计22个地点之间最短旅程-R语言实现

    数据挖掘入门与实战  公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...

  5. GA算法-R语言实现

    旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...

  6. PageRank算法R语言实现

    PageRank算法R语言实现 Google搜索,早已成为我每天必用的工具,无数次惊叹它搜索结果的准确性.同时,我也在做Google的SEO,推广自己的博客.经过几个月尝试,我的博客PR到2了,外链也 ...

  7. R语言进行机器学习方法及实例(一)

    版权声明:本文为博主原创文章,转载请注明出处   机器学习的研究领域是发明计算机算法,把数据转变为智能行为.机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有 ...

  8. 决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  9. 几种经典排序算法的R语言描述

    1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...

随机推荐

  1. atitit 研发管理 要不要自己做引擎自己实现架构?.docx

    atitit 研发管理 要不要自己做引擎自己实现架构?.docx 1.1. 目前已经有很多引擎了,还要自己做吗??1 1.2. 答案是自己做更好,利大于弊1 2. 为什么要自己做??1 2.1. 从历 ...

  2. 18.实现如下类之间的继承关系,并编写Music类来测试这些类。

    package zhongqiuzuoye; public class Instrument { public void play() { System.out.println("弹奏乐器& ...

  3. Design2:数据层次结构建模之二

    MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...

  4. 通过Class获取标签,兼容的几种思路

    在js中通过document.getElementsByClassName()在低版本IE浏览器中不兼容.然后我写了几种方案,大家可以参考参考. html代码 <!DOCTYPE html> ...

  5. C# List.ForEach 方法

    C#中List.ForEach 方法是对 List 的每个元素执行指定操作. 示例: using System; using System.Collections.Generic; using Sys ...

  6. 深入理解PHP内核(三)概览-SAPI概述

    本文链接:http://www.orlion.ml/234/ 1.在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现.这些内置实现的物理位置在PHP源码的SAPI目录.这个目录存 ...

  7. Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)

    在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的3D游戏会需要,给模型或者山山水水加上光照,会看上去更加的真实,获得更好的体验.一个本身不发光物体显示什么颜色,在于本身反射 ...

  8. JavaScript闭包(二)——作用

    一.延迟调用 当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数. 但是,传递函数引用的同时无法为计划执行的函数提供参数.可以在代 ...

  9. 3D Grid Effect – 使用 CSS3 制作网格动画效果

    今天我们想与大家分享一个小的动画概念.这个梦幻般的效果是在马库斯·埃克特的原型应用程序里发现的​​.实现的基本思路是对网格项目进行 3D 旋转,扩展成全屏,并呈现内容.我们试图模仿应用程序的行为,因此 ...

  10. OkHttp,Retrofit 1.x - 2.x 基本使用

    Square 为广大开发者奉献了OkHttp,Retrofit1.x,Retrofit2.x,运用比较广泛,这三个工具有很多相似之处,初学者可能会有一些使用迷惑.这里来总结一下它们的一些基本使用和一些 ...