遺伝的アルゴリズム関数極値を使う(FORTRAN)

EDITORIAL

いくつかの緊急事態に適したこの記事は、友達最適化アルゴリズム、ギャングレベルの学生のために進んでください、すべての後、わずかなシリーズを学び、少し伝統的なコンピュータ工学の学生に持っています。

小扁は、最初の必要性は、いくつかの最適化アルゴリズムを学習する際に、遺伝的アルゴリズムは、米国の後輩の季節です遭遇します。しかし、遺伝的アルゴリズムの最適化アルゴリズムの古代のレベルとして天然の標的は私の最初の学習です。

私はGAについてどのように感じているかの書き込み、このアルゴリズムは、インテリジェントなアルゴリズムは大域的最適を実現することは理論的には可能ですが、学習期間の後、いくつかの複雑な機能のための感覚は本当にグローバルな最適な必要性にいくつかの幸運を達成したいです。このアルゴリズムは、後半に登場している多くの同様のアルゴリズム、などの粒子群最適化、アリコロニーアルゴリズムとの最も古典的です。ここ1、パスベルデンのことを学習のような評価、小扁感触を行います。

最後に私はGAを使用し、この時間は、いくつかの複雑な関数を計算完了です。ここに戻って後半レビューから身を守るために、いくつかの重要なステップと、いくつかのヒントがあります。(利用可能Psの完全なコードは遅くまで渡されました)

過去と現在遺伝的アルゴリズム

コンセプトは最初バグリーJDは、遺伝的アルゴリズムによって使用された
1967年に発表しました。ミシガン大学のその後JHHolland教授は、遺伝的アルゴリズム(遺伝的アルゴリズム、1975年に始まった
メカニズムGA)は体系的な研究を行いました。遺伝的アルゴリズムは、「やや良く排除」原則「適者生存」以下の生物学的進化のダーウィン理論の簡単なシミュレーション、です。遺伝的アルゴリズムは、人工進化の人口をシミュレートし、そして選択、ハイブリダイゼーションおよび変異の機構を介して、数世代にわたる集団は、後に、常に最適な(またはほぼ最適)である状態。

遺伝的アルゴリズムを提案し、それが広く、特に機能の最適化、生産スケジューリング、パターン認識、ニューラルネットワーク、適応制御などの分野では、使用されているされているので、遺伝的アルゴリズムが主要な役割を果たして大幅に問題解決を改善効率。遺伝的アルゴリズムは、現在の分野における重要な研究テーマである「ソフトコンピューティング。」

まずFORTRAN詳細な分析のための遺伝的アルゴリズムのプロセスの組み合わせ、および、実際の関数の最適化のケースによってその用途が議論されています。

アルゴリズムは、はじめにステップ

多くの人々は、すでにいくつかの基本的な手順遺伝的アルゴリズムを書かれている、私はあなたが薄い製品に行くことができ、直接アドレスダウンに、ここでは詳しく述べていませんよ。このアルゴリズムは、とても素晴らしいです。

https://blog.csdn.net/qq_34374664/article/details/78874956

私のインスピレーションのブログをたくさんする前にそれを見つけることが、彼の記事を読んだ後、私は一般的なプロセスを信じて、あなたはGAの理解を持つことになりません

私は次のショーああ私に会いに戻ってきて読んで覚えています!

ハハハッハッハ、数学が理解できる理解する能力を必要としませんどのように強力なので、素晴らしいですものではありません。

遺伝的アルゴリズムの主な構造

のは、遺伝的アルゴリズムのプログラミングを始めましょうリンク
まず、我々は計算するのに必要なプロセス全体について考えるようにアイデアを整理する必要がある場所いくつかの関数(サブルーチン)
1.人口の初期化
2.計算人口のフィットネス
ソート3.人口のフィットネス
4.選択を(スクリーニング)操作
5.交叉
6.突然変異
上記使用される関数が必要です。
第二に、我々はいくつかの意識のコンパイル大規模なプログラムを持っている必要があります。いくつかのデータ変数をグローバルに設定することができ、保存されているために、私たちは事前にそれのために頻繁に使用される根拠をいくつかの量を配置する必要があります。
pop_size:母集団サイズを入力
chromo_sizeを:染色体の長さを入力
generation_sizeを:反復回数を入力します
cross_rate:クロスオーバーの確率を入力
cross_rateを:突然変異確率を入力
エリート主義を:入力はエリート主義的選択である
(説明当時使用され、これらの変数)

解決するために開始します。

1.人口初期化:

integer i,j,k
integer pop_size, chromo_size,pop_num
real x
call RANDOM_SEED()
do i=1,pop_size
    do j=1,pop_num
    do k=1,chromo_size
        call RANDOM_NUMBER(x)
        pop(i,j,k) = nint(x)
    end do
    end do
end do

