当前位置: 首页 > news >正文

一维下料之 *贪心算法* —— CAD c#二次开发

一维下料之贪心算法,需求如下

已知条件
我们有一批长度为 380 米 的原材料(例如钢管、木材等)。
切割需求
需要从这些原材料中切割出以下长度的小段:42 米:需要 13 段
140米:需要 23 段
130 米:需要 12 段

120 米:需要 12 段
11 米:需要 2 段
234米:需要 12 段
问题需求

我们的目标是:
用尽可能少的原材料(总根数最少),切割出所有需要的小段,同时尽可能减少浪费(即原材料的剩余长度总和最小)。

结果如下: 

贪心算法: 使用原材料 26 个,总剩余 830 米,利用率 91.60%

原材料 1: [234, 140] 剩余: 6 米
原材料 2: [234, 140] 剩余: 6 米
原材料 3: [234, 140] 剩余: 6 米
原材料 4: [234, 140] 剩余: 6 米
原材料 5: [234, 140] 剩余: 6 米
原材料 6: [234, 140] 剩余: 6 米
原材料 7: [234, 140] 剩余: 6 米
原材料 8: [234, 140] 剩余: 6 米
原材料 9: [234, 140] 剩余: 6 米
原材料 10: [234, 140] 剩余: 6 米
原材料 11: [234, 140] 剩余: 6 米
原材料 12: [234, 140] 剩余: 6 米
原材料 13: [140, 140, 11, 11] 剩余: 78 米
原材料 14: [140, 140] 剩余: 100 米
原材料 15: [140, 140] 剩余: 100 米
原材料 16: [140, 140] 剩余: 100 米
原材料 17: [140, 140] 剩余: 100 米
原材料 18: [140, 130] 剩余: 110 米
原材料 19: [130, 130, 120] 剩余: 0 米
原材料 20: [130, 130, 120] 剩余: 0 米
原材料 21: [130, 130, 120] 剩余: 0 米
原材料 22: [130, 130, 120] 剩余: 0 米
原材料 23: [130, 130, 120] 剩余: 0 米
原材料 24: [130, 120, 120] 剩余: 10 米
原材料 25: [120, 120, 120] 剩余: 20 米
原材料 26: [120, 120] 剩余: 140 米

部分源代码如下

public class 一维下料
{
    // 定义原材料长度
    private const int 原材料长度 =380;

    // 定义需要的切割长度及其数量
    private static readonly Dictionary<int, int> 需求长度 = new Dictionary<int, int>
    {
         { 140, 23 }, { 130, 12 }, { 120, 12 }, { 11, 2 }, { 234, 12 }
    };
    [CommandMethod("xx")]
    public static void 一维下料贪心算法()
    {
        // 获取切割方案、剩余长度和利用率
        List<int> 剩余长度s;
        double 利用率;
        List<List<int>> 切割计划s = 计算剩余长度s和利用率(out 剩余长度s, out 利用率);

        // 输出切割方案
        Env.Editor.WriteMessage("切割方案:\n");
        int 最终原材料个数 = 0;
        for (int i = 0; i < 切割计划s.Count; i++)
        {
            Env.Editor.WriteMessage($"原材料 {i + 1}: [{ string.Join(", ", 切割计划s[i]) } ](剩余长度: {剩余长度s[i]} 米)\n");
            最终原材料个数 = i + 1;
        }

        // 输出总剩余长度
        int 总剩余长度 = 剩余长度s.Sum();
        Env.Editor.WriteMessage($"共需要{最终原材料个数}个原材料,总剩余长度: {总剩余长度} 米\n");

        // 输出利用率
        Env.Editor.WriteMessage($"贪心算法利用率: {利用率:F2}%\n");

        // 验证是否所有需要的长度都被切割
        bool allCut = true;
        foreach (var length in 需求长度.Keys)
        {
            if (需求长度[length] > 0)
            {
                allCut = false;
                break;
            }
        }

        Env.Editor.WriteMessage(allCut ? "所有长度都已切割完毕。" : "部分长度未切割完毕。\n");
    }
    // 贪心算法实现
    public static List<List<int>> 计算剩余长度s和利用率(out List<int> 剩余长度s, out double 利用率)
    {
        // 存储最终的切割方案
        List<List<int>> 切割计划s = new List<List<int>>();

        // 存储每根原材料的剩余长度
        剩余长度s = new List<int>();

        // 复制需要的切割长度及其数量,避免修改原始数据
        Dictionary<int, int> requiredLengthsCopy = new Dictionary<int, int>(需求长度);

        // 总使用的材料长度
        int 总使用长度 = 0;

        // 循环直到所有需要的长度都被切割
        while (true)
        {
            // 当前原材料的剩余长度
            int 当前材料剩余长度 = 原材料长度;

            // 当前原材料的切割方案
            List<int> 最终方案 = new List<int>();

            // 从最长的长度开始尝试切割
            foreach (var length in requiredLengthsCopy.Keys.ToList())
            {
               /*****************省略部分源代码***********************/
            }

            // 如果当前原材料没有切割任何长度,则退出循环
            if (最终方案.Count == 0)
                break;

            // 将当前切割方案添加到最终方案中
            切割计划s.Add(最终方案);

            // 记录当前原材料的剩余长度
            剩余长度s.Add(当前材料剩余长度);
        }

        // 计算利用率
        int total原材料长度 = 切割计划s.Count * 原材料长度; // 总原材料长度
        利用率 = (double)总使用长度 / total原材料长度 * 100; // 利用率百分比

        return 切割计划s;
    }

}

相关文章:

  • Comfyui 与 SDwebui
  • 修复Electron项目Insecure Content-Security-Policy(内容安全策略CSP)警告的问题
  • 【ELK】ElasticSearch 集群常用管理API操作
  • 1.1.系统工程与信息系统基础简介
  • mysql安装过程
  • 蓝桥杯备考:数据结构vector篇之寄包柜
  • java中小型公司面试预习资料(四):微服务架构
  • ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题
  • 【银行测试】银行项目,信贷/贷款业务测试+常问面试(二)
  • jira操作笔记
  • HTML5(Web前端开发笔记第一期)
  • AGI大模型(1):大模型简介
  • Manus 一码难求,MetaGPT、OpenManus、Camel AI 会是替代方案吗?
  • Spring Boot 注解大全:全面解析与实战应用
  • 3.12代码随想录第十五天打卡
  • 【MySQL篇】MySQL内置函数
  • nextJs在DOM视图中渲染未转为状态值的localStorage导致报错
  • 从需求文档到测试点:基于 OCR 和智能接口的高效图片信息提取与分析
  • C++面向对象——继承学习笔记
  • 用AI写小说-小白写小说的第一步Prompt
  • 巴国家安全委员会授权军方自主决定对印反击措施
  • 央行:5月15日起下调金融机构存款准备金率0.5个百分点
  • 一揽子十条货币政策措施出炉:降准降息,设立五千亿服务消费与养老再贷款
  • 打造多元文旅消费场景,第四届长三角城市戏剧节启幕
  • 41年轮回,从洛杉矶奔向洛杉矶,李宁故地重游再出发
  • 预告:央行等部门将发声,介绍“一揽子金融政策支持稳市场稳预期”有关情况