當前位置:首頁 » 操作系統 » imm演算法

imm演算法

發布時間: 2022-05-13 14:34:26

⑴ 求IMM演算法的matlab模擬代碼

function imm_extend2() %互動式多模型 初步改進
clear all;
close all;
timenum=75;
t=1;
transfer_matric=[0.98 0.02; %馬爾科夫轉移矩陣 矩陣為j行i列
0.02 0.98];
u_10=0.5; %目標1在模型i在k-1時刻的概率
u_20=0.5; %目標1在模型i在k-1時刻的概率
u=[u_10 u_20];
Q1=100; %目標1的狀態雜訊協方差陣
Q2=4000; %目標1的狀態雜訊協方差陣
R=10000; %觀測雜訊協方差陣
%R2=700;
x00_1=[0 0 0]'; %模型1估計的初始值
x00_2=[0 0 0]'; %模型2估計的初始值
p00_1=[100 0 0;
0 10 0;
0 0 0];
p00_2=[100 0 0;
0 10 0;
0 0 10];
dis=1000; %位移
vel=450; %速度
acc=50; %加速度
xx01=[dis vel 0]'; %狀態的初始值
xx02=[dis vel acc]'; %狀態的初始值
%xx2=0;
f1=[1 t 0;
0 1 0;
0 0 0]; %狀態轉移陣
f2=[1 t 0.5*t^2;
0 1 t;
0 0 1];
l1=[0.5*t^2 t 0]'; %狀態干擾陣
l2=[0.5*t^2 t 1]';
h=[1 0 0]; %觀測轉移陣
I=[1 0 0;
0 1 0;
0 0 1];
num=1;
XX1=zeros(3,25);
XX2=XX1;
XX3=XX1;
while num<=timenum
if num<=25
xx1=f1*xx01+l1*sqrt(Q1); %目標的狀態值
XX1(:,num)=xx1;
z(num)=h*xx1+sqrt(R)*randn(1); %目標的觀測值
else
if 25<num<=50
xx2=f2*xx02+l2*sqrt(Q2); %目標的狀態值
XX2(:,num-25)=xx2;
z(num)=h*xx2+sqrt(R)*randn(1); %目標的觀測值
else
if 50<num<=timenum
xx3=f1*xx01+l1*sqrt(Q1); %目標的狀態值
XX3(:,num-50)=xx3;
z(num)=h*xx3+sqrt(R)*randn(1); %目標的觀測值
end;
end;
end;