言語解釈:ポップサイズ集団の各個体サイズのために、染色体の長さのサイズにポップアップNUMの個々の寸法は、各次元のランダムな割り当てをchromo_size。
生成機能()__実質的にランダムな番号RANDOM_SEED

2.計算個々の集団の適応度(異なる最適化目標の、ここに書き換える必要があります)

 integer i,j,k
    integer pop_size,pop_num,chromo_size
    real fitness_value1(pop_size,pop_num).
    
!do  i=1,pop_size(单层维度,一个自变量时的初始化方法)
!   fitness_value(i) = 0.  
!end do

do i=1,pop_size
   do j=1,pop_num
       do k=1,chromo_size
      if (pop(i,j,k) == 1)then
            fitness_value1(i,j) = fitness_value1(i,j)+2**(k-1)
      end if
      
   end  do     
   fitness_value1(i,j) = -500+fitness_value1(i,j)*(500-(-500))/(2**chromo_size-1)
     
     fitness_value1(i,j) = fitness_value1(i,j)*sin(sqrt(fitness_value1(i,j)))      !*****   *********更改函数
     
     fitness_value(i)=fitness_value1(i,j)+fitness_value(i)
end do

end do

3.人口は、ソート
、個々の適性のサイズによってソートされ、最高の個々のセーブ

integer pop_size,pop_num,chromo_size
integer i,j,k,m,min,temp
integer temp1(pop_num,chromo_size)

do  i=1,pop_size    
    fitness_table(i) = 0.
end do

min = 1
temp = 1
temp1(pop_num,chromo_size)=0
 do  i=1,pop_size
    min = i
   do j = i+1,pop_size
if (fitness_value(j)<fitness_value(min))then
            min = j
end if
end do
if (min/=i)then
        temp = fitness_value(i)
        fitness_value(i) = fitness_value(min)
        fitness_value(min) = temp
do m=1,pop_num
   do k = 1,chromo_size
            temp1(m,k) = pop(i,m,k)
            pop(i,m,k) = pop(min,m,k)
            pop(min,m,k) = temp1(m,k)
   end do
end do

end if

end do

do i=1,pop_size
if (i==1)then
        fitness_table(i) = fitness_table(i) + fitness_value(i)   
else
        fitness_table(i) = fitness_table(i-1) + fitness_value(i)
end if
end do
!fitness_table!***********************????????????????
fitness_avg(G) = fitness_table(pop_size)/pop_size


if (fitness_value(pop_size) > best_fitness)then
    best_fitness = fitness_value(pop_size)
    best_generation = G
end if
do i=1,pop_num
do  j=1,chromo_size
        best_individual(i,j) = pop(pop_size,i,j)
end do
end do

4.ルーレット選択操作は、
上の別の人口分布「関数の山」の人口欠点を処理するために必要。ルール処理は、ホイール上の各分布角度の集団サイズである第3のステップで算出されたサイズの適合度関数を使用することです。
その後、ホイールを回し方を選択して、誰が生き残ることができます。これは明らかに得ることができます。最も可能性の高い選択する最小の集団の低フィットネスの。
運が優れた集団で、その結果、非常に貧弱であるが除外されている場合は、私たちは取ることができ、これらの優れた銘柄へのアプローチを「歩きます」。これは、そのような注意が適度に歩く方法で必要とされているを参照するローカル最適化を防ぎます

integer pop_size, chromo_size,elitism,pop_num
integer i,j,k,p,r,mid,first,last,idx
real x,w,q

call RANDOM_SEED()
call RANDOM_NUMBER(x)
do i=1,pop_size
    r = x * fitness_table(pop_size)
    first = 1
    last = pop_size
    w=(last+first)/2
    mid = nint(w)
    idx = -1
do while ((first <= last).and.(idx == -1) )
  if (r > fitness_table(mid))then
            first = mid
else if (r < fitness_table(mid))then
            last = mid  
else
            idx = mid
exit
end if
q=(last+first)/2
        mid = nint(q)
   if ((last - first) == 1)then
            idx = last
   exit
  end if
end do
do k=1,pop_num
    do j=1,chromo_size
        pop_new(i,k,j)=pop(idx,k,j)
    end do
end do
end do

!**************************保送选择*************************
if (elitism==1)then
    p = pop_size-1
else
    p = pop_size
end if
do  i=1,p
    do k=1,pop_num
    do  j=1,chromo_size
        pop(i,k,j) = pop_new(i,k,j)
    end do
end do
end do

シングルポイントのクロスオーバー

implicit none
integer pop_size, chromo_size,cross_rate,pop_num
integer i,j,k,cross_pos,temp
real x

call RANDOM_SEED()
do i=1,pop_size,2
    do k=1,pop_num
    call RANDOM_NUMBER(x)
    if(x < cross_rate)then
        cross_pos = nint(x * chromo_size)    !交叉位置
       if(cross_pos == 0.or.cross_pos == 1)then
         cycle
       end if
       
     do  j=cross_pos,chromo_size
            temp = pop(i,k,j)
            pop(i,k,j) = pop(i+1,k,j)
            pop(i+1,k,j) = temp
     end do

