admin 发表于 2024-3-6 12:50:51

套料遗传算法(Bin Packing Genetic Algorithm)

套料遗传算法(Bin Packing Genetic Algorithm)是一种用于解决套料问题的优化算法。套料问题是指将一组物品尽可能有效地放入一组容器中,使得容器的利用率最高。

以下是一个简单的套料遗传算法的C++代码示例:

cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

// 定义物品结构体
struct Item {
    int id;
    int size;
};

// 定义容器结构体
struct Bin {
    int id;
    int capacity;
    std::vector<Item> items;
};

// 遗传算法参数
const int POPULATION采用SIZE = 100; // 种群大小
const int MAX采用GENERATIONS = 100; // 最大迭代次数
const double MUTATION采用RATE = 0.1; // 变异率

// 随机数生成器
std::random采用device rd;
std::mt19937 gen(rd());
std::uniform采用real采用distribution<> dis(0.0, 1.0);

// 计算容器利用率
double calculateFitness(const Bin& bin) {
    int totalSize = 0;
    for (const auto& item : bin.items) {
      totalSize += item.size;
    }
    return static采用cast<double>(totalSize) / bin.capacity;
}

// 初始化种群
std::vector<Bin> initializePopulation(int numBins, const std::vector<Item>& items) {
    std::vector<Bin> population;
    for (int i = 0; i < POPULATION采用SIZE; ++i) {
      Bin bin;
      bin.id = i;
      bin.capacity = numBins;
      population.push采用back(bin);
    }
    return population;
}

// 选择操作
std::vector<Bin> selection(const std::vector<Bin>& population) {
    std::vector<Bin> selectedPopulation;
    for (int i = 0; i < POPULATION采用SIZE; ++i) {
      int index1 = static采用cast<int>(dis(gen) * POPULATION采用SIZE);
      int index2 = static采用cast<int>(dis(gen) * POPULATION采用SIZE);
      selectedPopulation.push采用back(population.items.size() > population.items.size() ? population : population);
    }
    return selectedPopulation;
}

// 交叉操作
std::vector<Bin> crossover(const std::vector<Bin>& population) {
    std::vector<Bin> offspringPopulation;
    for (int i = 0; i < POPULATION采用SIZE; i += 2) {
      Bin parent1 = population;
      Bin parent2 = population;
      Bin offspring1 = parent1;
      Bin offspring2 = parent2;
      int crossoverPoint = static采用cast<int>(dis(gen) * parent1.items.size());
      offspring1.items.insert(offspring1.items.end(), parent2.items.begin() + crossoverPoint, parent2.items.end());
      offspring2.items.insert(offspring2.items.end(), parent1.items.begin() + crossoverPoint, parent1.items.end());
      offspringPopulation.push采用back(offspring1);
      offspringPopulation.push采用back(offspring2);
    }
    return offspringPopulation;
}

// 变异操作
void mutation(std::vector<Bin>& population) {
    for (auto& bin : population) {
      for (auto& item : bin.items) {
            if (dis(gen) < MUTATION采用RATE) {
                item.size = static采用cast<int>(dis(gen) * bin.capacity);
            }
      }
    }
}

// 打印最优解
void printBestSolution(const std::vector<Bin>& population) {
    double bestFitness = 0.0;
    const Bin* bestBin = nullptr;
    for (const auto& bin : population) {
      double fitness = calculateFitness(bin);
      if (fitness > bestFitness) {
            bestFitness = fitness;
            bestBin = &bin;
      }
    }
    std::cout << "Best solution: ";
    if (bestBin != nullptr) {
      for (const auto& item : bestBin->items) {
            std::cout << item.id << " ";
      }
    }
    std::cout << std::endl;
}

int main() {
    // 初始化物品
    std::vector<Item> items = {
      {1, 10},
      {2, 20},
      {3, 30},
      // ...
    };

    // 初始化种群
    std::vector<Bin> population = initializePopulation(100, items);

    // 迭代
    for (int generation = 0; generation < MAX采用GENERATIONS; ++generation) {
      // 选择
      std::vector<Bin> selectedPopulation = selection(population);

      // 交叉
      std::vector<Bin> offspringPopulation = crossover(selectedPopulation);

      // 变异
      mutation(offspringPopulation);

      // 更新种群
      population = offspringPopulation;

      // 输出最优解
      printBestSolution(population);
    }

    return 0;
}
这段代码实现了一个简单的套料遗传算法,其中包括初始化种群、选择、交叉、变异等操作,并输出每一代的最优解。你可以根据实际需求进行修改和扩展。

admin 发表于 2024-3-6 16:11:30

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>

// 定义材料的结构体
struct Material {
    int length;
    int demand;
};

// 定义染色体的结构体
struct Chromosome {
    std::vector<int> genes;
    int fitness;
};

