基於遺傳演算法
㈠ matlab怎麼運行基於遺傳演算法的vrp
function [x fx string]=fun_SuiJiSuanFa2(N,genLenth,Pc,Pm,downbound,upbound,generation)
%[x fx string]=fun_SuiJiSuanFa2(6,16,0.7,0.01,-3,3,100)
%f 表示函數
%N表示染色體種群大小
%genLenth表示染色體長度
%Pc表示交叉概率
%Pm表示突變概率
%downbound
%upbound
%generation循環代數
%進制編碼,此處編寫為二進制
num=2;
initdata=randi([0 num-1],N,genLenth);
%二進制編碼的權值
weight=(num).^(genLenth/2-1:-1:0);
weights=repmat(weight,N,1);
%保存每代的最好值和平均值,
meanally=zeros(1,generation);
maxally=zeros(1,generation);
Nowx=zeros(generation,genLenth);
for k=1:generation
%解碼後的整數
allx1=sum(initdata(:,1:genLenth/2).*weights,2);
allx2=sum(initdata(:,genLenth/2+1:end).*weights,2);
%映射到取值范圍
delt=(upbound-downbound)/(num^(genLenth/2)-1);
allx1=allx1.*delt+downbound;
allx2=allx2.*delt+downbound;
%染色體的適應性
ally=f(allx1,allx2);
%平均值,最大值
meanally(k)=mean(ally);
maxally(k)=max(ally);
%找下標,確定是哪條染色體
index=find(ally==maxally(k));
Nowx(k,:)=initdata(index(1),:);
%最大值沒有提高就取上次的
if(k>=2&&maxally(k)<maxally(k-1))
maxally(k)=maxally(k-1);
Nowx(k,:)=Nowx(k-1,:);
end
%染色體的適應性比率
ratio=ally./sum(ally);
%交叉,變異
%??交叉幾個,從第幾個開始。
%此處只交叉1個(總共才6個),隨機給一個。
sumRatio=cumsum(ratio);
data=zeros(N,genLenth);
for i=1:N/2
Select1=find(sumRatio>=rand);
Select2=find(sumRatio>=rand);
data(2*i-1,:)=initdata(Select1(1),:);
data(2*i,:)=initdata(Select2(1),:);
if(rand<Pc)
%交叉
location=randi([1,genLenth]);
temp=data(2*i-1,location:end);
data(2*i-1,location:end)=data(2*i,location:end);
data(2*i,location:end)=temp;
else
%變異
if(rand<Pm)
location=randi([1,genLenth]);
data(2*i-1,location)=1-data(2*i-1,location);
end
if(rand<Pm)
location=randi([1,genLenth]);
data(2*i,location)=1-data(2*i,location);
end
end
end
initdata=data;
end
fx=max(maxally);
lastIndex=find(maxally==fx);
string=Nowx(lastIndex(1),:);
x(1)=sum(string(1:genLenth/2).*weight).*(upbound-downbound)/(num^(genLenth/2)-1)+downbound;
x(2)=sum(string(1+genLenth/2:end).*weight).*(upbound-downbound)/(num^(genLenth/2)-1)+downbound;
%繪制性能圖
%figure,hold on;
clf;figure(1),hold on;
plot((1:k)',meanally,'b.-');
plot((1:k)',maxally,'r.:');
end
function fun=f(x,y)
fun=(1-x).^2.*exp(-x.^2-(1+y).^2)-(x-x.^3-y.^3).*exp(-x.^2-y.^2);
%fun=-(x-1).^2-3.*(y-2).^2+100;
end
㈡ 基於遺傳演算法的DNA序列編碼。。誰告訴我這個題目什麼意思啊。。我只學過遺傳演算法。。。
大哥,你要真的把基因編碼寫出來了,你就是活生生的神啊。
遺傳演算法演算的遺傳編碼只是計算得到的一個或多個方程的解,代表是的是性狀,而且是種群的表現性,可以理解為宏觀遺傳學,同樣的性狀的控制基因都是不確定的,甚至還涉及到表觀遺傳學。怎麼去搞?
㈢ 基於遺傳演算法的水文頻率計算與研究
對廣西壯族自治區梧州藤縣大任河水庫1966~2005年年最大24h降雨量進行分析研究,根據經驗,採用P-Ⅲ型曲線對降雨量分布點據進行擬合,運用矩法、概率權重矩法、單權函數法、雙權函數法對P-Ⅲ型曲線的三個參數初估,把P-Ⅲ型曲線的三個參數作為GA的決策變數,分析調整得到GA決策變數的取值范圍,最後,通過GA優化決策變數的取值,計算得出設計洪水,並進行了合理性分析。結論如下:
1)採用矩法、概率權重矩法、單權函數法和雙權函數法,初估P-Ⅲ型分布曲線的三個參數,通過適當的調整,來確定GA的決策變數的取值范圍。預先設定了12組GA運行參數,從12次的程序調試運行成果中,分析確定合適的運行參數取值范圍;GA程序調試過程表明,初始的種群數要足夠大,才能保證交叉和變異操作的有效進行;初始的種群數太小,交叉和變異操作後的個體缺乏多樣性,不利於程序搜索最優點。種群規模足夠大,交叉概率為0.6和0.8時,對適應度函數收斂曲線的影響不是很大,而變異概率過大,適應度函數收斂曲線上下波動大。在實際操作中,GA的運行參數中的種群規模、交叉概率和變異概率三者之間是相互約束的。一般來說,當種群規模大時,交叉概率就相應的選擇小一點的值,但也並非一成不變,需要從整體上考慮,找出其中的平衡點,目前並沒有完善的理論加以指導,還得根據實際問題,反復不停的調試,最終才能發現適合實際情況的GA運行參數。
2)GA是一種新的自適應搜索方法,它是建立在生物遺傳學和計算機的基礎上,通過運用雜交、變異兩種運算元作為搜索工具,用適應度的函數對搜索到的解的質量進行評價,並根據評價的結果用選擇運算元來引導以後的搜索方向。
3)GA擬合曲線的精度較高,30次計算成果的相對誤差都在允許的偏差的范圍內, GA計算有效性的合格率為70%,總體上優於雙權函數法,實際應用時,需根據實際的計算結果,選擇精度高(平均相對誤差較小)的一次運算作為計算依據;同時,由於GA以及其在水文水資源系統工程中的應用尚未成熟,所以實際計算應結合計算精度也較高的雙權函數法進行比較,GA的計算可以作為一種參考,或在綜合比較和論證的情況下作為設計依據。
㈣ 基於遺傳演算法的自動組卷系統的設計與實現(畢業設計) 求大神給一個系統
請問最後您是用什麼方式實現的呢,不知是否保留代碼?誠求!(價錢可繼續商議)
㈤ 基於遺傳演算法路徑優化C++編程
[cpp]
bool CAStar::Search(int X, int Y, std::list<POINT> &lResult, double dbGapBreak)
{
if(X < 0 || Y < 0
|| X > m_dwMapWidth || Y > m_dwMapWidth ||
m_dwDestinationX < 0 || m_dwDestinationX < 0 ||
m_dwDestinationX > m_dwMapWidth || m_dwDestinationY > m_dwMapHeight)
{
//_outf("坐標或地圖參數錯誤!");
return false;
}
LPAPOINT p = new APOINT;
p->x = X;
p->y = Y;
p->parent = NULL;
p->dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//起始節點加入到開啟列表
m_lSafe.push_back(p);//加入到公共容器,任何新分配的節點,都要加入到這里,便於演算法執行完後清理
std::list<LPAPOINT>::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//這里就是反復遍歷開啟列表選擇距離最小的節點
it = GetMingapNode();
if((*it)->dbGap <= dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}
if(!m_lOpen.empty())
{
//如果列表不為空,從最後一個節點開始拷貝路徑到返回值中
//_outf("最終尋路到:%X, %X", p->x, p->y);
POINT point;
while(p)
{
point.x = p->x;
point.y = p->y;
lResult.push_front(point);
p = p->parent;
}
}
for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//清理內存
if(*it != NULL)
{
m_pMap[(*it)->y][(*it)->x] = 1;//會被添加到m_lSafe的節點,一定是最初為1的節點,所以可以在這里恢復地圖數據
delete (*it);
*it = NULL;
}
}
m_lSafe.clear();//清空容器
//_outf("耗時:%d 毫秒", clock() - dwTime);
if(m_lOpen.empty())
{
//_outf("尋路失敗");
return false;
}
m_lOpen.clear();//清空開啟列表
//_outf("尋路成功,節點數:%d", lResult.size());
return true;
}
bool CAStar::Search(int X, int Y, std::list<POINT> &lResult, double dbGapBreak)
{
if(X < 0 || Y < 0
|| X > m_dwMapWidth || Y > m_dwMapWidth ||
m_dwDestinationX < 0 || m_dwDestinationX < 0 ||
m_dwDestinationX > m_dwMapWidth || m_dwDestinationY > m_dwMapHeight)
{
//_outf("坐標或地圖參數錯誤!");
return false;
}
LPAPOINT p = new APOINT;
p->x = X;
p->y = Y;
p->parent = NULL;
p->dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//起始節點加入到開啟列表
m_lSafe.push_back(p);//加入到公共容器,任何新分配的節點,都要加入到這里,便於演算法執行完後清理
std::list<LPAPOINT>::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//這里就是反復遍歷開啟列表選擇距離最小的節點
it = GetMingapNode();
if((*it)->dbGap <= dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}
if(!m_lOpen.empty())
{
//如果列表不為空,從最後一個節點開始拷貝路徑到返回值中
//_outf("最終尋路到:%X, %X", p->x, p->y);
POINT point;
while(p)
{
point.x = p->x;
point.y = p->y;
lResult.push_front(point);
p = p->parent;
}
}
for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//清理內存
if(*it != NULL)
{
m_pMap[(*it)->y][(*it)->x] = 1;//會被添加到m_lSafe的節點,一定是最初為1的節點,所以可以在這里恢復地圖數據
delete (*it);
*it = NULL;
}
}
m_lSafe.clear();//清空容器
//_outf("耗時:%d 毫秒", clock() - dwTime);
if(m_lOpen.empty())
{
//_outf("尋路失敗");
return false;
}
m_lOpen.clear();//清空開啟列表
//_outf("尋路成功,節點數:%d", lResult.size());
return true;
}
新增的SearchEx源代碼如下:
nBeginSift 參數為循環初始值,nEndSift為循環結束值,其實就是一個for循環的起始值與結束值。
這個循環的引用計數,最終會被 乘於 10 來作為距離分段選擇路徑進行路線優化
nBeginSift 與 nEndSift的間距越大,並不表示最終路徑就越好,最終優化出來的路徑,還是會和地形有關。
其實最好路徑優化演算法是按照角度的變化來選擇路徑優化,但是預計開銷會比較大,有了這個優化方式作為基礎,你可以自己去寫根據角度變化來優化的演算法。
[cpp]
bool CAStar::SearchEx(int X, int Y, std::list<POINT> &lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::list<POINT>::iterator it = lResult.begin();
std::list<POINT>::iterator it2 = it;
std::list<POINT> l2;
for(int i = nBeginSift; i < nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))
{
SetDestinationPos(it->x, it->y);
l2.clear();
if(Search(it2->x, it2->y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}
_outf("耗時:%d 毫秒", clock() - dwTime);
return true;
}
bool CAStar::SearchEx(int X, int Y, std::list<POINT> &lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::list<POINT>::iterator it = lResult.begin();
std::list<POINT>::iterator it2 = it;
std::list<POINT> l2;
for(int i = nBeginSift; i < nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))
{
SetDestinationPos(it->x, it->y);
l2.clear();
if(Search(it2->x, it2->y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}
_outf("耗時:%d 毫秒", clock() - dwTime);
return true;
}
㈥ 基於遺傳演算法的bp模型問題——請高手給思路!!
我會! 線下聯系!已經再幫你做了
㈦ 基於遺傳演算法的多目標網路優化演算法的實現代碼
Yovf5網站優化所考慮的因素不僅僅是搜索引擎,也包括充分滿足用戶的需求特徵、清晰的網站導航、完善的在線幫助等,在此基礎上使得網站功能和信息發揮最好的效果。也就是以企業網站為基礎,與網路服務商(如搜索引擎等)、合作夥伴、顧客、供應商、銷售商等網路營銷環境中各方面因素建立良好的關系。搜索引擎會將站點彼此間的內容做一些相關性的數據比對,然後再由瀏覽器將這些內容以最快速且接近最完整的方式,呈現給搜索者。網站優化白帽方法,網站優化的白帽法包括遵循搜索引擎哪些可接受哪些不能接受的指導方針。他們的建議一般是為用戶創造內容,而非搜索引擎、是讓這些內容易於被蜘蛛機器人索引、並且不嘗試對搜索引擎系統耍花招。網站員經常於設計或構建他們的網站時,犯下致命錯誤、疏忽「毒害」該站以致排名不會很好。ivoet
㈧ 基於遺傳演算法的路徑優化
有木有誠意啊,加你的QQ的驗證問題竟然是你的真名叫什麼……