?? dmfunc.c
字號:
/*---------------------------DMFunc.c-----------------------------------*/
/*-----------算法相關函數----------*/
/*-----------求和--------------*/
float Sigama(float a[],int L)
{
/*------求得數組a[]中從下標0到L-1的元素之和。函數返回該和值-----*/
int i;
float temp=0;
for(i=0;i<L;i++)
temp+=a[i];
return temp;
}
/*-----------求最大值--------*/
float findMax(float a[],int L)
{
/*求得數組a[]中從下標0到L-1各元素的最大值。函數返回該最大值*/
int i;
float temp;
for(i=0;i<L-1;i++) /*冒泡排序一輪將各元素的最大值交換到a[L-1]中*/
if(a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
return a[L-1]; /*----返回最大值----*/
}
/*------------求最小值--------*/
float findMin(float a[],int L)
{
int i;
float temp;
for(i=0;i<L-1;i++) /*--冒泡排序一輪將各元素的最大值交換到a[L-1]中---*/
if(a[i]<a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
return a[L-1];
}
/*--------------對各個方案的貼近度和距離進行排序------------------*/
void Taxis(struct Target Tank[],int pNum)
{ /*----在定義的結構struct Target中定義了指示當前方案的貼近度和距離在各個方案中按大小排序所得到的序號TIndex和dIndex。此函數將各方案的TIndex和dIndex分別進行排序,得到其相應的排序號----*/
int i,j;
for(i=0;i<pNum;i++)
/*從第一個開始,將第i個和第i+1個進行比較,若i的距離(或貼近度)大,*/
for(j=i+1;j<pNum;j++)
/* 則i的距離序號(或貼近度序號)加1,否則,i+1的距離序號-*/
{ /*-(或貼近度序號)加1-------------*/
if(Tank[i].d>Tank[j].d)
Tank[i].dIndex++;
else
Tank[j].dIndex++;
if(Tank[i].T>Tank[j].T)
Tank[i].TIndex++;
else
Tank[j].TIndex++;
}
}
/*-----------獲得當前各輛坦克的指標數據---------------------*/
void GetTData()
{
int i,d=40;
float x,y;
for(i=0;i<n;i++)
{
x=Tank[i].x;
y=Tank[i].y;
Tank[i].distance=sqrt((x-emp.x)*(x-emp.y)+(y-emp.y)*(y-emp.y));
Tank[i].distance=1-Tank[i].distance/1000; /*求得距離的指標*/
switch(Tank[i].color) /*根據目標顏色確定其攻擊力值*/
{
case WHITE:
Tank[i].power=0.5;
break;
case YELLOW:
Tank[i].power=0.6;
break;
case RED:
Tank[i].power=0.7;
break;
}
switch(Tank[i].direction) /*根據目標當前方向值來定量*/
{
case 1: /*方向為右時*/
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth)
/*如果目標位于大本營水平左側*/
Tank[i].inva=0.9;
else
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth)
/*如果目標位于大本營水平右側*/
Tank[i].inva=0.7;
else
if(Tank[i].y<emp.y-emp.lenth && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于大本營上沿寬度為二倍坦克直徑的水平區域帶*/
Tank[i].inva=0.7;
else
Tank[i].inva=0.5; /*目標位于其他區域*/
break;
case -1: /*方向為左時*/
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth)
/*如果目標位于大本營水平右側*/
Tank[i].inva=0.9;
else
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth)
/*如果目標位于大本營水平左側*/
Tank[i].inva=0.7;
else
if(Tank[i].y<emp.y-emp.lenth && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于大本營上沿寬度為二倍坦克直徑的水平區域帶*/
Tank[i].inva=0.7;
else
Tank[i].inva=0.5; /*目標位于其他區域*/
break;
case 2: /*方向為下時*/
if(Tank[i].x<emp.x-emp.width && Tank[i].x>emp.x+emp.width)
/*如果目標位于大本營正上方*/
Tank[i].inva=0.9;
else
Tank[i].inva=0.6; /*目標位于其他區域*/
break;
case -2: /*方向為上時*/
if(Tank[i].x<emp.x-emp.width && Tank[i].x>emp.x+emp.width)
/*如果目標位于大本營正上方*/
Tank[i].inva=0.7;
else
Tank[i].inva=0.1; /*目標位于其他區域*/
break;
case 3: /*方向為右下時*/
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的左側水平帶*/
Tank[i].inva=0.8;
else
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的右側水平帶*/
Tank[i].inva=0.6;
else
Tank[i].inva=0.4; /*目標位于其他區域*/
break;
case -3: /*方向為左上時*/
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的右側水平帶*/
Tank[i].inva=0.8;
else
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的左側水平帶*/
Tank[i].inva=0.6;
else
Tank[i].inva=0.1; /*目標位于其他區域*/
break;
case 4: /*方向為右上時*/
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的左側水平帶*/
Tank[i].inva=0.8;
else
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的右側水平帶*/
Tank[i].inva=0.6;
else
Tank[i].inva=0.1; /*目標位于其他區域*/
break;
case -4: /*方向為左下時*/
if(Tank[i].x>emp.x+emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的右側水平帶*/
Tank[i].inva=0.8;
else
if(Tank[i].x<emp.x-emp.width && Tank[i].y>emp.y-emp.lenth-4*Tank[i].r)
/*如果目標位于從距大本營上沿為二倍坦克直徑處到演示框低部的左側水平帶*/
Tank[i].inva=0.6;
else
Tank[i].inva=0.4; /*目標位于其他區域*/
break;
}
}
}
/*-----------第一步:構造初始指標判斷矩陣----------------------------*/
void FormMatrix()
{ int i,j;
float temp[mMax][nMax]={{0.3,0.9,0.5,0.9},
{0.1,0.8,0.4,0.7},
{0.5,0.9,0.6,0.3}};
GetTData();
for(j=0;j<n;j++)
{
r[0][j]=Tank[j].distance;
r[1][j]=Tank[j].inva;
r[2][j]=Tank[j].power;
}
/*for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cprintf("%8.4f",r[i][j]);
cprintf("\n");
}*/
}
/*-----------第二步:構造加熵權的標準化指標矩陣A---------------------*/
void FormEntropyMatrix()
{
int i,j;
float temp=0,k;
k=1/log(n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(Sigama(&r[i][0],n)==0)
f[i][j]=0;
f[i][j]=r[i][j]/Sigama(&r[i][0],n);
temp+=f[i][j]*log(f[i][j]);
}
H[i]=0-k*temp;
temp=0;
}
for(i=0;i<m;i++)
Omiga[i]=(1-H[i])/(m-Sigama(&H[0],m));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
A[i][j]=Omiga[i]*r[i][j];
}
/*-----------第三步:找出理想點X[m]----------------*/
void FindPerfectPoint()
{
float a[mMax][nMax];
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=A[i][j];
for(i=0;i<m;i++)
X[i]=findMax(&a[i][0],n);
}
/*-----------第四步:計算被評方案到理想點的距離Tank[j].d-----------------*/
void CalDistance()
{
int i,j;
float sigama=0;
for(j=0;j<n;j++)
{
for(i=0;i<m;i++)
sigama+=(A[i][j]-X[i])*(A[i][j]-X[i]);
Tank[j].d=sqrt(sigama);
sigama=0;
}
}
/*-----------第五步:計算被評方案與理想點的貼近度Tank[j].T---------------*/
void CalCloseDegree()
{
int i,j;
float sigama1=0,sigama2=0;
for(j=0;j<n;j++)
{
for(i=0;i<m;i++)
{
sigama1+=A[i][j]*X[i];
sigama2+=X[i]*X[i];
}
Tank[j].T=1-sigama1/sigama2;
sigama1=0;
sigama2=0;
}
}
/*-----------第六步:根據貼近度和距離排序,找出最優目標---------*/
void FindBestT()
{
int i,j,best_flag,second_flag;
struct Target temp;
best=0;
for(i=0;i<n;i++)
{
Tank[i].dIndex=Tank[i].TIndex=1;
Tank[i].pIndex=1;
}
Taxis(&Tank[0],n);/*--------將貼近度和距離排序----------------*/
for(i=0;i<n;i++) /*---按貼近度將各方案進行排序--------*/
{
for(j=i+1;j<n;j++)
{
if(Tank[i].TIndex>Tank[j].TIndex)
{
Tank[i].pIndex++;
}
else
if(Tank[i].TIndex==Tank[j].TIndex)
/*--若貼近度相同則比較距離------*/
if(Tank[i].dIndex>Tank[j].dIndex)
{
Tank[i].pIndex++;
}
else
Tank[j].pIndex++;
else
if(Tank[i].TIndex<Tank[j].TIndex)
Tank[j].pIndex++;
}
}
for(i=0;i<n;i++)
{
if(Tank[i].pIndex==1)
{
best=i; /*--------找出最優方案,獲得其方案序號---------*/
best_flag=1;
break;
}
}
}
/*--------------------------------------------------------------*/
void Arithmetic()
{
if(n==1)
{
best=0;
return;
}
FormMatrix();
FormEntropyMatrix();
FindPerfectPoint();
CalDistance();
CalCloseDegree();
FindBestT();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -