hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 468|回复: 9

一维下料算法

[复制链接]

604

主题

616

帖子

1951

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1951
发表于 2023-10-2 16:47:17 | 显示全部楼层 |阅读模式
我根据自己的算法手工可以算出较优解,时间也就几分钟而已。
比如原材料规格2m,毛坯规格及数量要求分别为0.8m10根,0.6m4根,1.5m65根,0.7m6根,0.45m7根,0.2m76根。先按数量从多到少排列((0.2  76)(1.5  65)(0.8 10)(0.45  7)(0.7  6)(0.6  4)),然后合并列出每种下料方式剩下的余料长
即((0.2  76)(1.5  65)(0.8 10)(0.45  7)(0.7  6)(0.6  4))
=((1.5 0.2) 65  0.3)(0.2  11)(0.8 10)(0.45  7)(0.7  6)(0.6  4))
=((1.5 0.2) 65  0.3)(0.8  0.2) 10  1)(0.45  7)(0.7  6)(0.6  4)(0.2 1))
=(((1.5 0.2) 65  0.3)((0.8  0.2) 10  1)((0.7 0.45 ) 6 0.85)(0.6  4)(0.45  1)(0.2 1))
=(((1.5 0.2) 65  0.3)((0.8  0.2) 10  1)((0.7 0.45 ) 6 0.85))((0.6  0.6 0.6) 1 0.2)((0.6 0.45  0.2)1 0.75))  ;;;然后按预料从小到大排列=( ((0.6  0.6 0.6) 1 0.2) ((1.5 0.2) 65  0.3) ((0.6 0.45  0.2) 1 0.75) ((0.7 0.45 ) 6 0.85) ((0.8  0.2) 10  1));;;从第一项开始,余料0.2m>=最小毛坯0.2m,将最后一个0.2m迁移往前,依次往后,尽量使得余料小于最小毛坯长度(核心思想即若是后续零件往前移可以使整体更紧凑,那么就将该零件往前移)。
……
最终得到( ((0.45 0.45 0.45 0.45 0.2) 1 0) ((0.6 0.2 0.2 0.2 0.2 0.2 0.2 0.2) 1 0) ((0.8 0.8 0.2 0.2)1 0)((0.6 0.6 0.6 0.2)1 0)((0.8 0.7 0.45) 2 0.05)
    ((1.5 0.45) 1 0.05) ((1.5 0.2 0.2) 32 0.1) ((1.5 0.2) 1 0.3) ((1.5) 31 0.5) ((0.8 0.7) 4 0.5) )
最前面几项余料小于最小毛坯0.2,从((1.5 0.2)1 0.3)开始余料均大于最小毛料,若将前面 ((1.5 0.2 0.2) 32 0.1)中的0.2迁移过来,余料由0.3变为0.1,但((1.5 0.2 0.2) 32 0.1)中的预料为0.1,即迁移后对整体没有改进,所以不予迁移。以此类推。
故总根数为1+1+1+1+2+1+32+1+31+4=75根

