求教用lisp 进行简单的一维条材套料的算法
本帖最后由 fan_zh 于 2015-7-17 10:46 编辑如有这样的表(1.2 1.5 2.3 2.6 2.6 3.3 3.5 4.1 4.2),它是从小到大已排序,是有重复项的,实际上为子材的长度,母材的长度为单一长度,如5,要计算所需要母材数量
我知道这是个比较专业的算法领域,论坛上类似程序,但一直没有代码
我想到的简化办法是从大到小进行相加,只要相加满足条件,相加项可能数量为1,也可能2,3,或者更多,然后把相应相加项 从表中去掉,生成新表,再循环
求此代码或能给点类似代码
可能表达不是最清楚,上个图吧,注意图中相加项最多为2项,实际希望可为更多项
Msteel 工具箱有提供这个套料的程序。免费的。 感谢楼上回贴
我是在写个程序,中间有部分数据需要这样算一下
程序输入表,输出计算结果,当然有详细结果输出就更好了 如有这样的表(1.2 1.5 2.3 2.6 2.6 3.3 3.5 4.1 4.2),它是从小到大已排序,是有重复项的,实际上为子材的长度,母材的长度为单一长度,如5,要计算所需要母材数量
我知道这是个比较专业的算法领域,论坛上类似程序,但一直没有代码
我想到的简化办法是从大到小进行相加,只要相加满足条件,相加项可能数量为1,也可能2,3,或者更多,然后把相应相加项 从表中去掉,生成新表,再循环
求此代码或能给点类似代码
你觉得你讲明白了,实际上完全一头雾水。。。。。。。。
原表是(1.2 1.5 2.3 2.6 2.6 3.3 3.5 4.1 4.2)
你想要的目标表或者目标数值是多少?
原表到目标是怎么转换的?
知道这些别人才能帮你编写程序。。。 已更新问题,应该很明白了,最终结果只是一个数值,如图中的6 求高手相助此循环写法 (defun c:qs123()
; 最节省母材材料?
(setq b1 '(1.2 1.5 2.3 2.6 2.6 4.8 3.3 3.5 4.1 4.2 4.3))
(setq b1 '(1.2 1.5 2.3 2.6 2.63.3 3.5 4.1 4.2 ))
(setq b1 (vl-sortb1 '>))
(setq kn 5 i 0 n 0 b2 b1 b4 '() b3 '() )
(while (cdr b2)
(setq t1 (car b2)b2 (cdr b2) t2 (cadr (reverse b2)) t3 (car (reverse b2)) );t3 最后一位
(cond
((<= (+ t1 t2 t3) kn)(setq i (1+ i) b2 (reverse (cdr (cdr (reverse b2)))) b3 (cons (list t1 t2 t3) b3) ))
((<= (+ t1 t2 ) kn)(setq i (1+ i) b2 (cons t3 (cdr (cdr (reverse b2)))) b2 (reverse b2) b3 (cons (list t1 t2) b3)))
((<= (+ t1 t3) kn)(setq i (1+ i) b2 (reverse(cdr (reverse b2))) b3 (cons (list t1 t3) b3) ))
((<= t1 kn)(setq i (1+ i) b3 (cons (list t1) b3) ))
(t (print t1))
)
)
(setq i (1+ i)b3 (cons b2 b3) )
(print b1)
(print (reverse b3))(princ i)
(princ)
)是不是这样?你可以据此再改进。
命令: qs123
(4.2 4.1 3.5 3.3 2.6 2.6 2.3 1.5 1.2)
((4.2) (4.1) (3.5 1.5) (3.3 1.2) (2.6 2.3) 2.6) 6
太感谢了,我去测试下 这种算法是首尾相加,在某些情况下,可能不适用 看看谁还有更好的代码
页:
[1]
2