- UID
- 12028
- 积分
- 263
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-10-18
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2005-2-1 12:18:47
|
显示全部楼层
谢谢长老!
这其实是一个钢筋的智能搭接问题,譬如,一般梁上部钢筋在跨中搭接,但是具体的搭接位置
却在一定范围内都可以,要考虑施工方便和减少材料品种,这才引出了上述问题.呵呵,是我自己想
复杂了,考虑了对整个x1,,,,,Xn的移动,考虑了全遍历.考虑了,多次循环后,虽然可以得到答案,也许把可以
不调整的位置调整了,不好.---等等.
呵呵.
现在,我自己也解决了.介绍给大家,希望能博一笑!
思路:
1,对N跨梁,其最左,最右,是固定的.(为柱边-保护层厚度)这是不变的.
2,第一个搭接位置,暂取梁跨的中点,算出长度 l
3,查讯已经使用过的规格(长度)中,有无合适的(即在允许调整范围内的最接近的已有长度)
如果查到,就返回最接近的已有长度; lll
如果没有,就对长度整(满足长度尾数20cm,50cm,80cm,0cm--简称"2580"),返回:lll
并填加到"已有规格" lst2 表,中.
4,调整搭接点位置.
5,取下一个跨中. 再计算出长度 l
6,循环,3,4,5
7,判断已到最后一跨了,,,,,,,直接取2580
这样,就是,最优的搭接方案了:
---控制了钢筋在搭接允许偏差内钢筋长度的种类最少.
下面是简单的调试程序: 欢迎指正!
(defun c:test (/ lst2) ;给8个长度值,200~2000(实际工程跨度一般在2米~20m).
(setq lst2 '()) ;已经采用的长度规格的表
(setq n 8)
(repeat n
(SETQ l (getint "测试长度:"))
(setq lll (near_len l))
(princ lll) ;返回,最合适的经过调整的可取长度.
(princ lst2) ;显示已采用的规格库
)
(princ)
)
(defun near_len (l / b k add dec tmp bk) ;查询表中有无相近的,
;若没有就取最接近的2580,并添加到表;若有就返*回*2580的值
(if (= (length lst2) 0)
(setq bk (near_258 l)
lst2 (cons bk lst2)
)
)
(SETQ k 0
dec 100
)
(repeat (length lst2) ;TW_W_int2580
(setq b (nth k lst2)
tmp (abs (- l b))
)
(if (< tmp dec)
(progn
(setq dec tmp
bk b
)
)
(setq k (1+ k))
)
)
(if (>= dec 30) ;搭接点控制误差允许30cm
(setq bk (near_258 l)
lst2 (cons bk lst2)
)
)
bk
)
(defun near_258 (l / a b l2 back) ;入口不规整长度,返回最接近的满足2580的长度
(SETQ l2 (- l 20.0)
a (tw_w_int2580 l)
b (tw_w_int2580 l2)
)
(if (> (abs(- a l))(abs(- l b)))
(setq back b)
(setq back a)
)
back
)
(defun TW_W_int2580 (i5 / i i1 i2 i3 i4) ;入口不规整长度,返回刚好比原长度大一点点的,符合2580的长度.
(setq i (/ i5 100.0))
(setq i1 (fix i))
(setq i2 (- i i1))
(cond
((and (> i2 0.0) (< i2 0.201))
(setq i3 0.2)
)
((and (> i2 0.2) (< i2 0.501))
(setq i3 0.5)
)
((and (> i2 0.5) (< i2 0.801))
(setq i3 0.8)
)
((> i2 0.8)
(setq i3 1.0)
)
(t (setq i3 0.0))
)
(setq i (+ i3 i1))
(setq i4 (* i 100.0))
i4
)
完! 再次感谢长老! |
|