微分進化算法解決函數優化問題的matlab代碼,Matlab微分進化算法及優化函數測試...

微分進化(Difference Evolution,DE)算法是一種優化算法,據稱其比GA(遺傳算法)等更為優秀。

借鑒網上實現的DE算法,用Matlab實現了對若干函數優化問題的解法,代碼如下:

function [] = de_test

clear all;

close all;

clc;

%解:X = [0, 0, ...]

%nVar = 30

%dims: [-30, 30]

function fitness = sphere(vals)

prod = vals .* vals;

fitness = sum(prod, 2);

end

%f(x) = 1/4000 * sum^n_1(x_i)^2 - prod^n_1 * cos(x_i/sqrt(i)) + 1

%f* = 0, x* = [0, 0, ...];

%nVar = 30

%dims: [-600, 600]

function fitness = griewank(vals)

[h w] = size(vals);

p1 = vals.^2;

p1 = 1/4000 .* sum(p1, 2);

t = sqrt([1:w]);

p2 = vals ./ repmat(t, h, 1);

p2 = cos(p2);

p2 = prod(p2, 2);

fitness = p1 - p2 + 1;

end

%解: X = [1, 1, 1, ...]

function fitness = RosenBroek(vals)

[k n] = size(vals);

vals1 = vals(:, 1:n-1);

vals2 = vals(:, 2:n);

tmp = vals2 - vals1 .* vals1;

tmp = 100 * tmp .* tmp;

tmp1 = (vals1 - 1).^2;

fitness = sum(tmp, 2) + sum(tmp1, 2);

end

%許多局部最小值,最優解:X = [0, 0], 固定2個變量

function fitness = Rastrigin (X)

v = X.^2 - 10 .* cos(2 * pi .* X) + 10;

fitness = sum(v, 2);

%fitness = 20 + X(:, 1).^2 + X(:, 2).^2 - 10 .* (cos(2 * pi * X(:, 1)) + cos(2 * pi * X(:, 2)));

end

%參數

popSize = 100; % 群規模

F = 0.5; ? ? ? ? ? ? ? ? ? ?% 突變因子

C = 0.9; ? ? ? ? ? ? ? ? ? ?% 交叉率

iterTimes = 300;% 迭代次數

Run = 4; ? ? ? ?% 測試輪次

id = [1:popSize];

%結果

bestFit = 1e5; ?%設取最小值

bestGene = [];

for r = 1:Run ?%輪次

Func = r; ? ? % 測試適應度函數

switch Func

case 1

Func = @sphere;

Xmin = -100;

Xmax = 100;

nVar = 30;

case 2

Func = @griewank;

Xmin = -600;

Xmax = 600;

nVar = 2;

case 3

nVar = 2;

Func = @RosenBroek;

Xmin = -100;

Xmax = 100;

case 4

nVar = 2;

Func = @Rastrigin

Xmin = -5.12;

Xmax = 5.12;

end;

Func

tic;

%1.初始化種群

X = Xmin + rand(popSize, nVar) * Xmax;

%2.每輪迭代

for i = 1:iterTimes

X0 = X;

% ? ? ? ? ? ? F = 2 * (1 - (i-1)/iterTimes);

%個體突變得到V

for j = 1:popSize

ids = id;

ids(j) = [];

rids = randperm(popSize - 1, 3);

rids = ids(rids);

V = X(rids(1), :) + F * (X(rids(2), :) - X(rids(3), :));

%對V(j, :)值域檢查

ids = find(V < Xmin);

if length(ids) > 0

V(ids) = Xmin;

end;

ids = find(V > Xmax);

if length(ids) > 0

V(ids) = Xmax;

end;

%對每個X和V的配對,進行交叉操作,結果存在U中

jrand = floor(rand() * nVar + 1); ?%必交叉項,保證至少一個交叉

for n = 1:nVar

R1 = rand();

if (R1 < C || n == jrand)

U = V; ? ?%保留子代基因

else

U = X(j, :); ? ?%保留父代基因

end

end

%在子代和父代間做選擇運算

if Func(U) < Func(X(j, :))

Tr = U;

else

Tr=X(j, :);

end

% 更新種群基因

X(j,:) = Tr;

%計算新的適應度

fitness = Func(X(j,:));

%記錄全局最優解

if fitness < bestFit

bestFit = fitness;

bestGene = X(j, :);

end;

end ?%結束個體更新

end

bestGene

bestFit

toc

end

end運行結果如下:

Func =

@de_test/sphere

bestGene =

Columns 1 through 15

-7.5570 ?-11.9099 ? ?9.9957 ?-37.8403 ?-17.9445 ? -7.1438 ?-21.4304 ?-33.6260 ?-22.1812 ?-66.1438 ? ?0.9014 ?-39.6724 ? -0.3175 ?-56.4815 ? 26.5422

Columns 16 through 30

