一维下料之 *贪心算法* —— 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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32520.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷leetcode hot100--动态规划3.12

第一题乘积max子数组[1h] emmmm感觉看不懂题解 线性dp【计划学一下acwing&#xff0c;挨个做一下】 线性动态规划 相似题解析 最长上升子序列 最大上升子序列和 最大连续子段和 乘积最大子数组_哔哩哔哩_bilibili 比较奇怪的就是有正负数和0&#xff0c;如何处理&#xff1f…

Linux安装升级docker

Linux 安装升级docker Linux 安装升级docker背景升级停止docker服务备份原docker数据目录移除旧版本docker安装docker ce恢复数据目录启动docker参考 安装找到docker官网找到docker文档删除旧版本docker配置docker yum源参考官网继续安装docker设置开机自启配置加速测试 Linux …

pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现

目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境&#xff0c;如果需要配置开始的话&#xff0c;先看下专栏里另一个文章。 这次的目的是实现拉取视频流…

LLM:了解大语言模型

大型语言模型&#xff08;Large language models&#xff0c;LLMs&#xff09;&#xff0c;如 OpenAI 的 ChatGPT &#xff0c;或者 DeepSeek 等&#xff0c;是过去几年中开发出来的深度神经网络模型。它们为自然语言处理&#xff08;natural language processing&#xff0c;N…

Linux多进程学习

一、什么是多进程 1.多任务程序能够同时做多件事情&#xff0c;如QQ同时聊天和上传下载。 2.多任务程序在应用开发中非常普遍&#xff0c;是必须掌握的基本概念。 二、进程的创建与资源分配 1.操作系统在创建进程时会分配内存资源、CPU资源和时间片。 2.进程的内容包括代码、…

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下&#xff0c;UI元素按照自身像素大小&#xff0c;会发生位置与比例的变化&#xff0c;本文仅利用锚点&#xff08;Anchors&#xff09;使用&#xff0c;来实现UI元素&#xff0c;固定在某个比例距离的屏幕边缘。 首先&#xff0c;将元素的锚点设置为中心&…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接&#xff0c;异步是没时钟连接&#xff0c;靠约定号的频率&#xff08;波特率&#xff09;接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的&#xff0c;一般用不到…

C语言实现队列数据结构:思路与代码详解

目录 一、引言 二、整体思路 三、代码模块分析 &#xff08;一&#xff09;头文件包含与宏定义 &#xff08;二&#xff09;数据类型定义 &#xff08;三&#xff09;队列操作函数 1. 队列初始化 2. 队列销毁 3. 入队操作 4. 出队操作 5. 获取队头元素 6…

商业智能BI的未来,如何看待AI+BI这种模式?

昨天在和一位朋友线上聊天的时候&#xff0c;提了一个问题&#xff0c;你是如何看待AI&#xff08;人工智能&#xff09;BI&#xff08;商业智能&#xff09;这种模式和方向的&#xff0c;我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业&#xff0c;…

如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)

文章目录 每日一句正能量前言一、准备工作二、制作启动盘后记 每日一句正能量 每个在你生命里出现的人&#xff0c;都有原因。喜欢你的人给你温暖关心。你喜欢的人让你学会爱和付出&#xff0c;不喜欢你的人让你自省成长。你不喜欢的人教会你宽容尊重&#xff0c;没有人是偶然出…

DataWhale 大语言模型 - 语言模型发展历程

大语言模型 LLMBook 项目背景 本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

C#带有设备仿真功能串口调试助手

本文档介绍一种方法,可以用来仿真串口设备。这样调试PLC程序时可以在没有仪器时用于测试程序的运行。详细代码见: https://download.csdn.net/download/qq_34047402/90477066 C#带有设备仿真功能串口调试助手资源-CSDN文库 步骤如下: 1.把串口设备接收和发送仿真数据放到一…

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…

01 | Go 项目开发极速入门课介绍

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课。 你好&#xff0c;欢迎学习本课程。本课程是一个 Go 项目开发极速入门课程。旨在帮助刚学习完 Go 基础语法的 Go 开发者&#xff0c;快速掌握如何开发一个功能相对全面的 Go 项目。 根据课程设计目标…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【Linux】:封装线程

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来封装线程相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

全球领先的光学方案设计公司:倚光科技

在光学技术革新的浪潮中&#xff0c;倚光&#xff08;深圳&#xff09;科技有限公司以创新者的姿态迅速崛起&#xff0c;成为全球光学领域的标杆企业。自 2021 年成立以来&#xff0c;公司始终聚焦纳米光学技术研发与超精密加工&#xff0c;凭借顶尖的技术实力和前瞻性的市场布…

2.2.3 TCP—UDP-QUIC

文章目录 2.2.3 TCP—UDP-QUIC1. TCP如何做到可靠性传输1. ACK机制2. 重传机制3. 序号机制4. 窗口机制5. 流量机制6. 带宽机制 2. tcp和udp如何选择1. tcp和udp格式对比2. ARQ协议&#xff08;Automatic Repeat reQuest&#xff0c;自动重传请求&#xff09;1. ARQ协议的主要类…

【动手实验】TCP 连接的建立与关闭抓包分析

本文是基于知识星球程序员踩坑案例分享中的作业进行的复现和总结&#xff0c;借此加深对 TCP 协议的理解&#xff0c; 原文参见TCP 连接的建立和关闭 —— 强烈建议新手看看。 实验环境 这里使用两台位于同一子网的腾讯云服务器&#xff0c;IP 分别是 node2&#xff08;172.1…