对比别人EXCEL程序结果74根,发现须补充几条规则:1若迁移后对整体没一影响,但将前面较小的零件移至后面了,这种情况还是要迁移的。如(……(0.6 0.2 0.2 0.2 0.2 0.2 0.2 0.2)1 0)……((0.8  0.8)2 0.4)),即迁移后(……((0.8 0.8 0.2 0.2)2 0)……((0.6 0.2 0.2 0.2)1 0.8))转化为;2、余料(大于最小毛坯长)须两极分化,一个小,一个大,而不能合并取平均,如((0.8  0.7)2 0.5)应为(((0.8  0.8)1 0.4)((0.7 0.7) 1 0.6)。
回复

使用道具 举报

0

主题

192

帖子

159

积分

关内侯

Rank: 2

积分
159
发表于 2023-10-2 16:48:08 | 显示全部楼层
那么有个问题,即若迁移后对整体没影响,但会将较大毛坯和较小毛坯同时后移,此时该不该发生迁移呢?
如(……((1.5  0.3  0.2)1 0)……((0.6 0.6 0.5)1 0.3)……)?
若前面迁移项中每项均不大于后面迁移项中的最大值,显然迁移。
感觉视后面的情况而定,举个不恰当的例子,如果后面有项差值大于1.5,那么就迁移,否则不迁移。
即(……((1.5  0.3  0.2)1 0)……((0.6 0.6 0.5)1 0.3)……(()K   1.6)……)时迁移。
回复

使用道具 举报

0

主题

171

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:48:37 | 显示全部楼层
补充几条排位规则:
1、当余料相同且项内最小毛坯相同时,按各项内最大毛坯长度由大到小排列;
2、当余料相同且项内最大、最小毛坯长度相同时,按最小毛坯个数由少到多排列。
故( ((0.45 0.45 0.45 0.45 0.2) 1 0) ((0.6 0.2 0.2 0.2 0.2 0.2 0.2 0.2) 1 0) ((0.8 0.8 0.2 0.2)1 0)((0.6 0.6 0.6 0.2)1 0)((0.8 0.7 0.45) 2 0.05)……)正确的排位为( ((0.8 0.8 0.2 0.2)1 0)((0.6 0.6 0.6 0.2)1 0)((0.6 0.2 0.2 0.2 0.2 0.2 0.2 0.2) 1 0) ((0.45 0.45 0.45 0.45 0.2) 1 0) ((0.8 0.7 0.45) 2 0.05)……)
回复

使用道具 举报

0

主题

172

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:49:07 | 显示全部楼层
((3.62  3.52 1.72) 110 3.14))   ;;;原料长2m.
=((3.62  3.52 1.72 1.72) 55 1.72) (3.62  3.52) 55 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 27 0) ((3.62 3.52 1.72 1.72) 1 1.72) ((3.62  3.52 1.72) 27 3.14)(3.62  3.52) 55 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 28 0) ((3.62  3.52 1.72) 26 3.14)(3.62  3.52) 56 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 28 0) ((3.62  3.52 1.72 1.72) 13 1.72)  ((3.62  3.52) 13 4.86)  (3.62  3.52) 56 4.86) )=((3.62  3.52 1.72 1.72 1.72) 28 0) ((3.62  3.52 1.72 1.72) 13 1.72)  ((3.62  3.52) 69 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 28 0) ((3.62  3.52 1.72 1.72 1.72) 6 0) ((3.62  3.52 1.72 1.72) 1 1.72) ((3.62  3.52 1.72 ) 6 3.14)   ((3.62  3.52) 69 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 34 0) ((3.62  3.52 1.72 1.72) 1 1.72) ((3.62  3.52 1.72 ) 6 3.14)   ((3.62  3.52) 69 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 34 0) ((3.62  3.52 1.72 1.72 1.72) 1 0) ((3.62  3.52 1.72 ) 5 3.14)   ((3.62  3.52) 69 4.86)  ((3.62  3.52) 1 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 35 0) ((3.62  3.52 1.72 ) 5 3.14)   ((3.62  3.52) 70 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 35 0) ((3.62  3.52 1.72 1.72 ) 2 1.72) ((3.62  3.52 1.72 ) 1 3.14) ((3.62  3.52) 2 4.86)   ((3.62  3.52) 70 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 35 0) ((3.62  3.52 1.72 1.72 ) 2 1.72) ((3.62  3.52 1.72 ) 1 3.14)  ((3.62  3.52) 72 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 36 0) ((3.62  3.52 1.72 1.72 ) 1 1.72) ((3.62  3.52) 1 4.86)  ((3.62  3.52) 72 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 36 0) ((3.62  3.52 1.72 1.72 ) 1 1.72) ((3.62  3.52) 73 4.86) )
=((3.62  3.52 1.72 1.72 1.72) 36 0) ((3.62  3.52 1.72 1.72 ) 1 1.72) ((3.62  3.52 3.62) 24  1.24)((3.52 3.62 3.52)  24 1.34) ((3.62 3.52) 1 4.86))
=((3.62  3.52 1.72 1.72 1.72) 36 0)((3.62  3.52 3.62) 24 1.24) ((3.52 3.62 3.52)  24 1.34)((3.62  3.52 1.72 1.72 ) 1 1.72)  ((3.62 3.52) 1 4.86))
=((3.62  3.52 1.72 1.72 1.72) 36 0)((3.62  3.52 3.62) 25  1.24) ((3.52 3.62 3.52)  24 1.34)((3.52 1.72 1.72 ) 1 5.04))
除最后一项(仅为一根)外,其余每项差值均小于最小毛坯长度,故程序结束。程序运行结果根数为36+25+24+1=86(应该是最优解吧),理论值(3.62+3.52+1.72)*110/12=81.21
回复

使用道具 举报

0

主题

