一维下料 php,求教:一维下料算法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

//坯料长度

var arrTypeLength=new Array(1500,2000,3000);

var arrTypeLength1=new Array(1500,2000,3000);

//坯料需要的数量

var arrTypeNum=new Array(10,11,15);

var arrTypeNumc=new Array(10,11,15);

//母料长度,数量不限

var cailiao=6000;

//每切一刀损耗

var shunhao=8;

var maxdao=5;

//更新坯料下了多少根

//for (var i=0;i<10;i++){

//duzuhe();

//}

//组合

var zuhe=new Array();

var mybreak=true;

var cailiaozongshu=0;

while(mybreak){

minNum(duzuhe());

for(var y=0;y

if(arrTypeNum[y]==0){

arrTypeLength1.splice(y,1);

arrTypeNum.splice(y,1);

}

}

if(arrTypeLength1.length==0 ){

mybreak=false;

}

}

document.write("

共用料"+cailiaozongshu+"根,材料应用率为:"+bilie(cailiaozongshu)+"

");

//求比列

function bilie(num){

var tnum=0;

for(var i=0;i

tnum=tnum+(arrTypeLength[i]*arrTypeNumc[i]);

}

return tnum/(num*cailiao);

}

function duzuhe(){

//余料

var yuliao=new Array();

//第几次组合

var zuheNum=0;

//当前要切的尺寸

for (var i=0;i<50000;i++){

//当前用的料

var nowCailiao=cailiao;

//切第几刀

var daoNum=0;

//当前组合

var nowZuhe=new Array();

while(true){

var nowTypeLength=panduanQieliao(arrTypeLength1,nowCailiao,daoNum);

if(nowTypeLength<=0){

break ;

}

//可以切,每一刀8个毫米的损耗

nowCailiao-=(nowTypeLength+8);

if(isNaN(nowTypeLength)){

var a ;

};

//将这个长度写入数组

nowZuhe[daoNum]=nowTypeLength;

daoNum++;

if(daoNum==maxdao){

break;

}

}

//将当前组合写入存储到数组

zuhe[i]=[].concat(nowZuhe);

}

var wanmeizuheId=0;

var wanmeizuheBili=0;

//执行到这里就是一个大的组合了

//根据原材料利用率来选择使用方法

for(var i=0;i

var wanmeizuheId=0;

var wanmeizuheBili=0;

var tempNum=0;

for(var t=0;t

if(zuhe[i][t]== "undefined"){

zuhe[i][t]=0;

}

tempNum+=zuhe[i][t];

}

if((cailiao-tempNum)

wanmeizuheId=i;

wanmeizuheBili=cailiao-tempNum;

}

}

//alert(zuhe[wanmeizuheId]);

if(zuhe.length==0){

var a ;

}

return zuhe[wanmeizuheId] ;

}

//第一组接近最优方案

//按照最优方案下料

//产生一个随机数

function myrandm(num){

return Math.floor(Math.random()*num);

}

//判断母料是否能再切一块坯料

function panduanQieliao(arr,muliao,daoNum_x){

var temp = new Array();

var tempi=0;

for(var i=0;i

if(muliao>=arr[i]){

temp[tempi]=i;

tempi++;

}

}

var tempn=0;

if(daoNum_x==0){

for(var i=0;i

if(arr[temp[i]]>tempn){

tempn=arr[temp[i]];

}

}

return tempn;

}

if (tempi==0){

return 0;

}else if(tempi==1){

return arr[temp[0]];

}else {

//产生一个随机数

return arr[temp[myrandm(temp.length)]];

}

}

//根据这一个数组下料

function minNum(arr){

//判断切多少根

var tempNumgen=0;

//arr=new Array(4500,4500,800);

//切得是那一道

var qietype=new Array();

//一刀是要切几次

var qienum=new Array();

//

//生成当前切几次

for(var i=0;i

var zhuangtai=0;

if(i==0){

qietype[0]=arr[i];

qienum[0]=0;

}else{

var zt=0;

for(var t=0;t

if(arr[i]==qietype[t]){

zt=1;

}

}

if(zt==0){

qietype.push(arr[i]);

qienum.push(0);

}

}

}

var liaonum=0;

//下料状态是正在进行

var qieliaozhuangtai="jinxing";

//余料

var yuliao_the=0;

while(true){

var liao=cailiao;

for(var i=0;i

for(var t=0;t

if(arr[i]==arrTypeLength1[t]){

if(arrTypeNum[t]>0){

arrTypeNum[t]-=1;

liao-=arr[i];

if(arrTypeNum[t]==0){

qieliaozhuangtai="wancheng";

}

for(var x=0;x

if(qietype[x]==arr[i]){

qienum[x]++;

}

}

break;

}

}

}

}

//切完后更新数组

for(var y=0;y

if(arrTypeNum[y]==0){

arrTypeLength1.splice(y,1);

arrTypeNum.splice(y,1);

}

}

var str="

材料:"+(liaonum+1)+" 根------";

if(qieliaozhuangtai=="wancheng" && liao==cailiao){

for(var j=0;i

str=str+qietyp[j]+" * "+qienum[j]+"-----------------";

}

document.write(str);

cailiaozongshu+=(liaonum+1);

return str;

}else if(qieliaozhuangtai=="wancheng" && liao0) {

//这个类型下料完成

//看看余料是否还能下料

var yuliaozuhe= new Array();

while(true){

var tn=0;

tn=panduanQieliao(arrTypeLength1,liao,0);

if(tn==0){

//不能在下料

break;

}else{

yuliaozuhe.push(tn);

liao-=tn;

}

}

if(yuliaozuhe.length==0){

for(var j=0;j

str=str+qietype[j]+" * "+qienum[j]+"-----------------";

}

cailiaozongshu+=(liaonum+1);

document.write(str);

return;

}else {

for(var j=0;j

str=str+qietype[j]+" * "+qienum[j]+"-----------------";

}

str+="
余料处理:"

for(var j=0;j

str=str+yuliaozuhe[j]+" * 1 ----------";

for(var p=0;p

if(yuliaozuhe[j]==arrTypeLength1[p]){

arrTypeNum[p]--;

}

}

}

document.write(str);

cailiaozongshu+=(liaonum+1);

return;

}

}

liaonum++

}

//找出数量最少的

//确定切多少根材料

for (var i=0;i

for(var t=0;t

if(arr[i]==arrTypeLength[t]){

if(tempNumgen

tempNumgen=arrTypeNum[t];

}

}

}

}

//开始切

}

//先求单根解,

//每根有不同的组合

//甄选最优组合,成倍切下

//变更剩下需要下料数量

//重复上面步骤

//考虑到成本,最好每根下料不超过4次

Hello world!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值