花开富贵 发表于 2023-9-8 20:52:44

mahuan1279 发表于 2023-9-8 15:45
那要是第一个障碍物处就卡壳了咋办?比如第一个不管选1200,还是900,右端点都在第一个障碍物半径内?

一般不会的,而且可以设置多个备用的材料,如果不行,再换下一个长度的上来

mahuan1279 发表于 2023-9-9 08:17:42

花开富贵 发表于 2023-9-8 20:52
一般不会的,而且可以设置多个备用的材料,如果不行,再换下一个长度的上来

BFS宽度搜索。

花开富贵 发表于 2023-9-9 17:47:48

mahuan1279 发表于 2023-9-9 08:17
BFS宽度搜索。

感谢

caoliu023 发表于 2023-9-9 22:19:59

本帖最后由 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("无法排布材料以满足要求")

输出:

使用的材料分别是:
注意:这只是一个简单的示例函数,仅考虑了给定的情况,并没有对所有可能的输入进行全面的验证。 在实际使用时,你可能需要根据具体情况进行适当的调整和扩展

花开富贵 发表于 2023-9-9 22:57:19


(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))
)

花开富贵 发表于 2023-9-9 22:58:22

我这个回复咋是黄色的,你们的怎么花花绿绿的?
页: 1 [2]
查看完整版本: 规避障碍物算法