最近,人工智能課的作業,詳細文檔就不寫了,感興趣可以聯繫我,旨在交流。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <math.h>
- #define A 2
- #define B 3
- #define Q 1
- #define N 16
- int main()
- {
- int i,j,k,m,n,q,path[N],sign[N],d[N][N];
- double l=0.2,min=65535,sum,temp,P,p[N],message[N][N];
- printf("m=");
- scanf("%d",&m);//進行m輪運算
- printf("n=");
- scanf("%d",&n);//城市個數n
- for ( i = 0; i < n; i++)//城市距離矩陣d[i][j]
- {
- for ( j = 0; j < n; j++)
- {
- scanf("%d",&d[i][j]);
- message[i][j]=1;//初始化信息素矩陣message
- }
- }
- memset(p,0,sizeof(p));
- srand((unsigned)time(NULL));//初始化隨機數
- for ( i = 0; i < m; i++)//每隻螞蟻的運動
- {
- for ( q = 0; q < n; q++)
- {
- memset(sign,0,sizeof(sign));//標記螞蟻到過的城市,保證不重複
- for ( j = 0; j < n; j++)//第j次選擇城市
- {
- if (j == 0)
- {
- path[0]=q;//螞蟻的出發城市
- sign[path[0]]=1;
- continue;
- }
- sum=0;
- for ( k = 0; k < n; k++)//計算sum
- {
- if (sign[k] == 0)//沒去過該城市,該城市變爲候選城市
- {
- sum+=pow(message[path[j-1]][k],A)*pow(1/(double)d[path[j-1]][k],B);
- }
- }
- P=0;//總的概率係數
- for ( k = 0; k < n; k++)//計算每個候選城市的概率
- {
- if (sign[k] == 0)//如果沒去過,則計算
- {
- p[k]=pow(message[path[j-1]][k],A)*pow(1/(double)d[path[j-1]][k],B)/sum;
- P+=p[k];
- }
- else//如果去過,概率是0
- {
- p[k]=0;
- }
- }
- if (P < 1)
- {
- temp=0;
- }
- else
- {
- temp=rand()%(int)P;//螞蟻的出發城市隨機生成
- }
- for ( k = 0; k < n; k++)//輪盤賭法,根據每個城市的概率大小,選擇下一個城市
- {
- temp-=p[k];
- if (temp <= 0&&sign[k] == 0)
- {
- break;//循環結束時k即爲下一個要去的城市
- }
- }
- path[j]=k;
- sign[path[j]]=1;
- }
- path[n]=path[0];
- sum=0;
- for ( k = 0; k < n; k++)
- {
- sum+=d[path[k]][path[k+1]];
- }
- if (min >= sum)//只允許在當前一直髮生的所有循環中找到最優路徑的螞蟻釋放信息素
- {
- min=sum;
- for ( k = 0; k < n; k++)
- {
- message[path[k]][path[k+1]]=(1-l)*message[path[k]][path[k+1]]+Q/sum;//更新信息素
- if (message[path[k]][path[k+1]] > 1)//最大最小螞蟻系統中限定上界下界
- {
- message[path[k]][path[k+1]]=1;
- }
- else if (message[path[k]][path[k+1]] < 0.3)
- {
- message[path[k]][path[k+1]]=0.3;
- }
- }
- }
- for ( k = 0; k < n+1; k++)
- {
- printf("%d ",path[k]);
- }
- printf("%lf",sum);
- printf("\n");
- }
- }
- memset(sign,0,sizeof(sign));//標記螞蟻到過的城市,保證不重複
- for ( i = 0; i < n; i++)//第j次選擇城市
- {
- if (i == 0)
- {
- path[0]=0;//螞蟻的出發城市
- sign[path[0]]=1;
- continue;
- }
- k=i;
- for ( j = 0; j < n; j++)
- {
- if (message[path[i-1]][j] < message[path[i-1]][k]&&sign[j] == 0)//找到信息素濃度最小的城市
- {
- k=j;
- }
- }
- path[i]=k;
- sign[path[i]]=1;
- }
- path[n]=path[0];
- sum=0;
- for ( k = 0; k < n; k++)
- {
- sum+=d[path[k]][path[k+1]];//記錄最優路徑長度
- }
- printf("one of the best path:\n");
- for ( k = 0; k < n; k++)//打印其中一條最優路徑
- {
- printf("%d > ",path[k]);
- }
- printf("%d ",path[n]);
- printf("%lf",sum);
- printf("\n");
- for ( i = 0; i < n; i++)//打印最終的信息素濃度
- {
- for ( j = 0; j < n; j++)
- {
- printf("%lf ",message[i][j]);
- }
- printf("\n");
- }
- system("PAUSE");
- return 0;
- }