数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3764|回复: 4

这个题用matlab穷举法怎么实现阿?高手帮帮忙阿

[复制链接]
发表于 2005-8-11 00:57:44 | 显示全部楼层 |阅读模式
<  align=center><B ><FONT face="Times New Roman">1997</FONT></B><B >年</B><B ><FONT face="Times New Roman">B</FONT></B><B >题截断切割</B><B ><p></p></B></P>
< ><p><FONT face="Times New Roman"> </FONT></p></P>
< ><B ><FONT face="Times New Roman">B</FONT></B><B >题<FONT face="Times New Roman"> </FONT></B><B >截断切割<p></p></B></P>
<P ><FONT face="Times New Roman">    </FONT>某些工业部门(如贵重石材加工等)采用截断切割的加工方式。这里“截断切割”是指将物体沿某个切割平面分成两部分。从一个长方体中加工出一个已知尺寸、位置预定的长方体(这两个长主体的对应表面是平行的)通常要经过<FONT face="Times New Roman">6</FONT>次截断切割。</P>
<P ><FONT face="Times New Roman">    </FONT>设水平切割单位面积的费用是垂直切割单位面积费用的<FONT face="Times New Roman">r</FONT>倍,且当先后两次垂直切割的平面(不管它们之间是否穿插水平切割)不平行时,因调整刀具需额外费用<FONT face="Times New Roman">e.</FONT></P>
<P ><FONT face="Times New Roman">    </FONT>试为这些部门设计一种安排各面加工次序(称“切割方式”)的方法,使加工费用最少。(由工艺要求,与水平工作台接触的长方体底面是事先指定的)详细要求如下:</P>
<P ><FONT face="Times New Roman">1</FONT>、需考虑的不同切割方式的总数</P>
<P ><FONT face="Times New Roman">2</FONT>、给出上述问题的数学模型和求解方法。</P>
<P ><FONT face="Times New Roman">1、</FONT>试对某部门用的如下准则作出评价:每次选择一个加工费用最少的待切割面进行切割。</P>
<P ><FONT face="Times New Roman">2、</FONT>对于<FONT face="Times New Roman">e=0</FONT>的情形有无简明的优化准则。</P>
<P ><FONT face="Times New Roman">3、</FONT>用以下实例验证你的方法:待加工长方体和成品长方体的长、宽、高分别为<FONT face="Times New Roman">10</FONT>、<FONT face="Times New Roman">14.5</FONT>、<FONT face="Times New Roman">19</FONT>和<FONT face="Times New Roman">3</FONT>、<FONT face="Times New Roman">2</FONT>、<FONT face="Times New Roman">4</FONT>,二者左侧面、正面、底面之间的距离分别为<FONT face="Times New Roman">6</FONT>、<FONT face="Times New Roman">7</FONT>、<FONT face="Times New Roman">9</FONT>(单位均为厘米)。垂直切割费用为每平方厘米<FONT face="Times New Roman">1</FONT>元,<FONT face="Times New Roman">r</FONT>和<FONT face="Times New Roman">e</FONT>的数据有以下<FONT face="Times New Roman">4</FONT>组:</P>
<P ><FONT face="Times New Roman">a.r=1 e=0 ;b.r=1.5 e=0 ; c.r=8 ,e=0 ; d.r=1.5;2</FONT>≤<FONT face="Times New Roman">e</FONT>≤<FONT face="Times New Roman">15</FONT></P>
<P >对最后一组数据应给出所有最优解,并进行讨论。</P>
 楼主| 发表于 2005-8-11 01:33:53 | 显示全部楼层