%================input alternation==============================
tran_11=transfer_matric(1,1)*u(1);
tran_12=transfer_matric(1,2)*u(1);
tran_21=transfer_matric(2,1)*u(2);
tran_22=transfer_matric(2,2)*u(2);
sum_tran_j1=tran_11+tran_21;
sum_tran_j2=tran_12+tran_22;
sum_tran_j=[sum_tran_j1 sum_tran_j2];
u_mix(1,1)=tran_11/sum_tran_j1;
u_mix(1,2)=tran_12/sum_tran_j2;
u_mix(2,1)=tran_21/sum_tran_j1;
u_mix(2,2)=tran_22/sum_tran_j2;
% for i=1:2
% x00_estimate_j(i)=sum_tran_j(i)*x00(i);
% p00_estimate_j(i)=sum_tran_j(i)*(p00+(x00-x00_estimate_j(i))*(x00-x00_estimate_j(i))');%p00_estimate以行存儲
%end;
x00_estimate_j(:,1)=x00_1*u_mix(1,1)+x00_2*u_mix(2,1);
x00_estimate_j(:,2)=x00_1*u_mix(1,2)+x00_2*u_mix(2,2);
p00_estimate_j1=(p00_1+(x00_1-x00_estimate_j(:,1))*(x00_1-x00_estimate_j(:,1))')*u_mix(1,1)+...
(p00_2+(x00_2-x00_estimate_j(:,1))*(x00_2-x00_estimate_j(:,1))')*u_mix(2,1);
p00_estimate_j2=(p00_1+(x00_1-x00_estimate_j(:,2))*(x00_1-x00_estimate_j(:,2))')*u_mix(1,2)+...
(p00_2+(x00_2-x00_estimate_j(:,2))*(x00_2-x00_estimate_j(:,2))')*u_mix(2,2);
%==================filter calculate=================================
%================model 1===================================
x1_pre=f1*x00_estimate_j(:,1);
p1_pre=f1*p00_estimate_j1*f1'+l1*Q1*l1';
s1=h*p1_pre*h'+R;
k_gain1=p1_pre*h'*inv(s1);
p1_estimate=(I-k_gain1*h)*p1_pre;
v1=z(num)-h*x1_pre;
x1_estimate=x1_pre+k_gain1*v1;
X1_estimate(:,num)=x1_estimate;
%================model 2===================================
x2_pre=f2*x00_estimate_j(:,2);
p2_pre=f2*p00_estimate_j2*f2'+l2*Q2*l2';
s2=h*p2_pre*h'+R;
k_gain2=p2_pre*h'*inv(s2);
p2_estimate=(I-k_gain2*h)*p2_pre;
v2=z(num)-h*x2_pre;
x2_estimate=x2_pre+k_gain2*v2;
X2_estimate(:,num)=x2_estimate;
%===============================================================
%===================model probability alternate=================
p_pre=[p1_pre;p2_pre];
x_pre=[x1_pre' x2_pre'];
s=[s1(1) s2(1)];
v=[v1 v2];
for i=1:2
model_fun(i)=(1/sqrt(2*pi*s(i)))*exp(-v(i)*v(i)'/(2*abs(s(i))));
end;
sum_tran=model_fun(1)*sum_tran_j1+model_fun(2)*sum_tran_j2;
u_j1=model_fun(1)*sum_tran_j1/sum_tran;
u_j2=model_fun(2)*sum_tran_j2/sum_tran;
u_j=[u_j1 u_j2];
%==============================================================
%====================output alternation=========================
x_sum=x1_estimate*u_j(1)+x2_estimate*u_j(2)

X_sum(:,num)=x_sum;
p_sum=(p1_estimate+(x_sum-x1_estimate)*(x_sum-x1_estimate)')*u_j1+(p2_estimate+(x_sum-x2_estimate)*(x_sum-x2_estimate)')*u_j2;
P_sum(3*num-2:3*num,1:3)=p_sum;
%x00=x_sum(k);
%x00=[x1_estimate(k) x2_estimate(k)];
x00_1=x1_estimate;
x00_2=x2_estimate;
%p00=[p1_estimate(k) p2_estimate(k)];
p00_1=p1_estimate;
p00_2=p2_estimate;

if (num<=25|25<num<=75)
xx01=xx1;
else if 25<num<=50
xx02=xx2;
%else
% xx01=xx3;
end;
end;

%xx2=xx_2(k);
u=[u_j1 u_j2];
num=num+1;
end;
XX=[XX1 XX2 XX3];
figure;
plot(XX(1,:)','b');
hold on;
plot(X_sum(1,:),'m')
legend('狀態','融合輸出的估計');
plot(z,'r')

xlabel('采樣次數');
ylabel('相應值');
grid;
hold off;
%figure;
%plot(p1_estimate,'b');
%hold on;
%plot(p2_estimate,'m');
%plot(p_sum,'r');
%hold off;
%legend('模型1的協方差','模型2的協方差','融合輸出的協方差');
%xlabel('采樣次數');
%ylabel('相應值');
%grid;

figure;
plot(XX(2,:)','b');
hold on;
plot(X_sum(2,:)','r');
legend('狀態','融合輸出的估計');
xlabel('采樣次數');
ylabel('相應值');
grid;
hold off;

figure;
plot(XX(3,:),'b');
hold on;
plot(X_sum(3,:)','r');
legend('狀態','融合輸出的估計');
xlabel('采樣次數');
ylabel('相應值');
grid;
hold off;
X_sum
XX

⑵ 求IMM演算法的matlab模擬代碼

function
imm_extend2()
%互動式多模型
初步改進
clear
all;
close
all;
timenum=75;
t=1;
transfer_matric=[0.98
0.02;
%馬爾科夫轉移矩陣
矩陣為j行i列
0.02
0.98];
u_10=0.5;
%目標1在模型i在k-1時刻的概率
u_20=0.5;
%目標1在模型i在k-1時刻的概率
u=[u_10
u_20];
Q1=100;
%目標1的狀態雜訊協方差陣
Q2=4000;
%目標1的狀態雜訊協方差陣
R=10000;
%觀測雜訊協方差陣
%R2=700;
x00_1=[0
0
0]';
%模型1估計的初始值
x00_2=[0
0
0]';
%模型2估計的初始值
p00_1=[100
0
0;
0
10
0;
0
0
0];
p00_2=[100
0
0;
0
10
0;
0
0
10];
dis=1000;
%位移
vel=450;
%速度
acc=50;
%加速度
xx01=[dis
vel
0]';
%狀態的初始值
xx02=[dis
vel
acc]';
%狀態的初始值
%xx2=0;
f1=[1
t
0;
0
1
0;
0
0
0];
%狀態轉移陣
f2=[1
t
0.5*t^2;
0
1
t;
0
0
1];
l1=[0.5*t^2
t
0]';
%狀態干擾陣
l2=[0.5*t^2
t
1]';
h=[1
0
0];
%觀測轉移陣
I=[1
0
0;
0
1
0;
0
0
1];
num=1;
XX1=zeros(3,25);
XX2=XX1;
XX3=XX1;
while
num<=timenum
if
num<=25
xx1=f1*xx01+l1*sqrt(Q1);
%目標的狀態值
XX1(:,num)=xx1;
z(num)=h*xx1+sqrt(R)*randn(1);
%目標的觀測值
else
if
25<num<=50
xx2=f2*xx02+l2*sqrt(Q2);
%目標的狀態值
XX2(:,num-25)=xx2;
z(num)=h*xx2+sqrt(R)*randn(1);
%目標的觀測值
else
if
50<num<=timenum
xx3=f1*xx01+l1*sqrt(Q1);
%目標的狀態值
XX3(:,num-50)=xx3;
z(num)=h*xx3+sqrt(R)*randn(1);
%目標的觀測值
end;
end;
end;
%================input
alternation==============================
tran_11=transfer_matric(1,1)*u(1);
tran_12=transfer_matric(1,2)*u(1);
tran_21=transfer_matric(2,1)*u(2);
tran_22=transfer_matric(2,2)*u(2);
sum_tran_j1=tran_11+tran_21;
sum_tran_j2=tran_12+tran_22;
sum_tran_j=[sum_tran_j1
sum_tran_j2];
u_mix(1,1)=tran_11/sum_tran_j1;
u_mix(1,2)=tran_12/sum_tran_j2;
u_mix(2,1)=tran_21/sum_tran_j1;
u_mix(2,2)=tran_22/sum_tran_j2;
%
for
i=1:2
%
x00_estimate_j(i)=sum_tran_j(i)*x00(i);
%
p00_estimate_j(i)=sum_tran_j(i)*(p00+(x00-x00_estimate_j(i))*(x00-x00_estimate_j(i))');%p00_estimate以行存儲
%end;
x00_estimate_j(:,1)=x00_1*u_mix(1,1)+x00_2*u_mix(2,1);
x00_estimate_j(:,2)=x00_1*u_mix(1,2)+x00_2*u_mix(2,2);
p00_estimate_j1=(p00_1+(x00_1-x00_estimate_j(:,1))*(x00_1-x00_estimate_j(:,1))')*u_mix(1,1)+...
(p00_2+(x00_2-x00_estimate_j(:,1))*(x00_2-x00_estimate_j(:,1))')*u_mix(2,1);
p00_estimate_j2=(p00_1+(x00_1-x00_estimate_j(:,2))*(x00_1-x00_estimate_j(:,2))')*u_mix(1,2)+...
(p00_2+(x00_2-x00_estimate_j(:,2))*(x00_2-x00_estimate_j(:,2))')*u_mix(2,2);
%==================filter
calculate=================================
%================model
1===================================
x1_pre=f1*x00_estimate_j(:,1);
p1_pre=f1*p00_estimate_j1*f1'+l1*Q1*l1';
s1=h*p1_pre*h'+R;
k_gain1=p1_pre*h'*inv(s1);
p1_estimate=(I-k_gain1*h)*p1_pre;
v1=z(num)-h*x1_pre;
x1_estimate=x1_pre+k_gain1*v1;
X1_estimate(:,num)=x1_estimate;
%================model
2===================================
x2_pre=f2*x00_estimate_j(:,2);
p2_pre=f2*p00_estimate_j2*f2'+l2*Q2*l2';
s2=h*p2_pre*h'+R;
k_gain2=p2_pre*h'*inv(s2);
p2_estimate=(I-k_gain2*h)*p2_pre;
v2=z(num)-h*x2_pre;
x2_estimate=x2_pre+k_gain2*v2;
X2_estimate(:,num)=x2_estimate;
%===============================================================
%===================model
probability
alternate=================
p_pre=[p1_pre;p2_pre];
x_pre=[x1_pre'
x2_pre'];
s=[s1(1)
s2(1)];
v=[v1
v2];
for
i=1:2
model_fun(i)=(1/sqrt(2*pi*s(i)))*exp(-v(i)*v(i)'/(2*abs(s(i))));
end;
sum_tran=model_fun(1)*sum_tran_j1+model_fun(2)*sum_tran_j2;
u_j1=model_fun(1)*sum_tran_j1/sum_tran;
u_j2=model_fun(2)*sum_tran_j2/sum_tran;
u_j=[u_j1
u_j2];
%==============================================================
%====================output
alternation=========================
x_sum=x1_estimate*u_j(1)+x2_estimate*u_j(2)
X_sum(:,num)=x_sum;
p_sum=(p1_estimate+(x_sum-x1_estimate)*(x_sum-x1_estimate)')*u_j1+(p2_estimate+(x_sum-x2_estimate)*(x_sum-x2_estimate)')*u_j2;
P_sum(3*num-2:3*num,1:3)=p_sum;
%x00=x_sum(k);
%x00=[x1_estimate(k)
x2_estimate(k)];
x00_1=x1_estimate;
x00_2=x2_estimate;
%p00=[p1_estimate(k)
p2_estimate(k)];
p00_1=p1_estimate;
p00_2=p2_estimate;
if
(num<=25|25<num<=75)
xx01=xx1;
else
if
25<num<=50
xx02=xx2;
%else
%
xx01=xx3;
end;
end;
%xx2=xx_2(k);
u=[u_j1
u_j2];
num=num+1;
end;
XX=[XX1
XX2
XX3];
figure;
plot(XX(1,:)','b');
hold
on;
plot(X_sum(1,:),'m')
legend('狀態','融合輸出的估計');
plot(z,'r')
xlabel('采樣次數');
ylabel('相應值');
grid;
hold
off;
%figure;
%plot(p1_estimate,'b');
%hold
on;
%plot(p2_estimate,'m');
%plot(p_sum,'r');
%hold
off;
%legend('模型1的協方差','模型2的協方差','融合輸出的協方差');
%xlabel('采樣次數');
%ylabel('相應值');
%grid;
figure;
plot(XX(2,:)','b');
hold
on;
plot(X_sum(2,:)','r');
legend('狀態','融合輸出的估計');
xlabel('采樣次數');
ylabel('相應值');
grid;
hold
off;
figure;
plot(XX(3,:),'b');
hold
on;
plot(X_sum(3,:)','r');
legend('狀態','融合輸出的估計');
xlabel('采樣次數');
ylabel('相應值');
grid;
hold
off;
X_sum
XX

⑶ 遺傳演算法中如何實現長度可變的編碼

看來也沒人回答了,把積分送給我吧!

附送模擬退火遺傳演算法的源程序

遺傳演算法求解f(x)=xcosx+2的最大值

其中在尺度變換部分應用到了類似模擬退火演算法部分,所有變數均使用漢語拼音很好懂

//中國電子科技集團公司

//第一研究室

//呼文韜

//[email protected]

//隨機初始種群
//編碼方式為格雷碼
//選擇方法為隨機遍歷
//採用了精英保存策略
//採用了自適應的交叉率和變異率
//採用了與模擬退火演算法相結合的尺度變換
//採用了均勻交叉法

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
#include <time.h>
#include <windows.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
#define zhenjuli 0.005
#define PI 3.14159265358
#define T0 100000//溫度要取得很高才行。
#define zhongqunshu1 200
#define zuobianjie -2000
#define youbianjie 2000
unsigned int seed=0; //seed 為種子,要設為全局變數
void mysrand(long int i) //初始化種子
{
seed = -i;
}
long a[1];
//double hunn;
//double c=4;
//設置全局變數
struct indivial
{
unsigned *chrom; //染色體;
double geti;//變數值
double shiying; //目標函數的值;
double fitness; //變換後的適應度值;
};
indivial *zuiyougeti;//精英保存策略
int zhongqunshu; //種群大小
indivial *nowpop;//當前代
indivial *newpop;//新一代
double sumfitness;//當代的總適應度fitness
double sumshiying;//當代的總適應度shiying
double maxfitness;//最大適應度
double avefitness;//平均適應度
double maxshiying;//最大適應度
double avgshiying;//平均適應度
float pc;//交叉概率
float pm;//變異概率
int lchrom;//染色體長度
int maxgen;//最大遺傳代數
int gen;//遺傳代數
//函數
int flipc(double ,double );//判斷是否交叉
int flipm(double );//判斷是否變異
int rnd(int low,int high);//產生low與high之間的任意數
void initialize();//遺傳演算法初始化
void preselectfitness(); //計算sumfiness,avefitness,maxfitness
void generation();
double suijibianli();//產生隨機遍歷指針
int fu(float );//選擇要復制的個體
void crossover(indivial ,indivial ,indivial &,indivial &);//交叉
void bianyi(indivial &);//變異
void mubiaohanshu(indivial &);//計算適應度
void chibianhuan(indivial &);//對shiying進行尺度變換賦給fitness
double ran1(long *);//隨機數初始
void bianma(double bianliang,unsigned *p);//編碼
double yima(unsigned *p);
void guanjiancanshujisuan();//計算shiying,根據shiying計算sumshiying,對shiying進行尺度變換變成fitness,根據fitness計算sumfitness,avefitness,maxfitness
void jingyingbaoliu();
void glp(int n,int s,int *,int (*)[1],float (*)[1]);//glp生成函數
BOOL Exist(int Val, int Num, int *Array);//判斷一個數在前面是否出現過
int cmpfitness(const void *p1,const void *p2)
{
float i=((indivial *)p1)->shiying;//現在是按照"適應度"排序,改成"個體"的話就是按照"個體"排序
float j=((indivial *)p2)->shiying;
return i<j ? -1:(i==j ? 0:1);//現在是按升序牌排列,將1和-1互換後就是按降序排列
}
void main()
{
initialize();
cout<<zuiyougeti->geti<<" "<<zuiyougeti->shiying<<endl;/////////////
for(gen=1;gen<maxgen;gen++)
{ generation();
}
jingyingbaoliu();
cout<<setiosflags(ios::fixed)<<setprecision(6)<<zuiyougeti->geti<<" "<<setiosflags(ios::fixed)<<setprecision(6)<<(zuiyougeti->shiying)<<endl;////////////////
delete [] newpop;
delete [] nowpop;
delete [] zuiyougeti;
system("pause");
}
void initialize()
{
int q[zhongqunshu1][1],s=1;
float xx[zhongqunshu1][1];//生成的glp用x儲存
int h[1]={1};//生成向量
zuiyougeti=new indivial;//最優個體的生成
zhongqunshu=200;//種群數量
nowpop=new indivial[zhongqunshu1];//當代
newpop=new indivial[zhongqunshu1];//新一代
maxgen=150;//最大代數
gen=0;//起始代
lchrom=22;//基因數量的初始化
mysrand(time(0));//隨機數種子
a[0]=seed;//隨機數種子
//對最優個體的初始化
zuiyougeti->geti=0;
zuiyougeti->fitness=0;
zuiyougeti->shiying=0;
//
glp(zhongqunshu,s,h,q,xx);
//for(int i=0;i<zhongqunshu1;i++)//產生初始種群
//{
// for(int j=0;j<s;j++)
// {
// nowpop[i].geti=zuobianjie+(youbianjie-zuobianjie)*xx[i][j];
// }
//}
for(int i=0;i<zhongqunshu1;i++)//產生初始種群
{
nowpop[i].geti=zuobianjie+(youbianjie-(zuobianjie))*ran1(a);
}
//nowpop[0].geti=999;//////////////////////////
guanjiancanshujisuan();
jingyingbaoliu(); //精英保留的實現
guanjiancanshujisuan();//計算shiying,根據shiying計算sumshiying,對shiying進行尺度變換變成fitness,根據fitness計算sumfitness,avefitness,maxfitness
}
void jingyingbaoliu() //精英保留的實現
{
indivial *zuiyougetiguo;
zuiyougetiguo=new indivial[zhongqunshu1];//建立一個過渡數組
for(int i=0;i<zhongqunshu;i++)//將當代個體復制到過渡數組中
zuiyougetiguo[i]=nowpop[i];
qsort(zuiyougetiguo,zhongqunshu1,sizeof(indivial),&cmpfitness);//按fitness升序排序
// cout<<"zuiyougetiguo適應度:"<<zuiyougetiguo[zhongqunshu1-1].shiying<<endl;///////////
// cout<<"zuiyougeti適應度:"<<zuiyougeti->shiying<<endl;///////////////////
//system("pause");
if(zuiyougetiguo[zhongqunshu-1].shiying>zuiyougeti->shiying)
{
*zuiyougeti=zuiyougetiguo[zhongqunshu1-1];//如果最優個體的fitness比當代最大的fitness小則用當代的代替之
//cout<<"zuiyougetiguo個體:"<<zuiyougetiguo[zhongqunshu1-1].geti<<endl;/////////////
//cout<<"zuiyougeti個體:"<<zuiyougeti->geti<<endl;/////////////
}
else
nowpop[rnd(0,(zhongqunshu1-1))]=*zuiyougeti;//否則的話從當代中隨機挑選一個用最優個體代替之
delete [] zuiyougetiguo;//釋放過渡數組
}
void guanjiancanshujisuan()//計算shiying,根據shiying計算sumshiying,對shiying進行尺度變換變成fitness,根據fitness計算sumfitness,avefitness,maxfitness
{
for(int i=0;i<zhongqunshu;i++)//計算shiying
mubiaohanshu(nowpop[i]);
for(i=0;i<zhongqunshu;i++)//對shiying進行尺度變換變成fitness
chibianhuan(nowpop[i]);
preselectfitness();//根據fitness計算sumfitness,avefitness,maxfitness
}
void mubiaohanshu(indivial &bianliang)//計算shiying
{
bianliang.shiying=(bianliang.geti*cos(bianliang.geti)+2.0);//目標函數
}
void chibianhuan(indivial &bianliang)//對shiying進行尺度變換變成fitness
{
double T;//退火溫度
T=T0*(pow(0.99,(gen+1-1)));
double sum=0;
for(int j=0;j<zhongqunshu;j++)
sum+=exp(nowpop[j].shiying/T);
bianliang.fitness=exp(bianliang.shiying/T)/sum;//算出fitness
}
void preselectfitness()//根據fitness計算sumfitness,avefitness,maxfitness
{
int j;
sumfitness=0;
for(j=0;j<zhongqunshu;j++)
sumfitness+=nowpop[j].fitness;
indivial *guo;
guo=new indivial[zhongqunshu1];
for(j=0;j<zhongqunshu;j++)
guo[j]=nowpop[j];
qsort(guo,zhongqunshu1,sizeof(indivial),&cmpfitness);
maxfitness=guo[zhongqunshu1-1].fitness;
avefitness=sumfitness/zhongqunshu1;
delete [] guo;
}
void generation()
{
indivial fuqin1,fuqin2,*pipeiguo,*pipeichi;
int *peiishuzu;//用來存放產生的隨機配對
pipeiguo=new indivial[zhongqunshu1];
pipeichi=new indivial[zhongqunshu1];
peiishuzu=new int[zhongqunshu1];
int member1,member2,j=0,fujishu=0,i=0,temp=0,tt=0;
float zhen;
//隨機遍歷的實現
for(zhen=suijibianli();zhen<1;(zhen=zhen+zhenjuli))//設定指針1/66
{
pipeichi[fujishu]=nowpop[fu(zhen)];
fujishu++;
}

//交叉與變異的實現
//交叉
for(i=0;i<zhongqunshu1;i++)
{
peiishuzu[i]=-1;
}
for (i=0; i<zhongqunshu1; i++)
{
temp =rnd(0,zhongqunshu1-1); //產生值在0-zhongqunshu1-1的隨機數
while(Exist(temp, i, peiishuzu))//判斷產生的隨機數是否已經產生過,如果是,則再產生一個隨機數
{
temp =rnd(0,zhongqunshu1-1);
}
//如果沒有的話,則把產生的隨機數放在peiishuzu中
*(peiishuzu+i) = temp;
}
for(i=0;i<zhongqunshu1-1;i=i+2)
{
fuqin1=pipeichi[peiishuzu[i]];
fuqin2=pipeichi[peiishuzu[i+1]];
crossover(fuqin1,fuqin2,newpop[i],newpop[i+1]);
}
for(j=0;j<zhongqunshu1;j++)
{
//if(newpop[j].geti<-1000)
//cout<<"個體數值小於下界了";
nowpop[j].geti=newpop[j].geti;
}
//
guanjiancanshujisuan();
//變異的實現
for(j=0;j<zhongqunshu;j++)
{
bianyi(nowpop[j]);
}
//
guanjiancanshujisuan();
//精英保留的實現
jingyingbaoliu();
//
guanjiancanshujisuan();
delete [] peiishuzu;
delete [] pipeichi;
delete [] pipeiguo;
}
void crossover(indivial parent1,indivial parent2,indivial &child1,indivial &child2)//交叉
{
int j;
unsigned *panan;
panan=new unsigned[lchrom];
parent1.chrom=new unsigned[lchrom];
parent2.chrom=new unsigned[lchrom];
child1.chrom=new unsigned[lchrom];
child2.chrom=new unsigned[lchrom];
//cout<<"jiaocha"<<endl;///////////////////////
bianma(parent1.geti,parent1.chrom);
bianma(parent2.geti,parent2.chrom);
if(flipc(parent1.fitness,parent2.fitness))
{
for(j=0;j<lchrom;j++)
panan[j]=rnd(0,1);
//for(j=0;j<lchrom;j++)////////////////
// {
// cout<<panan[j];/////////////
// }
// cout<<endl;////////////////
// system("pause");////////////////
for(j=0;j<lchrom;j++)
{
if(panan[j]==1)
child1.chrom[j]=parent1.chrom[j];
else
child1.chrom[j]=parent2.chrom[j];
}
for(j=0;j<lchrom;j++)
{
if(panan[j]==0)
child2.chrom[j]=parent1.chrom[j];
else
child2.chrom[j]=parent2.chrom[j];
}
//for(j=0;j<lchrom;j++)////////////////
//{
// cout<<child1.chrom[j];/////////////
// }
//cout<<endl;////////////////
// system("pause");////////////////
child1.geti=yima(child1.chrom);
child2.geti=yima(child2.chrom);
delete [] child2.chrom;
delete [] child1.chrom;
delete [] parent2.chrom;
delete [] parent1.chrom;
delete [] panan;
}
else
{
for(j=0;j<lchrom;j++)
{
child1.chrom[j]=parent1.chrom[j];
child2.chrom[j]=parent2.chrom[j];
}
child1.geti=yima(child1.chrom);
child2.geti=yima(child2.chrom);
delete [] child2.chrom;
delete [] child1.chrom;
delete [] parent2.chrom;
delete [] parent1.chrom;
delete [] panan;
}
}
void bianyi(indivial &child)//變異
{
child.chrom=new unsigned[lchrom];
//cout<<"變異"<<endl;
bianma(child.geti,child.chrom);
for(int i=0;i<lchrom;i++)
if(flipm(child.fitness))
{
if(child.chrom[i]=0)
child.chrom[i]=1;
else
child.chrom[i]=0;
}
child.geti=yima(child.chrom);
delete [] child.chrom;
}
void bianma(double bianliang,unsigned *p)//編碼
{
unsigned *q;
unsigned *gray;
q=new unsigned[lchrom];
gray=new unsigned[lchrom];
int x=0;
int i=0,j=0;
if(bianliang<zuobianjie)///////////////////
{
cout<<"bianliang:"<<bianliang<<endl;/////////
system("pause");
}
//cout<<youbianjie-(zuobianjie)<<endl;
//system("pause");
x=(bianliang-(zuobianjie))*((pow(2,lchrom)-1)/(youbianjie-(zuobianjie)));
//cout<<x<<endl;///////////
if(x<0)
system("pause");///////////
for(i=0;i<lchrom;i++)
{
q[i]=0;
p[i]=0;
}
i=0;
while (x!=0&&(i!=lchrom))
{
q[i]=(unsigned)(x%2);
x=x/2;
i++;
}
// for(i=0;i<lchrom;i++)//////////////////
// cout<<q[i];///////////////
// cout<<endl;///////////
int w=lchrom-1;
if(q[w]!=0&&q[w]!=1)
system("pause");
for(j=0;j<lchrom&&w>0;j++)
{
p[j]=q[w];
w--;
}
//cout<<"yuanma"<<endl;
//for(j=0;j<lchrom;j++)///////////
// cout<<p[j];////////
//cout<<endl;////////////////////
gray[0]=p[0];
for(j=1;j<lchrom;j++)
{
if(p[j-1]==p[j])
gray[j]=0;
else if(p[j-1]!=p[j])
gray[j]=1;
}
for(j=0;j<lchrom;j++)
p[j]=gray[j];
//cout<<"geleima"<<endl;
//for(j=0;j<lchrom;j++)///////////
// cout<<p[j];////////
//cout<<endl;////////////////////
//system("pause");///////////

delete [] gray;
delete [] q;
}
double yima(unsigned *p) //解碼
{

int i=0;
// for(i=0;i<lchrom;i++)/////////
// {
// cout<<p[i];//////
// }
// cout<<endl;/////////
// system("pause");//////////
int x=0;
unsigned *q;
q=new unsigned[lchrom];
q[0]=p[0];
// cout<<q[0]<<endl;//////////////////
// system("pause");//////////

for(int j=1;j<lchrom;j++)
{
if(q[j-1]==p[j])
q[j]=0;
else if(q[j-1]!=p[j])
q[j]=1;
}
// for(i=0;i<lchrom;i++)//////
// {
// cout<<q[i];//////////
// if(q[i]!=0&&q[i]!=1)
// {
// cout<<q[i];
// system("pause");
// }
// }
// cout<<endl;////////
// system("pause");///////////////////
for(i=0;i<lchrom;i++)
x=x+q[i]*pow(2,(lchrom-i-1));
if(x<0)
{
cout<<"解碼出錯1"<<endl;
system("pause");
}
//cout<<"x:"<<x<<endl;
double bianliang;
//cout<<pow(2,22)<<endl;
//cout<<2000*x<<endl;
//cout<<(x*(2000/(pow(2,22)-1)))<<endl;
bianliang=(x*((youbianjie-(zuobianjie))/(pow(2,lchrom)-1)))+zuobianjie;
if(bianliang<zuobianjie)
{
cout<<"解碼出錯2"<<endl;
system("pause");
}
delete [] q;
return bianliang;
}
double ran1(long *im)
{
int j;
long k;
static long im2=123456789;
static long iy=0;
static long iv[NTAB];
float temp;
if (*im <= 0)
{
if (-(*im) < 1) *im=1;
else *im = -(*im);
im2=(*im);
for (j=NTAB+7;j>=0;j--)
{
k=(*im)/IQ1;
*im=IA1*(*im-k*IQ1)-k*IR1;
if (*im < 0) *im += IM1;
if (j < NTAB) iv[j] = *im;
}
iy=iv[0];
}
k=(*im)/IQ1;
*im=IA1*(*im-k*IQ1)-k*IR1;
if (*im < 0) *im += IM1;
k=im2/IQ2;
im2=IA2*(im2-k*IQ2)-k*IR2;
if (im2 < 0) im2 += IM2;
j=iy/NDIV;
iy=iv[j]-im2;
iv[j] = *im;
if (iy < 1) iy += IMM1;
if ((temp=AM*iy) > RNMX) return RNMX;
else return temp;
}
double suijibianli()//隨機遍歷
{
double i=ran1(a);
while(i>zhenjuli)
{
i=ran1(a);
}
//cout<<i<<endl;//////////////
return i;
}
int fu(float p)//復制
{
int i;
double sum=0;
if(sumfitness!=0)
{
for(i=0;(sum<p)&&(i<zhongqunshu);i++)
sum+=nowpop[i].fitness/sumfitness;
}
else
i=rnd(1,zhongqunshu1);
return(i-1);
}

int rnd(int low, int high) /*在整數low和high之間產生一個隨機整數*/
{
int i;
if(low >= high)
i = low;
else
{
i =(int)((ran1(a) * (high - low + 1)) + low);
if(i > high) i = high;
}
return(i);
}
int flipc(double p,double q)//判斷是否交叉
{
double pc1=0.9,pc2=0.6;
if((p-q)>0)
{
if(p>=avefitness)
{
pc=pc1-(pc1-pc2)*(p-avefitness)/(maxfitness-avefitness);
}
else
pc=pc1;
}
else
{
if(q>=avefitness)
{
pc=pc1-(pc1-pc2)*(q-avefitness)/(maxfitness-avefitness);
}
else
pc=pc1;
}
if(ran1(a)<=pc)
return(1);
else
return(0);
}
int flipm(double p)//判斷是否變異
{
double pm1=0.001,pm2=0.0001;
if(p>=avefitness)
{
pm=(pm1-(pm1-pm2)*(maxfitness-p)/(maxfitness-avefitness));
}
else
pm=pm1;
if(ran1(a)<=pm)
return(1);
else
return(0);
}
void glp(int n,int s,int *h,int (*q)[1],float (*xx)[1])//glp
{
int i=0,j=0;
//求解q
for(i=0;i<n;i++)
{
for(j=0;j<s;j++)
{
*(*(q+i)+j)=((i+1)*(*(h+j)))%n;
}
}
i=n-1;
for(j=0;j<s;j++)
{
*(*(q+i)+j)=n;
}
//求解x
for(i=0;i<n;i++)
{
for(j=0;j<s;j++)
{
*(*(xx+i)+j)=(float)(2*(*(*(q+i)+j))-1)/(2*n);
}
}
}
BOOL Exist(int Val, int Num, int *Array)//判斷一個數是否在一個數組的前Num個數中
{
BOOL FLAG = FALSE;
int i;
for (i=0; i<Num; i++)
if (Val == *(Array + i))
{
FLAG = TRUE;
break;
}
return FLAG;
}

⑷ pso的多目標優化

在多目標優化問題中,每個目標函數可以分別獨立進行優化,然後為每個目標找到最優值。但是,很少能找到對所有目標都是最優的完美解,因為目標之間經常是互相沖突的,只能找到Pareto最優解。
PSO演算法中的信息共享機制與其他基於種群的優化工具有很大的不同。在遺傳演算法(GA)中,染色體通過交叉互相交換信息,是一種雙向信息共享機制。但是在PSO演算法中,只有gBest(或nBest)給其他微粒提供信息,是一種單向信息共享機制。由於點吸引特性,傳統的PSO演算法不能同時定位構成Pareto前鋒的多個最優點。雖然通過對所有目標函數賦予不同的權重將其組合起來並進行多次運行,可以獲得多個最優解,但是還是希望有方法能夠一次同時找到一組Pareto最優解。
在PSO演算法中,一個微粒是一個獨立的智能體,基於其自身和同伴的經驗來搜索問題空間。前者為微粒更新公式中的認知部分,後者為社會部分,這二者在引導微粒的搜索方面都有關鍵的作用。因此,選擇適當的社會和認知引導者(gBest和pBest)就是MO-PSO演算法的關鍵點。認知引導者的選擇和傳統PSO演算法應遵循相同的規則,唯一的區別在於引導者應按照Pareto支配性來確定。社會引導者的選擇包括兩個步驟。第一步是建立一個從中選取引導者的候選池。在傳統PSO演算法中,引導者從鄰居的pBest之中選取。而在MO-PSO演算法中更常用的方法是使用一個外部池來存儲更多的Pareto最優解。第二步就是選擇引導者。gBest的選擇應滿足如下兩個標准:首先,它應該能為微粒提供有效的引導來獲得更好的收斂速度;第二,它還需要沿Pareo前鋒來提供平衡的搜索,以維持種群的多樣性。文獻中通常使用兩種典型的方法:(1)輪盤選擇模式,該方式按照某種標准進行隨機選擇,其目的是維持種群的多樣性;(2)數量標准:按照某種不涉及隨機選擇的過程來確定社會引導者。
Moore最早研究了PSO演算法在多目標優化中的應用,強調了個體和群體搜索二者的重要性,但是沒有採用任何維持多樣性的方法。Coello在非劣最優概念的基礎上應用了一個外部「容器」來記錄已找到的非支配向量,並用這些解來指導其它微粒的飛行。Fieldsend採用一種稱為支配樹的數據結構來對最優微粒進行排序。Parsopoulos應用了權重聚合的方法。Hu應用了動態鄰域,並在此基礎上利用擴展記憶,按詞典順序依次優化各個目標。Ray使用聚集機制來維持多樣性,並用一個多水平篩來處理約束。Lu使用了動態種群策略。Bartz-Beielstein採用歸檔技術來提高演算法性能。Li在PSO演算法中採用NSGA-II演算法中的主要機制,在局部最優微粒及其後代微粒之間確定局部最優微粒;並此基礎上又提出一種新的演算法,在適應值函數中使用最大最小策略來確定Pareto支配性。張利彪使用多個目標函數下各最優位置的均值來指導微粒飛行。Pulido使用多個子種群並採用聚類技術來求解多目標規劃問題。Mahfouf採用加權聚合方法來計算微粒的適應值,並據此確定引導微粒的搜索。Salazar-Lechuga使用適應值共享技術來引導微粒的搜索。Gong提出微粒角度的概念,並使用最小微粒角度和微粒密度來確定局部最優和全局最優微粒。基於AER模型,Zhang提出一種新的智能PSO模型,來將種群驅向Pareto最優解集。Ho提出一種新的適應值分配機制,並使用壽命(Age)變數來保存和選擇最優歷史記錄。Huang將CLPSO演算法應用到多目標規劃中。Ho提出另一種基於Pareto的與尺度無關的適應值函數,並使用一種基於正交試驗設計的智能運動機制(IMM)來確定微粒的下一步運動。Branke系統研究了多種個體最優微粒的選擇方法對MOPSO演算法性能的影響。張勇考慮儲備集更新策略在多目標PSO演算法中的關鍵作用,提出一種兩階段儲備集更新策略。
原萍提出一種分布式PSO演算法—分割域多目標PSO演算法(DRMPSO),並將其應用到基站優化問題。向量評價PSO演算法(VEPSO)是一種受向量評價遺傳演算法(VEGA)的啟發提出的一種演算法,在VEPSO演算法中,每個種群僅使用多個目標函數之一來進行評價,同時各種群之間互相交互經驗。將每個種群分配到一台網路PC上,即可直接使VEPSO演算法並行化,以加速收斂。Vlachogiannis應用並行VEPSO演算法來確定發電機對輸電系統的貢獻。熊盛武利用PSO演算法的信息傳遞機制,在PSO演算法中引入多目標演化演算法常用的歸檔技術,並採用環境選擇和配對選擇策略,使得整個群體在保持適當的選擇壓力的情況下收斂於Pareto最優解集。
由於適應值的計算非常消耗計算資源,為了減少計算量,需要減少適應值評價的次數。Reyes-Sierra採用適應值繼承和估計技術來實現該目標,並比較了十五種適應值繼承技術和四種估計技術應用於多目標PSO演算法時的效果。
保持MOPSO中的多樣性的方法主要有兩種:sigma方法和ε-支配方法。Villalobos-Arias在目標函數空間中引入條塊劃分來形成聚類,從而保持多樣性。

⑸ 求助IMM演算法與GPB演算法模擬對比

這個簡單,把數據輸入電腦,按1厘米一個檔次進行窮舉,頂多窮舉個幾百次最優解就出來了,計算機一會就算完了

⑹ imm什麼意思

IMM
abbr. Institution of Mining and Metallurgy<英>礦冶學會;
[例句]A novel two-layer interactive multiple model ( IMM) tracking algorithm for turn maneuver is proposed.
針對轉彎機動目標跟蹤,提出了一種兩層交互多模型(IMM)跟蹤演算法。

⑺ imm推出的某九十天國庫券期貨的報價為95試計算該國債期貨的價格

這你可以在官網就可以處理ID啊

⑻ 最好的背單詞軟體

Memoryer™新一代神經網路背單詞軟體,由記憶工場™的腦與神經科學、認知心理學和人工智慧領域的科學家團隊研製,具有獨步全球的個性化多核記憶引擎IMME;獨有的隔夜/長時記憶力演算法,在抗遺忘方面處於世界領先地位;有史以來最大的英語單詞記憶編碼庫;新一代人工智慧虛擬老師;可能是你見過的最酷的在線成績單;7大排行榜,網友大比拼;記憶論壇是學習記憶大師專業記憶術的好地方;易記網路邀請你分享所有學科的最佳記憶方法和快速記憶策略;Memoryer經過上千次的腦波分析驗證和優化,被評為最酷最好的背單詞軟體。

⑼ 目標跟蹤都有那些演算法

目標跟蹤,利用相鄰兩幀的區域匹配從圖像序列中建立目標鏈,跟蹤目標從進入監視范圍到駛離監視范圍的整個過程。首稱要確定匹配准則。常用的圖像匹配方法有Hausdorff距離區域法和圖像互相關。

熱點內容
android鎖屏廣播 發布:2024-10-10 03:21:41 瀏覽:579
上傳說的薩滿卡組 發布:2024-10-10 03:21:35 瀏覽:18
優酷視頻緩存文件 發布:2024-10-10 03:20:54 瀏覽:658
sqlutc時間 發布:2024-10-10 03:19:40 瀏覽:256
陰陽師舉報腳本 發布:2024-10-10 03:18:54 瀏覽:745
蘋果4s手機忘記id密碼怎麼辦 發布:2024-10-10 03:15:59 瀏覽:119
有哪些配置高的小型車 發布:2024-10-10 03:14:53 瀏覽:757
在網上買電腦怎麼選擇配置 發布:2024-10-10 02:46:45 瀏覽:339
控制邏輯演算法 發布:2024-10-10 02:32:22 瀏覽:756
蘭州達內java培訓 發布:2024-10-10 02:31:48 瀏覽:327