那要是第一个障碍物处就卡壳了咋办?比如第一个不管选1200,还是900,右端点都在第一个障碍物半径内?
一般不会的,而且可以设置多个备用的材料,如果不行,再换下一个长度的上来 花开富贵 发表于 2023-9-8 20:52
一般不会的,而且可以设置多个备用的材料,如果不行,再换下一个长度的上来
BFS宽度搜索。 mahuan1279 发表于 2023-9-9 08:17
BFS宽度搜索。
感谢 本帖最后由 caoliu023 于 2023-9-9 22:23 编辑
以下由gpt回复:
是的,你可以通过递归来解决这个问题。
下面是一个使用递归的Python函数示例,可以根据给定的起点、终点、材料长度和障碍物信息来排布材料
def arrange_material(start, end, material_lengths, obstacles):
# 递归终止条件:起点和终点之间没有障碍物
if not any(obstacle <= start <= obstacle or obstacle <= end <= obstacle for obstacle in obstacles):
return ] * ((end - start) // material_lengths) + ]
# 递归终止条件:材料长度不足以覆盖起点和终点之间的障碍物
if material_lengths < max(obstacle - obstacle for obstacle in obstacles):
return None
# 优先使用第一种材料
arrangement = ]
# 查找起点和终点之间的第一个障碍物
for obstacle in obstacles:
if obstacle <= start <= obstacle or obstacle <= end <= obstacle:
break
# 将材料排布到障碍物之前的部分
if obstacle > start:
sub_arrangement = arrange_material(start, obstacle, material_lengths, obstacles)
if sub_arrangement is None:
return None
arrangement.extend(sub_arrangement)
# 将材料排布到障碍物之后的部分
sub_arrangement = arrange_material(obstacle, end, material_lengths, obstacles)
if sub_arrangement is None:
return None
arrangement.extend(sub_arrangement)
return arrangement
使用示例:
material_lengths =
obstacles = [(2400, 2410), (3000, 3020)]
start = 0
end = 3600
result = arrange_material(start, end, material_lengths, obstacles)
if result is not None:
print("使用的材料分别是:", result)
else:
print("无法排布材料以满足要求")
输出:
使用的材料分别是:
注意:这只是一个简单的示例函数,仅考虑了给定的情况,并没有对所有可能的输入进行全面的验证。 在实际使用时,你可能需要根据具体情况进行适当的调整和扩展
(defun f(LenUsing)
(setq lenTotal (sumx LenUsing))
(cond
((vl-some '(lambda(y z) (equal lenTotal y z)) obstruction Rinfluence)
(f (PlanB LenUsing))
)
((<= lenMax2 lenTotal lenMax) (reverse LenUsing))
((< lenMax lenTotal ) (reverse(cdr LenUsing)))
(t (f (cons LenRecommendLenUsing)))
)
)
(defun PlanB(LenUsing / elenew lenusing$ loop)
(setq LenUsing$ LenUsing
loop t
)
(while loop
(if (setq eleNew(cadr (member (car LenUsing$) LenList)))
(setq LenUsing$ (cons eleNew (cdr LenUsing$))loop nil)
(setq LenUsing$ (cdr LenUsing$))
)
(if (null LenUsing$) (getstring"\n已经没有替代方案了,检查是否有错误,或者补充下备用材料再尝试运行此命令"))
)
LenUsing$
)
(defun sumx (x)
(if x (apply '+ x) 0.0)
)
例子
(defun c:tt()
(setq
LenMax 1000;;;任务总要求
LenMax2 950;;;任务临界值
LenList '(120 90 60);;;优先用120,其次90,再60......
LenRecommend (car LenList);;;推荐材料尺寸
obstruction '(100 240 350 540 980);;;障碍物位置
R 0.01
Rinfluence '(20 30 40 30 30);;;障碍物影响半径
)
(princ"\n从前到后的材料长度分别为:")(f (list LenRecommend))
)
我这个回复咋是黄色的,你们的怎么花花绿绿的?
页:
1
[2]