上一篇
在人工智能和运筹学领域,C语言蚁群算法(Ant Colony Optimization, ACO)是一种模拟自然界蚂蚁觅食行为的智能优化算法。本教程将手把手教你用C语言实现一个基础的蚁群优化算法,解决经典的旅行商问题(TSP)。即使你是编程小白,也能轻松上手!

蚁群优化算法实现的核心思想源于真实蚂蚁通过释放信息素(pheromone)来沟通并找到食物源与巢穴之间的最短路径。在算法中:
你需要:
以下是一个简化但完整的C语言实现ACO解决TSP问题的代码:
// aco_tsp.c - 蚁群算法解决TSP问题#include <stdio.h>#include <stdlib.h>#include <math.h>#include <time.h>#define MAX_CITIES 20#define MAX_ANTS 20#define MAX_ITER 100#define ALPHA 1.0 // 信息素重要程度#define BETA 2.0 // 启发式信息重要程度#define RHO 0.5 // 信息素蒸发率#define Q 100.0 // 信息素强度double distance[MAX_CITIES][MAX_CITIES];double pheromone[MAX_CITIES][MAX_CITIES];int cities[MAX_CITIES][2] = { {60, 200}, {180, 200}, {80, 180}, {140, 180}, {20, 160}, {100, 160}, {200, 160}, {140, 140}, {40, 120}, {100, 120}, {180, 100}, {60, 80}, {120, 80}, {180, 60}, {20, 40}, {100, 40}, {200, 40}, {20, 20}, {60, 20}, {160, 20}};void init_distance() { for (int i = 0; i < MAX_CITIES; i++) { for (int j = 0; j < MAX_CITIES; j++) { if (i == j) { distance[i][j] = 0; } else { double dx = cities[i][0] - cities[j][0]; double dy = cities[i][1] - cities[j][1]; distance[i][j] = sqrt(dx*dx + dy*dy); } } }}void init_pheromone() { for (int i = 0; i < MAX_CITIES; i++) { for (int j = 0; j < MAX_CITIES; j++) { pheromone[i][j] = 1.0; } }}int select_next_city(int current, int visited[]) { double total = 0.0; double prob[MAX_CITIES]; for (int i = 0; i < MAX_CITIES; i++) { if (!visited[i] && i != current) { prob[i] = pow(pheromone[current][i], ALPHA) * pow(1.0 / distance[current][i], BETA); total += prob[i]; } else { prob[i] = 0; } } if (total == 0) return -1; double r = ((double)rand() / RAND_MAX) * total; double cumulative = 0.0; for (int i = 0; i < MAX_CITIES; i++) { cumulative += prob[i]; if (cumulative >= r) return i; } return -1;}void update_pheromone(int paths[][MAX_CITIES], double path_lengths[]) { for (int i = 0; i < MAX_CITIES; i++) { for (int j = 0; j < MAX_CITIES; j++) { pheromone[i][j] *= (1 - RHO); // 蒸发 } } for (int ant = 0; ant < MAX_ANTS; ant++) { double delta = Q / path_lengths[ant]; for (int i = 0; i < MAX_CITIES - 1; i++) { int from = paths[ant][i]; int to = paths[ant][i+1]; pheromone[from][to] += delta; pheromone[to][from] += delta; // 对称 } // 回到起点 pheromone[paths[ant][MAX_CITIES-1]][paths[ant][0]] += delta; pheromone[paths[ant][0]][paths[ant][MAX_CITIES-1]] += delta; }}int main() { srand(time(NULL)); init_distance(); init_pheromone(); double best_length = 1e9; int best_path[MAX_CITIES]; for (int iter = 0; iter < MAX_ITER; iter++) { int paths[MAX_ANTS][MAX_CITIES]; double path_lengths[MAX_ANTS]; // 每只蚂蚁构建路径 for (int ant = 0; ant < MAX_ANTS; ant++) { int visited[MAX_CITIES] = {0}; paths[ant][0] = rand() % MAX_CITIES; visited[paths[ant][0]] = 1; for (int i = 1; i < MAX_CITIES; i++) { int next = select_next_city(paths[ant][i-1], visited); if (next == -1) { // 随机选一个未访问城市 for (int j = 0; j < MAX_CITIES; j++) { if (!visited[j]) { next = j; break; } } } paths[ant][i] = next; visited[next] = 1; } // 计算路径总长度 path_lengths[ant] = 0; for (int i = 0; i < MAX_CITIES - 1; i++) { path_lengths[ant] += distance[paths[ant][i]][paths[ant][i+1]]; } path_lengths[ant] += distance[paths[ant][MAX_CITIES-1]][paths[ant][0]]; // 更新全局最优 if (path_lengths[ant] < best_length) { best_length = path_lengths[ant]; for (int i = 0; i < MAX_CITIES; i++) { best_path[i] = paths[ant][i]; } } } update_pheromone(paths, path_lengths); printf("Iteration %d: Best length = %.2f\n", iter + 1, best_length); } printf("\nBest path found:\n"); for (int i = 0; i < MAX_CITIES; i++) { printf("%d ", best_path[i]); } printf("\nTotal distance: %.2f\n", best_length); return 0;}
init_distance():计算城市间欧氏距离select_next_city():使用轮盘赌选择下一个城市update_pheromone():先蒸发再根据蚂蚁路径增加信息素将代码保存为 aco_tsp.c,在终端执行:
gcc -o aco_tsp aco_tsp.c -lm./aco_tsp
注意:链接数学库需加 -lm 参数。
通过本教程,你已经掌握了用C语言实现蚁群优化算法的基本方法。这个智能优化算法教程为你打开了元启发式算法的大门。你可以尝试调整参数(如 ALPHA、BETA、RHO)观察对结果的影响,或扩展到其他组合优化问题。
记住:C语言蚁群算法不仅是一种强大的工具,更是理解群体智能的绝佳入口。动手实践,你会收获更多!
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129409.html