// 初始化种群
std::vector<Chromosome> initializePopulation(int populationSize, int geneSize) {
    std::vector<Chromosome> population;
    for (int i = 0; i < populationSize; i++) {
      Chromosome chromosome;
      chromosome.genes.resize(geneSize);
      for (int j = 0; j < geneSize; j++) {
            chromosome.genes = rand() % 2; // 随机生成0或1
      }
      chromosome.fitness = 0;
      population.push采用back(chromosome);
    }
    return population;
}

// 计算染色体的适应度
void calculateFitness(Chromosome& chromosome, const std::vector<Material>& materials, int targetLength) {
    int totalLength = 0;
    int totalDemand = 0;
    for (int i = 0; i < chromosome.genes.size(); i++) {
      if (chromosome.genes == 1) {
            totalLength += materials.length;
            totalDemand += materials.demand;
      }
    }
    chromosome.fitness = (totalLength >= targetLength) ? totalDemand : 0;
}

// 选择操作
std::vector<Chromosome> selection(const std::vector<Chromosome>& population, int tournamentSize) {
    std::vector<Chromosome> selectedPopulation;
    for (int i = 0; i < population.size(); i++) {
      std::vector<int> tournamentIndices;
      for (int j = 0; j < tournamentSize; j++) {
            int index = rand() % population.size();
            tournamentIndices.push采用back(index);
      }
      int maxFitness = -1;
      int maxIndex = -1;
      for (int j = 0; j < tournamentIndices.size(); j++) {
            int index = tournamentIndices;
            if (population.fitness > maxFitness) {
                maxFitness = population.fitness;
                maxIndex = index;
            }
      }
      selectedPopulation.push采用back(population);
    }
    return selectedPopulation;
}

// 交叉操作
std::vector<Chromosome> crossover(const std::vector<Chromosome>& population, double crossoverRate) {
    std::vector<Chromosome> offspringPopulation;
    for (int i = 0; i < population.size(); i += 2) {
      Chromosome parent1 = population;
      Chromosome parent2 = population;
      Chromosome offspring1 = parent1;
      Chromosome offspring2 = parent2;
      if (rand() / double(RAND采用MAX) < crossoverRate) {
            int crossoverPoint = rand() % parent1.genes.size();
            for (int j = crossoverPoint; j < parent1.genes.size(); j++) {
                offspring1.genes = parent2.genes;
                offspring2.genes = parent1.genes;
            }
      }
      offspringPopulation.push采用back(offspring1);
      offspringPopulation.push采用back(offspring2);
    }
    return offspringPopulation;
}

// 变异操作
void mutation(std::vector<Chromosome>& population, double mutationRate) {
    for (int i = 0; i < population.size(); i++) {
      for (int j = 0; j < population.genes.size(); j++) {
            if (rand() / double(RAND采用MAX) < mutationRate) {
                population.genes = 1 - population.genes; // 变异
            }
      }
    }
}

// 打印最优解
void printBestSolution(const std::vector<Chromosome>& population, const std::vector<Material>& materials, int targetLength) {
    int maxFitness = -1;
    int maxIndex = -1;
    for (int i = 0; i < population.size(); i++) {
      if (population.fitness > maxFitness) {
            maxFitness = population.fitness;
            maxIndex = i;
      }
    }
    std::cout << "Best solution: ";
    for (int i = 0; i < population.genes.size(); i++) {
      if (population.genes == 1) {
            std::cout << "Material " << i + 1 << " (Length: " << materials.length << ", Demand: " << materials.demand << ") ";
      }
    }
    std::cout << std::endl;
    std::cout << "Total Length: " << maxFitness << std::endl;
    std::cout << "Target Length: " << targetLength << std::endl;
}

int main() {
    // 定义材料和目标长度
    std::vector<Material> materials = { {10, 5}, {15, 8}, {20, 10}, {25, 12} };
    int targetLength = 50;

    // 定义遗传算法的参数
    int populationSize = 100;
    int geneSize = materials.size();
    int tournamentSize = 5;
    double crossoverRate = 0.8;
    double mutationRate = 0.01;
    int maxGenerations = 100;

    // 初始化种群
    std::vector<Chromosome> population = initializePopulation(populationSize, geneSize);

    // 迭代进化
    for (int generation = 0; generation < maxGenerations; generation++) {
      // 计算适应度
      for (int i = 0; i < population.size(); i++) {
            calculateFitness(population, materials, targetLength);
      }

      // 打印当前最优解
      printBestSolution(population, materials, targetLength);

      // 选择操作
      std::vector<Chromosome> selectedPopulation = selection(population, tournamentSize);

      // 交叉操作
      std::vector<Chromosome> offspringPopulation = crossover(selectedPopulation, crossoverRate);

      // 变异操作
      mutation(offspringPopulation, mutationRate);

      // 更新种群
      population = offspringPopulation;
    }

    return 0;
}
页: [1]
查看完整版本: 套料遗传算法(Bin Packing Genetic Algorithm)