end if
    end do
end do

6.突然変異

!pop_size: 种群大小
!chromo_size: 染色体长度
!cross_rate: 变异概率
subroutine mutation(pop_size, chromo_size, mutate_rate,pop_num)
use a10
implicit none
integer i,j,mutate_pos
real x
integer pop_size, chromo_size,mutate_rate,pop_num
call RANDOM_SEED()
 do i=1,pop_size
     do j=1,pop_num
    call RANDOM_NUMBER(x)
    if (x < mutate_rate)then
        mutate_pos = nint(x*chromo_size)
        if (mutate_pos == 0)then
        cycle
        end if
        pop(i,j,mutate_pos) = 1 - pop(i,j, mutate_pos)
    end if
    
     end do
 end do

突然変異と交叉操作が似ていますが、その効果は、異なるサイズです。十字操作は、人口に相当し、それらの間の領土を拡大する山の間の友情の関数である、ブラインドスポットの真ん中に自分の位置を明確に。彼は比較的制御可能です。対照的変異では、それはランダムな鼓動で、人口は、それが悪化した場所に行くことができ、行くには良い場所に行くことがあります。これは、最適な結果を得るために、パラメータを変更するリーダーが必要です。
この時点で、溶液プロセスが完了しました

結果はそれを示しました:

ここでは元の関数はい。ラインは機能、30次元の機能を変更するリファレンスフィットネス計算。
ここでは主なプログラムは次のとおりです。

program GA
use a10
implicit none
!real,external :: fitness***********还是用子程序好用
!integer,external:: rank
!real,external ::selection
!real,external :: crossover
!real,external :: mutation

integer m(30,24),p,j,i
real n,q(30)
integer,save::pop_size        !种群大小
integer ,save::pop_num        !单个种群维度
integer,save::chromo_size     !染色体大小**********                                      *********更改
integer ,save::elitism        !选择精英操作
integer ,save::cross_rate       !交叉概率
integer ,save::mutate_rate     !变异概率

!function [m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate, elitism)
elitism = 1             !选择精英操作
pop_size = 1000           !种群大小
pop_num=30              !维度30
chromo_size = 24       !染色体大小
generation_size = 200   !迭代次数
cross_rate = 0.5        !交叉概率
mutate_rate = 0.01      !变异概率

  
!print *, '开始了'
  
  
fitness_avg = 0.


fitness_value(pop_size) = 0.
best_fitness = 0.
best_generation = 0

call initilize(pop_size,pop_num,chromo_size)          !初始化

do  G=1,generation_size   
  call fitness(pop_size,pop_num,chromo_size)                !计算适应度 
  call  rank(pop_size,pop_num,chromo_size)                  !对个体按适应度大小进行排序
  call selection(pop_size, chromo_size,elitism,pop_num)      !选择操作
  call crossover(pop_size, chromo_size, cross_rate,pop_num)  !交叉操作
  call mutation(pop_size, chromo_size, mutate_rate,pop_num)  !变异操作
end do


!****                                               ******************matlab中打印图像****************


m = best_individual                   !获得最佳个体
n = best_fitness                 !获得最佳适应度
p = best_generation                   !获得最佳个体出现代

!获得最佳个体变量值,对不同的优化目标,此处需要改写
q = 0.
do i=1,pop_num
do j=1,chromo_size
    if (best_individual(i,j) == 1)then
          q(i)= q(i)+2**(j-1)
    end  if
end do




!!!!!!!!!!!!!!!!!*********************************更改为对应的自变量的值**********************
                            q(i) = -500+q(i)*(500-(-500))/(2**chromo_size-1)
end do





write(*,*)"最优个体"
write(*,*) m
write(*,*)"最优适应度"
write(*,*) n
write(*,*)"最优个体自变量"
write(*,*) q
write(*,*)"最优代数"
write(*,*) p

end program GA

関数が途中で対応していないビットであってもよいし、最もオリジナルのものを保存するために多くの時間を計算していないため。しかし、一般的な考え方が示されています

最後に、場所それはいくつかのことに留意すべきです

  1. あなたは、バイナリと小数間の変換を理解する必要があります。ここでは、補間技術を使用することです。
  2. 我々は、データを呼び出すために、モジュール式FORTRAN大きなプログラムを書くために知っておく必要があります。

最後に、時間を追加するために自由再び、小さなシリーズは怠惰な、限定されています。自分の後に確認するために。
小扁はあなたがこれを読めば、私たちはより多くの交流ができ、油圧構造の卒業生です。

出版元の記事 ウォンの賞賛0 ビュー58

おすすめ

転載: blog.csdn.net/lameta/article/details/102652779