6.5446 ?-31.9653 ? -9.3640 ?-37.1629 ?-23.7325 ? ?2.7271 ? -6.3413 ?-21.3204 ?-13.1450 ? 28.7402 ?-28.8170 ?-22.6226 ? 10.9031 ?-16.6128 ?-14.7637

bestFit =

2.0583e+04 ?(從此結果看,算法效果不佳)

時間已過 2.285354 秒。

Func =

@de_test/griewank

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 3.337347 秒。

Func =

@de_test/RosenBroek

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 1.747765 秒。

Func =

@de_test/Rastrigin

Func =

@de_test/Rastrigin

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 1.403871 秒。

原文:http://blog.csdn.net/miscclp/article/details/38344685

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529500.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle中獲取文件中的數據,操作oracle中的數據文件

收藏于http://dev.yesky.com/296/8090796.shtmlOracle數據庫中管理表空間和數據文件數據庫的三大組成部分:數據文件&#xff0c;控制文件&#xff0c;Redo日志。表空間分為系統表空間和非系統表空間。SYSTEM表空間是最基本的&#xff0c;必須的&#xff0c;Oracle建議你為用戶數…

oracle 存儲過程設置回滾點,(轉)oracle 存儲過程事宜使用斷點回滾 -savepoint

學習存儲過程中使用斷點回滾事務時&#xff0c;發現目前網絡上存在一個問題&#xff0c;那就是使用斷點回滾后&#xff0c;都忘記了一個很重要的事情&#xff0c;提交事務。雖然使用了斷點回滾&#xff0c;但是斷點回滾不像rollBack或commit一樣結束當前事務&#xff0c;而使用…

php tp5清空數據表并主鍵,tp5數據庫——更新數據

更新數據更新數據表中的數據Db::table(think_user)->where(id, 1)->update([name > thinkphp]);如果數據中包含主鍵&#xff0c;可以直接使用&#xff1a;Db::table(think_user)->update([name > thinkphp,id>1]);update 方法返回影響數據的條數&#xff0c;…

oracle幾個網絡,ORACLE網絡的幾個重點概念

數據庫名(DB_NAME)、數據庫實例名(INSTANCE_NAME)、操作系統環境變量ORACLE_SID、數據庫服務名 (SERVICE_NAME)、數據庫域名(DB_DOMAIN)以及全局數據庫名(GLOBAL_DB_NAME)是幾個使用Oracle數據庫容易混 淆的概念。1、數據庫名與實例名數據庫名(DB_NAME)&#xff1a;是區分數據的…

oracle每季度補丁,Oracle 2020 年第四季度補丁發布

半個月前&#xff0c;也就是 10 月 20 日&#xff0c; Oracle 發布了今年最后一次補丁更新&#xff0c;那么很多人都想打最新的 PSU&#xff0c;理由是有被掃到各種漏洞&#xff0c;有的掃描工具著實太坑&#xff0c;這里就不用說了&#xff0c;前幾天看到蓋總發布的文章2020年…

php flash上傳進度條,PHP_PHP+FLASH實現上傳文件進度條相關文件 下載,PHP之所以很難實現上傳進度條 - phpStudy...

PHPFLASH實現上傳文件進度條相關文件 下載PHP之所以很難實現上傳進度條是因為在我們上傳文件到服務器的時候&#xff0c;要等到文件全部送到服務器之后&#xff0c;才執行相應的php文件。在這之前&#xff0c;文件數據保存在一個臨時文件里面&#xff0c;而php無法獲得這個文件…

oracle截取時間函數6,SQL 取日期部分函數

convert(varchar(10),getdate(),120)這個函數就可以得到日期部分了&#xff0c;我覺得還是比較方便的&#xff0c;我覺得SQL在日期方面&#xff0c;沒有ORACLE函數坐的好。。Sql Server中的日期與時間函數1. 當前系統日期、時間select getdate()2. dateadd 在向指定日期加上一…

oracle 找不到程序,Oracle 找不到監聽程序