185

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:49:37 | 显示全部楼层
判断条件存在错误,即“每项差值均小于最小毛坯长度,故程序结束”不正确。
如((0.8   0.4  0.3   0.3) 100   0.2)
= ((0.8   0.4  0.3   0.3) 100   0.2)
=(((0.8  0.3  0.3  0.3  0.3)25   0)(0.8  0.8  0.4)37   0)(0.8  0.4  0.4  0.4)1  0)((0.4   0.4   0.4   0.4  0.4) 12   0)(0.3  0.3  0.3  0.3  0.3  0.3)16  0.2)(0.3 0.3 0.3 0.3)1 0.8))
回复

使用道具 举报

0

主题

167

帖子

92

积分

关内侯

Rank: 2

积分
92
发表于 2023-10-2 16:50:12 | 显示全部楼层
这一类问题叫排样。遗传算法解决。
回复

使用道具 举报

0

主题

177

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2023-10-2 16:50:52 | 显示全部楼层
我会做具体的题目。
080×10=0800——05,040×05,040×00,040×00
060×04=0240——04,140×04,140×01,140×01
150×65=9750——65,050×65,050×58,050×25
070×06=0420——00,070×06,070×00,070×00
045×07=0315——00,045×07,045×00,045×00
020×76=1520——00,020×76,020×66,020×00
合计13045,下料74根,剩余140×1(根)+50×25(根)
1,至少得66根(13045÷200);
2,至少得70根(65+10÷2);
3,至少得73根(65+(10+6)÷2);
4,74根是可行的(65+5+4)。
回复

使用道具 举报

0

主题

154

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:51:38 | 显示全部楼层
看不懂你列式的意义。
回复

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:52:17 | 显示全部楼层
我会做具体的题目。
比如原材料规格2m,毛坯规格及数量要求分别为0.8m10根,0.6m4根,1.5m65根,0.7m6根,0.45m7根,0.2m76根。
比如原材料规格200,毛坯规格及数量要求分别为080×10根,060×4根,150×65根,070×6根,045×7根,020×76根。
                                      (1)            (2)            (3)
080×10=0800——05,+040×05,+040×00,+040×00
060×04=0240——04,+140×04,+140×01,+140×01
150×65=9750——65,+050×65,+050×58,+050×25
070×06=0420——00,- 070×06,- 070×00,- 070×00
045×07=0315——00,- 045×07,- 045×00,- 045×00
020×76=1520——00,- 020×76,- 020×66,- 020×00
合计13045=800+240+9750+420+315+1520
1,至少得66根(13045÷200);
2,至少得70根(65+10÷2);
3,至少得73根(65+(10+6)÷2);
4,74根是可行的(65+5+4)。
具体方法
下料74根=(80×2)×5根+(60×1)×4根+150×65根,
(1):第一次剩余与不足;
(2):第二次剩余与不足;
(3):最后剩余140×1(根)+50×25(根)
回复

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:53:02 | 显示全部楼层
clc
clear all
close all
%% 读取钢筋数据
data=load('钢筋明细表.txt');%读取数据
r=unique(data(:,1));%获得有哪几种钢筋直径
L=9000;%原始钢管长度
%% 计算每种钢筋尺寸的原材料的切割方式
global L_data d_data
for i1=3:3%length(r)%每种直径的材料依次循环
    fprintf('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n')
    fprintf(strcat('直径为',num2str(r(i1)),'的切割方式为:\n'))
%% 获取最终的尺寸和数量
I1=find(data(:,1)==r(i1));
L_data=unique(data(I1,2));%获得有哪几种钢筋长度
d_data=zeros(length(L_data),1);%计算不同钢筋长度的数量
m=length(L_data);%钢筋的种类
for i2=1:length(I1)
    for i3=1:length(L_data)
       if data(I1(i2),2)==L_data(i3)
           d_data(i3)=d_data(i3)+1;
       end
    end
end
k=0;
for i2=1:length(L_data)
    k=k+ceil(d_data(i2)/floor(L/L_data(i2)));%计算一个初始的范围
end
%% 用GA求解
%未知数为aij和k1,aij前k1行有数据,后面k-k1行为0
LB=zeros(k*m+1,1);%下限
b=d_data;
A=zeros(m,k*m);
for i3=1:m%不同的钢筋种类
    for i4=1:k
        A(i3,i3+(i4-1)*k)=1;
    end
end

%% 显示结果
end
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 11:52 , Processed in 0.060474 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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