精华内容
下载资源
问答
  • 钢材切割问题

    千次阅读 2015-05-08 02:43:00
    已知钢材的总长,订单数和各订单需要的长度编制程序从订单中选择一组订单对钢材切割加工, 使得钢材得到最佳应用,约定,每次切割损耗固定长度的钢材。下面写一下我的思路,刚开始没有想明白应该怎么使用递归去做...

    已知钢材的总长,订单数和各订单需要的长度编制程序从订单中选择一组订单对钢材作切割加工, 使得钢材得到最佳应用,约定,每次切割损耗固定长度的钢材。

    下面写一下我的思路,刚开始没有想明白应该怎么使用递归去做,但是,看了他们的代码之后,走了一遍,才明白,其实思路不太好想,但是实现起来还是比较容易的。

    假设,我们有一段钢材,长度为12米,其中有3个订单,分别需要的长度为5,6,9米,每次切割总会有2米的损耗,求得其最佳订单组合。

    现在我们想想一下我们正常的思路:
    如果是只有一个订单的话,9米的订单是最合适的,加上2米的耗材,一共11米。

    如果有两个订单的话,有组合5,6;5,9;6,9这三个组合,很明显,这三个组合都已经超过了12米的长度,因为如果是5,6的话,虽然说订单的和为11,但是有两次切割,还会有4米的耗材,加起来就是15米,已经远远超过钢材的长度了

    由上面的可以知道,3个订单的组合那就更不行了。

    那我们应该如何做到实现这个思路呢,我们有一个数组记录订单是否选中,请看下面这张图:

    这里写图片描述

    5,6,9初始化的时候,全是未选中的状态,程序开始执行,先选中5,加上损耗的长度小于12,则继续选中6,这样加上损耗的长度大于12了,则设置6的状态为未选中;接着选中9,5加上9加上损耗的长度,很明显超过12了,那么设置9的状态为未选中;接着从5开始的遍历完成了,将5的状态设置为未选中;选中6,再从5开始选中,这样进行下去。。。。

    当然,中间需要有两个变量记录最佳长度和最佳订单组合。

    下面附上我的代码:

    #include <stdio.h>
    
    /**
     * 已知钢材的总长,订单数和各订单需要的长度
     * 编制程序从订单中选择一组订单对钢材作切割加工,
     * 使得钢材得到最佳应用,约定,每次切割损耗
     * 固定长度的钢材
     */
    
    #define N 20
    #define DELTA 2 //切割钢材损耗
    
    /** 最好的长度 **/
    int bestlen;
    
    /** 最好长度的选定订单 **/
    int bestsele[N];
    
    /** 选定订单,用于尝试选择 **/
    int sele[N];
    
    /** 有n的订单 **/
    int n;
    
    /** 订单需要的钢材的长度 **/
    int orderlen[N];
    
    /** 钢材总长度 **/
    int total;
    
    void attempt();
    
    int main(void)
    {
        int j;
    
        //获取钢材的总长度
        printf("Please enter the length of the steel:\n");
        scanf("%d",&total);
    
        //获取钢材的订单数
        printf("Please enter the number of the orders:\n");
        scanf("%d",&n);
    
        //获取各个订单数需要的长度
        printf("Please enter the length of every order:\n");
        for(j = 0;j < n;j++)
            scanf("%d",&orderlen[j]);
    
        //初始化工作,使所有的订单都没有被选中
        for(j = 0;j < n;j++)
            bestsele[j] = sele[j] = 0;
    
        //初始化最佳长度,设置为0
        bestlen = 0;
    
        //获取最佳长度
        attempt();
    
        printf("order:\n");
        for(j = 0;j < n;j++){
            if(bestsele[j])
                printf("%d\t",orderlen[j]);
        }
        printf("\nlength:\n%d",bestlen);
    
        return 0;
    }
    
    void attempt(){
        int i,len;
    
        //获取选中的订单的总长度(加上损耗)
        for(len = i = 0;i < n;i++)
            if(sele[i])
                len += (orderlen[i]+DELTA);
    
        if(len-DELTA <= total){  //注意,最后一个订单可能不需要损耗
            if(bestlen < len){
                bestlen = len;
    
                for(i = 0;i < n;i++)
                    bestsele[i] = sele[i];
            }
    
            //每次尝试选择订单之后,需要将其还原未选中状态
            for(i = 0;i < n;i++){
                if(!sele[i]){
                    sele[i] = 1;
                    attempt();
                    sele[i] = 0;
                }
    
            }
        }
    }
    
    展开全文
  • execl规划求解钢材切割问题,采用execl本身的规划求解的强大功能做的模版
  • 钢材切割问题,使用c++实现,包含问题分析的Word文档~程序和文档中所使用的数据不完全一致
  • 某钢材生产制造商的钢材切割流程如图1所示。其中开卷上料环节将原材料钢卷放在开卷机上,展开放平送至右侧操作区域(见图2)。剪切过程在剪切台上完成,剪切台上依次有切头剪和圆盘剪。 圆盘剪(见图3)用旋转的圆盘刀片...

    某钢材生产制造商的钢材切割流程如图1所示。其中开卷上料环节将原材料钢卷放在开卷机上,展开放平送至右侧操作区域(见图2)。剪切过程在剪切台上完成,剪切台上依次有切头剪和圆盘剪。

    在这里插入图片描述

    圆盘剪(见图3)用旋转的圆盘刀片连续对纵向运动着的原材料进行切割。在圆盘剪剪切前,需根据订单切割方案进行排刀。假设排刀架上可以以任意间距排刀,但刀具数量是有限制的,一次排刀上限不能超过5刀。用同一排刀方案切割得到的订单称为一组订单,切割不同组时需要工人重新排刀,称为一次换刀。切割每卷原材料之间均需要换刀。切头剪为“一刀切”,即将整个钢板横向完全切断。图4-1中的横向切割(红色虚线所示)不满足一刀切要求,无法用切头剪实现,图4-2的横向切割(红色虚线所示)则符合要求。

    在这里插入图片描述
    在这里插入图片描述

    圆盘剪(见图3)用旋转的圆盘刀片连续对纵向运动着的原材料进行切割。在圆盘剪剪切前,需根据订单切割方案进行排刀。假设排刀架上可以以任意间距排刀,但刀具数量是有限制的,一次排刀上限不能超过5刀。用同一排刀方案切割得到的订单称为一组订单,切割不同组时需要工人重新排刀,称为一次换刀。切割每卷原材料之间均需要换刀。切头剪为“一刀切”,即将整个钢板横向完全切断。图4-1中的横向切割(红色虚线所示)不满足一刀切要求,无法用切头剪实现,图4-2的横向切割(红色虚线所示)则符合要求。

    更详细的切割说明可参考附件1某原材料切割方案说明.xlsx。工厂未来一批订单需求已给出,订单需求数量必须恰好满足(不允许超额供应)。根据工厂现有原料切割订单,每种原料的使用数目不能超过其库存。请建立数学模型解决下面的问题。

    问题1:针对给出的所有原料,请使用最少张数的原材料,满足对5种卷料的要求(不考虑浮动比例),同时尽量提高总的成材率,给出切割方案。

    问题2:针对给出的所有原料,请使用最少张数的原材料,满足对所有订单的要求(不考虑浮动比例),同时尽量提高总的成材率,给出切割方案。

    问题3:圆盘剪每次排刀需要人工更换刀在排刀架上的位置,同时若有材料需要被移到小机器上再次切割也需要人为操作。为减少人力成本,希望尽量减少换刀数和在小机器上切割数。针对给出的所有原料,请使用最少张数的原材料,满足对所有订单的要求(不考虑浮动比例)。同时尽量减少换刀数和在小机器上切割数,并尽量提高总的成材率。给出切割方案。

    问题4:若订单额外指定了浮动比例,则交付的订单长度可在需求长度的基础上上下浮动。例如,规定浮动比例为5%,则切割出的长度在原有长度的95%到105%之间均满足要求。请重新按照第2问的要求,给出切割方案。


    获取更多思路

    ① 公众号(学长建模)发布,由于公众号只能一天更新一次思路,学长在发布第一版思路后,还会检查和更新多种思路,给大家更多的借鉴,也会根据大家的反馈增加部分内容,如果想看最新思路,可以公众号回复“思路”,所有题目思路都会放在这一个推文里,每次更新会注明更新的时间,如果还没更新就可以等会再看看。

    在这里插入图片描述

    ② CSDN博客搜索并关注:mathor_cup,可以到我主页看最新思路发布(最新思路及程序会置顶并会附上更新时间)

    展开全文
  • 1.想知道怎么建模 2求MATLAB代码
  • 求解钢材切割的最佳订单
  • 爱经典,爱编程!本程序用的是c#语言编写的,windows程序界面,很有参考价值哦!
  • 行业分类-作业装置-一种钢材切割、打磨、除尘一体化设备.zip
  • [算法导论]钢材切割

    2018-03-18 07:47:30
    {//在求解规模为j的子问题的时候将第一段钢条的最优切割长度i保存在s[j]中 income = profit[i] + r[j - i]; s[j] = i; } r[j] = income; } } return r[len]; } void PrintCutRodSolution(int profit[], int...
     
    #include<stdio.h>
    #include<iostream>
    #include<limits.h>
    
    using namespace std;
    const int Length = 10;
    int s[Length + 1] = {0}, r[Length + 1] = {0};
    
    int Max(int a, int b);
    int CutRod(int profit[], int len);
    int MemorizedCutRodAux(int profit[], int len, int r[]);
    int MemorizedCutRod(int profit[], int len);
    int BottomUpCutRod(int profit[], int len);
    int ExtendedBottomUpCutRod(int profit[], int len);
    void PrintCutRodSolution(int profit[], int len);
    
    int main ()
    {
    	int profit[Length + 1] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
    	printf("自顶向下递归\nprofit = %d\n", CutRod(profit, 7));//假设待切钢材长度为7
    	printf("带备忘的自顶向下递归\nprofit = %d\n", MemorizedCutRod(profit, 7));
    	printf("自底向上法\nprofit = %d\n", BottomUpCutRod(profit, 7));
        printf("最优化的解决方案:\n");
        PrintCutRodSolution(profit, 7);
    }
    
    int CutRod(int profit[], int len)
    {
    	if(len == 0)//首先设置递归的返回条件
    	return 0;
    
    	int income = -1000;//初始化 以便下面可以正确计算
    	for(int i = 1; i <= len; i++)
    	{//income每次返回
    		income = Max(income, profit[i] + CutRod(profit, len - i));//成树形 见图CutRod
    	}
    	return income;
    }
    //动态规划:避免反复求解相同的子问题 对每个子问题仅求解一次 但额外空间消耗大
    //带备忘的自顶向下法
    int MemorizedCutRod(int profit[], int len)
    {
    	int r[len + 1];//与自然递归的不同之处 r数组用于保存子问题的解
    	for(int i = 0; i <= len; i++)
    	{//对未知值进行初始化的常用方法 已知收益均非负
    		r[i] = INT_MIN;
    	}
    	return MemorizedCutRodAux(profit, len, r);
    //Aux是auxiliary(辅助)
    }
    
    int MemorizedCutRodAux(int profit[], int len, int r[])//见图片MemorizedCutRodAux
    {
        int income;
    	if(r[len] > 0)//证明长度为len的子问题已经求解过了
    	return r[len];//比自然递归的优秀之处
    
    	if(len == 0)
        income = 0;
    
        else
        {
             income = INT_MIN;
             for(int i = 1; i <= len; i++)
             {
                 income = Max(income, profit[i] + MemorizedCutRodAux(profit, len - i, r));
             }
        }
        r[len] = income;//对子问题解的保存 即带备忘性质
        return income;}
    
    //自底向上法 一般需要定义子问题的规模
    //使得任何子问题的求解都只依赖于更小子问题的求解
    //因此可以将子问题按照规模进行排序 当求解某个子问题时 所依赖的更小的问题已经求解完毕
    int BottomUpCutRod(int profit[], int len)
    {
        int r[Length + 1];
        r[0] = 0;//长度为0的钢条没有收益
        int income;
        for(int j = 1; j <= len; j++)
        {
            income = INT_MIN;
            for(int i = 1; i <= j; i++)
            {//可以直接访问r[j-i]来获得长度为j-i的小问题的解而不需要进行递归调用
                income = Max(income, profit[i] + r[j - i]);
            }
            r[j] = income;
        }
        return r[len];
    }
    
    int ExtendedBottomUpCutRod(int profit[], int len)
    {
        int income;
        r[0] = 0;
        for(int j = 1; j <= len; j++)
        {
            income = INT_MIN;
            for(int i = 1; i <= j; i++)
            {
                if(income < profit[i] + r[j - i])
                {//在求解规模为j的子问题的时候将第一段钢条的最优切割长度i保存在s[j]中
                    income = profit[i] + r[j - i];
                    s[j] = i;
                }
                r[j] = income;
            }
        }
        return r[len];
    }
    
    void PrintCutRodSolution(int profit[], int len)
    {
        ExtendedBottomUpCutRod(profit, len);
        while(len > 0)
        {
            cout <<s[len] << "  ";
            len -= s[len];
        }
    }
    int Max(int a, int b)
    {
    	return a > b ? a : b;
    }
    

     

     

     

    展开全文
  • 随着国家二十一世纪狠抓冶金科技进步,提高我国钢铁工业的技术水平和装配水平,到2020年前后我国有望成为世界的钢铁强国。...在此,结合实际工作经验,总结了数控火焰切割机的下料工艺方法,及其切割问题
  • 重工钢材智能切割管控系统软件设计.pdf
  • 钢条切割问题

    2020-01-10 16:31:35
    一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。 动态规划算法通常基于一个递推公式及一个或...
  • 问题描述: Input: 钢条的长度为 ???? ,长度为 ???? 的钢条的价格为 Goal: 如何切割钢条,以实现收益最大化 动态规划求解步骤 Step 1: 分析最优解的性质,刻画其结构特征 Step 2: 递归地定义最优解 最优解...
  • 行业分类-作业装置- 一种抗震钢材生产用的切割装置.zip
  • 钢条切割问题 C#解法

    2019-05-17 13:45:46
    钢条切割问题 ZxwLx公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。...
  • 为了简化生产过程,规定所使用的切割模式的种类不能超过4种,使用频率最高的一种切割模式按照一个原料钢管价值的1/10增加费用,使用频率次之的切割模式按照一根原料钢管价值的2/10增加费用,以此类推,且每种切割...
  • 动态规划-钢条切割问题

    千次阅读 2018-04-14 20:22:08
    1.动态规划 什么是动态规划,我们要如何...分治法将问题划分成互不相交的子问题,递归求解子问题,再将他们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的...
  • 动态规划实现钢条切割问题 动态规划算法的步骤 1. 刻画一个最优解的结构特征; 2. 递归地定义最优解的值; 3. 计算最优解的值; 4. 利用计算出的信息,构造一个最优解。 钢条切割问题描述  (1)...
  • 钢条切割问题最优解

    2021-07-01 20:23:45
    完成最优切割问题的求解 一家公司购买长钢条,将其切割成短钢条出售,假设切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。例如某公司以...
  • 0- 动态规划问题的一般步骤 1- 刻画一个最优解的结构特征 2- 递归定义最优解的值 3- 计算最优解的值,通常采用自底向上的方法 4- 利用计算出的信息构造一个最优解 1- 问题描述 Serling 公司购买长钢条,将其切割为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 622
精华内容 248
关键字:

钢材切割问题