给出MMAS算法的C语言代码
时间: 2023-12-15 18:23:03 浏览: 23
以下是一个简单的MMAS算法的C语言代码,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_CITY_NUM 100 //最大城市数量
#define MAX_ANT_NUM 100 //最大蚂蚁数量
#define ALPHA 1.0 //信息素重要程度因子
#define BETA 2.0 //启发函数重要程度因子
#define RHO 0.5 //信息素挥发因子
#define Q 100 //信息素增加强度系数
#define MAX_TIMES 100 //最大迭代次数
int city_num; //城市数量
int ant_num; //蚂蚁数量
double pheromone[MAX_CITY_NUM][MAX_CITY_NUM]; //信息素矩阵
int distance[MAX_CITY_NUM][MAX_CITY_NUM]; //距离矩阵
int best_path[MAX_CITY_NUM+1]; //最优路径
int best_distance; //最优路径长度
double rand_double() //生成随机浮点数
{
return rand() / (double)RAND_MAX;
}
void init() //初始化函数
{
int i, j;
for(i=0; i<city_num; i++)
{
for(j=i+1; j<city_num; j++)
{
pheromone[i][j] = pheromone[j][i] = 1.0;
distance[i][j] = distance[j][i] = abs(rand()) % 100 + 1;
}
}
best_distance = 0x7fffffff;
}
int roulette_wheel_selection(double *p) //轮盘赌选择算法
{
double sum = 0.0;
int i;
for(i=0; i<city_num; i++)
sum += p[i];
double roulette = rand_double() * sum;
for(i=0; i<city_num; i++)
{
roulette -= p[i];
if(roulette < 0.0)
return i;
}
}
void ant_search() //蚁群搜索主函数
{
int i, j, k;
int path[MAX_CITY_NUM+1]; //当前路径
int visited[MAX_CITY_NUM]; //已访问的城市
double prob[MAX_CITY_NUM]; //选择每个城市的概率
for(i=0; i<ant_num; i++) //每只蚂蚁都要搜索一遍
{
for(j=0; j<city_num; j++)
visited[j] = 0;
int start_city = rand() % city_num; //随机选择起点
int current_city = start_city; //当前所在城市
visited[start_city] = 1;
path[0] = start_city;
for(j=1; j<city_num; j++) //遍历所有城市
{
double sum = 0.0;
for(k=0; k<city_num; k++) //计算每个城市的选择概率
{
if(!visited[k])
{
prob[k] = pow(pheromone[current_city][k], ALPHA) * pow(1.0/distance[current_city][k], BETA);
sum += prob[k];
}
}
if(sum == 0.0) //处理概率为0的情况
{
for(k=0; k<city_num; k++)
{
if(!visited[k])
{
prob[k] = 1.0;
sum += 1.0;
}
}
}
for(k=0; k<city_num; k++) //归一化概率
prob[k] /= sum;
int next_city = roulette_wheel_selection(prob); //轮盘赌选择下一个城市
visited[next_city] = 1;
path[j] = next_city;
current_city = next_city;
}
path[city_num] = start_city;
int distance = 0;
for(j=1; j<=city_num; j++) //计算当前路径长度
distance += ::distance[path[j-1]][path[j]];
if(distance < best_distance) //更新最优解
{
best_distance = distance;
for(j=0; j<=city_num; j++)
best_path[j] = path[j];
}
for(j=1; j<=city_num; j++) //更新信息素
{
int city1 = path[j-1];
int city2 = path[j];
pheromone[city1][city2] = pheromone[city1][city2] * (1.0 - RHO) + Q / distance;
}
}
}
int main()
{
srand((unsigned)time(NULL));
printf("请输入城市数量和蚂蚁数量:");
scanf("%d%d", &city_num, &ant_num);
init();
int i;
for(i=0; i<MAX_TIMES; i++) //开始搜索
{
ant_search();
printf("第%d次迭代,最优路径长度为%d:\n", i+1, best_distance);
for(int j=0; j<=city_num; j++)
printf("%d ", best_path[j]);
printf("\n");
}
return 0;
}
```