遺伝的アルゴリズム関数極値を使う(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
関数が途中で対応していないビットであってもよいし、最もオリジナルのものを保存するために多くの時間を計算していないため。しかし、一般的な考え方が示されています
最後に、場所それはいくつかのことに留意すべきです
- あなたは、バイナリと小数間の変換を理解する必要があります。ここでは、補間技術を使用することです。
- 我々は、データを呼び出すために、モジュール式FORTRAN大きなプログラムを書くために知っておく必要があります。
最後に、時間を追加するために自由再び、小さなシリーズは怠惰な、限定されています。自分の後に確認するために。
小扁はあなたがこれを読めば、私たちはより多くの交流ができ、油圧構造の卒業生です。