admin 发表于 2024-3-14 17:49:05

写 一维下料 套料 算法 c++代码

这段代码实现了基于递归的回溯算法,用于计算一维下料套料问题的切割方案。输入为待切割的材料列表和目标长度,输出为所有满足条件的切割方案。

具体实现思路如下:

首先定义了两个结构体:Material表示材料,包含长度和编号;CutPlan表示切割方案,包含所有切割后的材料、总长度和材料数量。
实现了一个比较函数compareMaterials,用于对材料按长度进行排序。
实现了一个递归函数recursiveCutting,用于计算切割方案。该函数接收切割方案、材料列表、起始位置和剩余长度作为参数。当剩余长度为0时,表示找到了一种切割方案,更新切割方案的总长度和材料数量。否则,遍历所有可能的切割位置,将符合条件的材料加入切割方案,并递归调用自身切割剩余部分。最后,通过回溯撤销上一步操作。
实现了主函数calculateCutPlans,用于计算一维下料套料算法的切割方案。首先对材料按长度进行排序,然后生成切割方案。通过调用递归函数recursiveCutting生成切割方案,并将满足条件的切割方案加入结果列表。
在主函数中,给定了一个测试样例,计算了切割方案,并输出了结果。
这段代码可以计算出所有满足条件的切割方案,并输出切割方案的总长度、材料数量和材料列表。

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

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

// 定义切割方案结构体
struct CutPlan {
    std::vector<Material> materials;
    int totalLength;
    int numMaterials;
};

// 比较两个材料的长度
bool compareMaterials(const Material& m1, const Material& m2) {
    return m1.length < m2.length;
}

// 递归函数,计算切割方案
void recursiveCutting(CutPlan& plan, std::vector<Material>& materials, int startIndex, int remainingLength) {
    // 当剩余长度为0时,表示找到了一种切割方案
    if (remainingLength == 0) {
      plan.totalLength += materials.length;
      plan.numMaterials++;
      return;
    }

    // 遍历所有可能的切割位置
    for (int i = startIndex; i < materials.size(); i++) {
      // 当前切割位置的材料长度小于等于剩余长度
      if (materials.length <= remainingLength) {
            // 更新切割方案
            plan.materials.push采用back(materials);
            plan.totalLength += materials.length;
            plan.numMaterials++;

            // 递归调用,继续切割剩余部分
            recursiveCutting(plan, materials, i + 1, remainingLength - materials.length);

            // 回溯,撤销上一步操作
            plan.totalLength -= materials.length;
            plan.numMaterials--;
      }
    }
}

// 计算一维下料套料算法的切割方案
std::vector<CutPlan> calculateCutPlans(const std::vector<Material>& materials, int targetLength) {
    std::vector<CutPlan> plans;

    // 对材料按长度进行排序
    std::vector<Material> sortedMaterials = materials;
    std::sort(sortedMaterials.begin(), sortedMaterials.end(), compareMaterials);

    // 生成切割方案
    CutPlan plan;
    plan.totalLength = 0;
    plan.numMaterials = 0;
    for (int i = 0; i < sortedMaterials.size(); i++) {
      plan.materials.clear();
      recursiveCutting(plan, sortedMaterials, i, targetLength);
      if (plan.totalLength == targetLength && plan.numMaterials > 0) {
            plans.push采用back(plan);
      }
    }

    return plans;
}

int main() {
    // 测试样例
    std::vector<Material> materials = {
      {5, 1},
      {3, 2},
      {4, 3},
      {2, 4},
      {6, 5}
    };


                std::vector<Material> materials;

                Material a1;
                a1.id=1;
                a1.length=5;
                materials.push采用back(a1);

                a1.id=2;
                a1.length=3;
                materials.push采用back(a1);

                a1.id=3;
                a1.length=4;
                materials.push采用back(a1);

                a1.id=4;
                a1.length=2;
                materials.push采用back(a1);

                a1.id=5;
                a1.length=6;
                materials.push采用back(a1);


    int targetLength = 10;

    // 计算切割方案
    std::vector<CutPlan> plans = calculateCutPlans(materials, targetLength);

    // 输出切割方案
    std::cout << "Number of cut plans: " << plans.size() << std::endl;
    for (int i = 0; i < plans.size(); i++) {
      std::cout << "Cut plan " << i + 1 << ":" << std::endl;
      std::cout << "Total length: " << plans.totalLength << std::endl;
      std::cout << "Number of materials: " << plans.numMaterials << std::endl;
      std::cout << "Materials:" << std::endl;
      for (int j = 0; j < plans.materials.size(); j++) {
            std::cout << plans.materials.length << " (id: " << plans.materials.id << ")" << std::endl;
      }
      std::cout << std::endl;
    }

    return 0;
}
页: [1]
查看完整版本: 写 一维下料 套料 算法 c++代码