大家帮帮忙啊 !今晚要交了阿 [em06]
发表于 2005-8-11 22:11:11 | 显示全部楼层
matlab递归效率太低,故我是用c实现的。<br>
/*设水平切割单位面积的费用是垂直切割单位面积费用的r倍,且当先后两次垂直切割的平面(不管它们之间<br>
是否穿插水平切割)不平行时,因调整刀具需额外费用e.<br>
用以下实例验证你的方法:待加工长方体和成品长方体的长、宽、高分别为10、14.5、19和3、2、4,<br>
二者左侧面、正面、底面之间的距离分别为6、7、9(单位均为厘米)。<br>
垂直切割费用为每平方厘米1元,r和e的数据有以下4组:<br>
<br>
a.r=1 e=0 ;b.r=1.5 e=0 ; c.r=8 ,e=0 ; d.r=1.5;2≤e≤15<br>
*/<br>
#include &lt;stdio.h&gt;<br>
#define OK 1<br>
#define ERROR 0<br>
typedef int Status;<br>
//min_cost为最小花费,cost为总花费。<br>
//min_trace[6]为最小花费时的步骤。<br>
//trace[6]用来记录步骤,n表示已走完的步数。<br>
//在步骤中,0--5分别代表前后左右上下。<br>
//vs1为当前的前垂直面积,vs2为当前的侧垂直面积,ls为当前的水平面积。<br>
//vnum为已垂直切割的次数,lnum为已水平切割的次数。<br>
//p为两次垂直切割平面不平行的概率。<br>
//x,y,z为长方体的位置(二者左侧面、正面、底面之间的距离)。<br>
<br>
Status Find(int trace[],int n,int k){<br>
    for(int i=0;i&lt;n;i++)<br>
        if(trace==k)break;<br>
    if(i==n)return OK;<br>
    return ERROR;<br>
}//Find<br>
<br>
Status Print(FILE* fp,int trace[],float cost){<br>
    printf("cost=%f\n",cost);<br>
    fprintf(fp,"cost=%f\n",cost);<br>
    printf("该路径为:");<br>
    for(int i=0;i&lt;6;i++){<br>
        switch(trace){<br>
            case 0:<br>
                printf("前--");<br>
                fprintf(fp,"前--");<br>
                break;<br>
            case 1:<br>
                printf("后--");<br>
                fprintf(fp,"后--");<br>
                break;<br>
            case 2:<br>
                printf("左--");<br>
                fprintf(fp,"左--");<br>
                break;<br>
            case 3:<br>
                printf("右--");<br>
                fprintf(fp,"右--");<br>
                break;<br>
            case 4:<br>
                printf("上--");<br>
                fprintf(fp,"上--");<br>
                break;<br>
            case 5:<br>
                printf("下--");<br>
                fprintf(fp,"下--");<br>
                break;<br>
        }//switch<br>
    }//for<br>
    printf("END\n");<br>
    fprintf(fp,"END\n");<br>
    return OK;<br>
}//Print<br>
<br>
Status Print_f2(FILE* fp,int trace[],float cost){<br>
    fprintf(fp,"cost=%f\n",cost);<br>
    fprintf(fp,"该路径为:");<br>
    for(int i=0;i&lt;6;i++){<br>
        switch(trace){<br>
            case 0:<br>
                fprintf(fp,"前--");<br>
                break;<br>
            case 1:<br>
                fprintf(fp,"后--");<br>
                break;<br>
            case 2:<br>
                fprintf(fp,"左--");<br>
                break;<br>
            case 3:<br>
                fprintf(fp,"右--");<br>
                break;<br>
            case 4:<br>
                fprintf(fp,"上--");<br>
                break;<br>
            case 5:<br>
                fprintf(fp,"下--");<br>
                break;<br>
        }//switch<br>
    }//for<br>
    fprintf(fp,"END\n");<br>
    return OK;<br>
}//Print<br>
<br>
<br>
Status cutting(FILE*fp1,FILE*fp2,float&amp; min_cost,int min_trace[],float cost,int trace[],int n,float vs1,float vs2,float ls,<br>
              
float unit_cost,int p,int e,int r,float x,float y,float z,float l,float
w,float h,<br>
               float L,float W,float H){<br>
    if(n&gt;=6){<br>
        Print(fp1,trace,cost);<br>
        if(min_cost&gt;cost){<br>
            fclose(fp2);<br>
            fp2=fopen("最优方案.txt","w");<br>
            min_cost=cost;<br>
            for(int i=0;i&lt;6;i++){<br>
                min_trace=trace;<br>
            }//for<br>
        }//if<br>
        if(min_cost==cost)<br>
            Print_f2(fp2,trace,cost);<br>
        return OK;<br>
    }//if<br>
    float cost1;<br>
    if(Find(trace,n,0)){<br>
        trace[n]=0;<br>
        cost1=cost+unit_cost*vs1+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,vs1,(W-y)*H,(W-y)*L,unit_cost,p,e,r,x,0,z,l,w,h,L,W-y,H);<br>
    }//if<br>
    if(Find(trace,n,1)){<br>
        trace[n]=1;<br>
        cost1=cost+unit_cost*vs1+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,vs1,(w+y)*H,(w+y)*L,unit_cost,p,e,r,x,y,z,l,w,h,L,w+y,H);<br>
    }//if<br>
    if(Find(trace,n,2)){<br>
        trace[n]=2;<br>
        cost1=cost+unit_cost*vs2+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,H*(L-x),vs2,W*(L-x),unit_cost,p,e,r,0,y,z,l,w,h,L-x,W,H);<br>
    }//if<br>
    if(Find(trace,n,3)){<br>
        trace[n]=3;<br>
        cost1=cost+unit_cost*vs2+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,H*(l+x),vs2,W*(l+x),unit_cost,p,e,r,x,y,z,l,w,h,l+x,W,H);<br>
    }//if<br>
    if(Find(trace,n,4)){<br>
        trace[n]=4;<br>
        cost1=cost+r*unit_cost*ls+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,L*(h+z),W*(h+z),ls,unit_cost,p,e,r,x,y,z,l,w,h,L,W,h+z);<br>
    }//if<br>
    if(Find(trace,n,5)){<br>
        trace[n]=5;<br>
        cost1=cost+r*unit_cost*ls+p*e;<br>
      
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,L*(H-z),W*(H-z),ls,unit_cost,p,e,r,x,y,0,l,w,h,L,W,H-z);<br>
    }//if<br>
    return OK;<br>
}//cutting<br>
<br>
void main(){<br>
    int min_trace[6],trace[6],n(0),p(0),e,r;<br>
    float min_cost(10000),cost(0),unit_cost(1),x(6),y(7),z(9);<br>
    float l(3),w(2),h(4),L(10),W(14.5),H(19),vs1,vs2,ls;<br>
    FILE* fp1,*fp2;<br>
    fp1=fopen("切割方案.txt","w");<br>
    fp2=fopen("最优方案.txt","w");<br>
    vs1=L*H;<br>
    vs2=W*H;<br>
    ls=L*W;<br>
    printf("e=");<br>
    scanf("%d",&amp;e);<br>
    printf("r=");<br>
    scanf("%d",&amp;r);<br>
    cutting(fp1,fp2,min_cost,min_trace,cost,trace,n,vs1,vs2,ls,unit_cost,p,e,r,x,y,z,l,w,h,L,W,H);<br>
    printf("最少花费为:%f\n",min_cost);<br>
    fprintf(fp1,"最少花费为:%f\n",min_cost);<br>
    printf("是请参看“切割方案.txt,最优方案.txt”\n");<br>
    fclose(fp1);<br>
    fclose(fp2);<br>
}//main<br>
<br>
发表于 2005-8-13 17:49:05 | 显示全部楼层
有些看不懂啊
发表于 2005-8-15 07:55:02 | 显示全部楼层
function qiege<BR>price=inf;<BR>x1=6;<BR>x2=10-3-6;<BR>x3=7;<BR>x4=14.5-2-7;<BR>x5=9;<BR>x6=19-4-9;<BR>n=zeros(1,6);<BR>num=0;<BR>best_n=[];<BR>for n1=1:6,<BR>    for n2=1:6,<BR>        for n3=1:6,<BR>            for n4=1:6,<BR>                for n5=1:6,<BR>                    for n6=1:6,<BR>                    if n1~=n2&amp;n1~=n3&amp;n1~=n4&amp;n1~=n5&amp;n1~=n6&amp;n2~=n3&amp;n2~=n4&amp;n2~=n5&amp;n2~=n6...<BR>                            &amp;n3~=n4&amp;n3~=n5&amp;n3~=n6&amp;n4~=n5&amp;n4~=n6&amp;n5~=n6,<BR>                        n=[n1 n2 n3 n4 n5 n6];<BR>                        num=num+1;<BR>                        a=10;b=14.5;c=19;<BR>                       cur_price=0;<BR>                   for i=1:6,<BR>   switch n(i)<BR>    case 1<BR>        a=a-x1;<BR>        cur_price=b*c+cur_price;<BR>    case 2<BR>        a=a-x2;<BR>        cur_price=b*c+cur_price;<BR>    case 3<BR>        b=b-x3;<BR>        cur_price=a*c+cur_price;<BR>    case 4<BR>        b=b-x4;<BR>        cur_price=a*c+cur_price;<BR>    case 5<BR>        c=c-x5;<BR>        cur_price=a*b+cur_price;<BR>    case 6<BR>        c=c-x6;<BR>        cur_price=a*b+cur_price;<BR>end<BR>end<BR>if cur_price&lt;price,<BR>    price=cur_price;<BR>    best_n=n';<BR>elseif cur_price==price<BR>    best_n=[best_n,n'];<BR>    <BR>end<BR>end<BR>end<BR>end<BR>end<BR>end<BR>end<BR>end<BR>best_n<BR>price<BR>num
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2025-5-17 13:04 , Processed in 0.057781 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表