Oracle服務器文件 app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.oraSID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME CLRExtProc)(ORACLE_HOME D:\app\Administrator\product\11.2.0\dbhome_1)(PROGRAM extproc)(ENVS "EXTPROC_DLLSONLY:D:\…

oracle中的存儲過程教程,oracle 存儲過程

-- 查看系統定時任務SELECT * FROM DBA_JOBS-- 新建定時任務DECLAREjobno NUMBER;BEGINSYS.DBMS_JOB.SUBMIT(JOB > jobno, /*自動生成JOB_ID*/WHAT > qmcb_ls_data;, /*需要執行的存儲過程名稱或SQL語句*/NEXT_DATE > SYSDATE, /*初次執行時間-立即執行*/INTERVAL >…

Oracle segment啥意思,關于oracle數據庫段segment的小結

段(segment)是一種在數據庫中消耗物理存儲空間的任何實體(一個段可能存在于多個數據文件中&#xff0c;因為物理的數據文件是組成邏輯表空間的基本物理存儲單位)今天碰到一個高水位問題&#xff1a;一個分區表&#xff0c;刪除某個分區中的一些數據后&#xff0c;表空間并沒有回…

Linux在文件第一行添加字符,使用shell命令給文件中每一行的前面、后面、指定列添加字符...

shell給一個文件中的每一行開頭插入字符的方法&#xff1a;awk {print "X"$0} fileNameshell給一個文件中的每一行結尾插入字符的方法&#xff1a;awk {print $0"X"} fileNameshell給一個文件中的每一行的指定列插入字符的方法&#xff1a;awk $O$O" …

路由器 刷 linux系統版本,在Linux下用tftp刷寫路由器固件

(以Buffalo WHR-G300N V2路由器為例)以發行版Ubuntu為例(如果你在Windows下&#xff0c;可下載Ubuntu的ISO文件&#xff0c;再用wubi安裝Ubuntu&#xff0c;可免去重新分區的麻煩)&#xff0c;下載Buffalo WHR-G300N V2路由器的FTP版固件文件&#xff0c;放到Ubuntu的/home目錄…

linux沒有etho網卡,關于怎么解決CENTOS7沒有ETH0網卡這個問題

CentOS7系統安裝完畢之后&#xff0c;輸入ifconfig命令發現沒有eth0,不符合我們的習慣。而且也無法遠程ssh連接。1.進入目錄/etc/sysconfig/network-scripts/2.將文件ifcfg-ens33重命名為ifcfg-eth0;(注意&#xff1a;修改需要切換至root用戶)3.編輯ifcfg-eth0使用命令&#xf…

linux添加物理卷編輯文件夾,Red hat Linux下的邏輯卷管理器LVM-上

【IT168 專稿】Red hat 下的LVM 上 LVM是Logical Volume Manager(邏輯卷管理器)的簡寫&#xff0c;它為主機提供了更高層次的磁盤存儲管理能力。LVM可以幫助系統管理員為應用與用戶方便地分配存儲空間。在LVM管理下的邏輯卷可以按需改變大小或添加移除。另外&#xff0c;LVM可以…

linux的nfs端口號,#Linux NFS服務 固定端口及防火墻配置#

#Linux NFS服務 固定端口及防火墻配置#1.在Linux上正常安裝NFS服務2.修改/etc/service,添加以下內容(端口號必須在1024以下&#xff0c;且未被占用)# Local servicesmountd 1011/tcp #rpc.mountdmountd 1011/udp #rpc.mountdrquotad 1012/tcp #rpc.rquotadrquotad 1012/udp #rp…

嵌入式linux添加環境變量,Linux環境變量

前言&#xff1a;1. 環境變量是操作系統環境設置的變量&#xff0c;適用于整個系統的用戶進程&#xff1b;2. 環境變量可以在命令中設置&#xff0c;但是用戶注銷的時候將會丟失這些設置值&#xff1b;3. 若要重復適用&#xff0c;則最好在.profile中定義&#xff1b;環境變量的…

eval函數linux,Python中的eval()、exec()及其相關函數

剛好前些天有人提到eval()與exec()這兩個函數&#xff0c;所以就翻了下Python的文檔。這里就來簡單說一下這兩個函數以及與它們相關的幾個函數&#xff0c;如globals()、locals()和compile()&#xff1a;1. eval函數函數的作用&#xff1a;計算指定表達式的值。也就是說它要執行…

linux更改語言腳本,Linux shell腳本入門——shell語言腳本【CentOS】

認識腳本是使用一種特定的描述性語言&#xff0c;依據一定的格式編寫的可執行文件。腳本語言又被稱為擴建的語言, 或者動態語言, 是一種編程語言, 用來控制軟件應用程序, 腳本通常是以文本 (ASCⅡ) 保存, 只是在被調用時進行解釋或者編譯。學習shell腳本的用途對于一個合格的系…

linux可用的ftp,linuxunix下有很多可用的ftp服務器

一、ftp服務器簡介linux/unix下有很多可用的ftp服務器&#xff0c;根據這些ftp服務器的可配置性大概可以分為3類&#xff1a;弱、中等、高。功能比較簡單的ftp服務器軟件有“ftpd”和“oftpd”。前者與ftp客戶端工具“ftp”類似&#xff0c;只實現了標準的ftp功能&#xff0c;支…

linux視圖版怎么輸入命令,分享在Linux命令下操作MySQL視圖實例代碼

視圖VIEW命令簡介&#xff1a;VIEW視圖就是存儲下來的SELECT語句數據1。創建視圖命令格式&#xff1a;創建[或更換][ALGORITHM {UNDEFINED | MERGE | 不是Temptable}][DEFINER {user | 當前用戶 }][SQL SECURITY {DEFINER | INVOKER}]VIEW view_name [(column_list)]AS selec…