编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 设置粒子群大小和最大迭代次数
#define POP_SIZE 60
#define MAX_ITER 2000
#define DIM 6  // 箱子数量
#define MAX_K 10  // 卡车空间

// 数据
int w[DIM] = {2, 2, 3, 1, 5, 2};  // 箱子的尺寸
int v[DIM] = {2, 3, 1, 5, 4, 3};  // 箱子的价值
int k = 10;  // 卡车空间容量

// 粒子结构体
typedef struct {
    int position[DIM];  // 粒子位置(是否选中某个箱子)
    int velocity[DIM];  // 粒子速度
    int best_position[DIM];  // 粒子历史最优解
    int best_value;  // 粒子历史最优值
} Particle;

// 计算适应度值
int fitness(int position[DIM]) {
    int total_weight = 0;
    int total_value = 0;
    for (int i = 0; i < DIM; i++) {
        if (position[i] == 1) {
            total_weight += w[i];
            total_value += v[i];
        }
    }
    if (total_weight > k) {
        return 0;  // 超过卡车容量,返回适应度为0
    }
    return total_value;  // 返回价值
}

// 粒子群优化算法
void pso() {
    Particle particles[POP_SIZE];
    int global_best_position[DIM];  // 全局最优解
    int global_best_value = 0;  // 全局最优值

    // 初始化粒子群
    srand(time(NULL));
    for (int i = 0; i < POP_SIZE; i++) {
        for (int j = 0; j < DIM; j++) {
            particles[i].position[j] = rand() % 2;  // 随机选择0或1
            particles[i].velocity[j] = rand() % 2 - 1;  // 随机速度为-1, 0, 1
        }
        particles[i].best_value = fitness(particles[i].position);
        for (int j = 0; j < DIM; j++) {
            particles[i].best_position[j] = particles[i].position[j];
        }
        if (particles[i].best_value > global_best_value) {
            global_best_value = particles[i].best_value;
            for (int j = 0; j < DIM; j++) {
                global_best_position[j] = particles[i].best_position[j];
            }
        }
    }

    // 迭代更新
    for (int iter = 0; iter < MAX_ITER; iter++) {
        for (int i = 0; i < POP_SIZE; i++) {
            // 更新粒子速度和位置
            for (int j = 0; j < DIM; j++) {
                particles[i].velocity[j] = (rand() % 2 - 1) + (rand() % 2 - 1);  // 更新速度
                particles[i].position[j] = particles[i].position[j] + particles[i].velocity[j];
                if (particles[i].position[j] < 0) particles[i].position[j] = 0;
                if (particles[i].position[j] > 1) particles[i].position[j] = 1;
            }

            // 计算粒子适应度
            int current_value = fitness(particles[i].position);
            if (current_value > particles[i].best_value) {
                particles[i].best_value = current_value;
                for (int j = 0; j < DIM; j++) {
                    particles[i].best_position[j] = particles[i].position[j];
                }
            }
            if (particles[i].best_value > global_best_value) {
                global_best_value = particles[i].best_value;
                for (int j = 0; j < DIM; j++) {
                    global_best_position[j] = particles[i].best_position[j];
                }
            }
        }
    }

    // 输出最终结果
    printf("最优解:\n");
    printf("选择的箱子: ");
    for (int i = 0; i < DIM; i++) {
        if (global_best_position[i] == 1) {
            printf("%d ", i + 1);
        }
    }
    printf("\n总价值: %d\n", global_best_value);
}

int main() {
    pso();
    return 0;
}