arrays - 找到最小距离都值 pythonic

标签 arrays python-3.x algorithm dictionary swarm

我无法找到列表中每个值与另一个值的最小距离。每个值代表鱼,每条鱼都有视觉。

我可以计算距离,但问题已经开始,鱼的值(value)增加了​​两倍:

例如,我有 3 个鱼的值并检查值中的最小距离,结果与预期不相等。值3改为6,乘以2

这种算法类似于粒子群算法,这种方法的名字叫人工鱼群算法(AFSA)

我试过这样写代码:

这个鱼对象:


class Fish(object):

  def __init__(self, weight, visual):
    self._weight = weight
    self._visual = visual

  def __iter__(self):
    return self

  def set_weight(self, weight):
    self._weight = weight

  def get_weight(self):
    return self._weight

  def set_visual(self, visual):
    self._visual = visual

  def get_visual(self):
    return self._visual

  def set_step(self, step):
    self._step = step

  def get_step(self):
    return self._step

  def set_fitness(self, fitness):
    self._fitness = fitness

  def get_fitness(self):
    return self._fitness

但是,我使用了鱼的对象并计算距离然后比较距离与视觉小于另一条鱼的视觉:


import random

if __name__ == '__main__':

  agent_size = 2
  weight_length = 2
  fish = None
  fish_population = []

  visual = [random.uniform(0, 1) for _ in range(agent_size)]
  weight = [[random.uniform(0, 1) for _ in range(weight_length)] for _ in range(agent_size)]

  for i in range(agent_size):
    fish = Fish(weight[i], visual[i], step[i], fitness[i], None)
    fish_population.append(fish)

-------------> # duplicate position of fish 
  for current in fish_population:
    for target in fish_population:
      if current != target:
        distance = current.get_visual() - target.get_visual()

        if distance < current.get_visual():
           # follow
        else:
           # no follow
------------->

我有预料到

fish_population = [fish_1, fish_2]
....
if (fish_1.visual() - fish_2.visual()) < fish_2.visual():
   fish_2 follow fish_1
else:
   fish_1 not follow fish_2

但是结果是fish followed more than population,真实情况是fish只有3条但是能够循环到3条以上的fish

拜托,我需要任何人对我的代码或算法提出建议或批评,

非常感谢

最佳答案

已经将近 4 天了,我试图为自己的问题找到解决方案。

agent_size = 3
weight_length = 2
fish_population = []

visual = [random.uniform(0, 1) for _ in range(agent_size)]
step = [random.uniform(0, 1) for _ in range(agent_size)]
weight = [[random.uniform(0, 1) for _ in range(weight_length)] for _ in range(agent_size)]
fitness = [random.uniform(0, 1) for _ in range(agent_size)]

for i in range(agent_size):
  fish = Fish(weight[i], visual[i], step[i], fitness[i])
  fish_population.append(fish)

# collec fish with minimum distance
collect_fish = []
for index_current, fish_current in enumerate(fish_population):

collect_fish = []
for index_current, fish_current in enumerate(fish_population):
  bucket_fish = {"current": fish_current, "target": [], "distance": []}
  for index_target, fish_target in enumerate(fish_population):
    if index_current != index_target:
      result = abs(fish_current.get_visual() - fish_target.get_visual())
      bucket_fish["distance"].append(result)
      bucket_fish["target"].append(fish_target)
  collect_fish.append(bucket_fish)
print(collect_fish)

鱼是这样的

[{'current': <__main__.Fish object at 0x7f290ef14208>, 'target': [<__main__.Fish object at 0x7f290ef141d0>, <__main__.Fish object at 0x7f290ef14160>], 'distance': [0.5637158347185028, 0.5452865173391022]}, {'current': <__main__.Fish object at 0x7f290ef141d0>, 'target': [<__main__.Fish object at 0x7f290ef14208>, <__main__.Fish object at 0x7f290ef14160>], 'distance': [0.5637158347185028, 0.018429317379400678]}, {'current': <__main__.Fish object at 0x7f290ef14160>, 'target': [<__main__.Fish object at 0x7f290ef14208>, <__main__.Fish object at 0x7f290ef141d0>], 'distance': [0.5452865173391022, 0.018429317379400678]}]

鱼会像这样按最小距离收集当前鱼和目标鱼:

fish_follower = []
fish_preyer = []
for index, fish in enumerate(collect_fish):
  min_distance = min(fish["distance"])
  print(min_distance, fish["distance"], fish["current"].get_visual())
  if min_distance < fish["current"].get_visual(): 

    index_following = fish["distance"].index(min_distance)
    fish_follower.append({"current": fish["current"], "target": fish["target"][index_following]})
  else:
    fish_preyer.append({"current": fish["current"]})

  print("follower: {} {}".format(fish_follower, len(fish_follower)))
  print("preyer: {} {}".format(fish_preyer, len(fish_preyer)))

结果:

follower: [{'current': <__main__.Fish object at 0x7f57fa826dd8>, 'target': <__main__.Fish object at 0x7f57fa6d62e8>}, {'current': <__main__.Fish object at 0x7f57fa6d62e8>, 'target': <__main__.Fish object at 0x7f57fa6d6278>}] 2
preyer: [{'current': <__main__.Fish object at 0x7f57fa6d6278>}] 1

但新的问题是鱼会跟随一只鱼和一只猎物。有时一条鱼可以不止一条,但捕食的鱼永远是一个捕食者,不能超过一个捕食者

如果有另一个最好的解决方案,我还是会来寻找另一个答案,例如时间消耗或优化算法。

此代码是基本 AFSA 的一部分。

关于arrays - 找到最小距离都值 pythonic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484690/

相关文章:

javascript - mongodb/mongoose - 按两个字段排序

来自数组元素的 java math.sqrt

arrays - postgres,多维数组的包含运算符在比较之前执行展平?

java - 查找二叉树节点有序排序的高效算法

c# - 具有最小堆的 Heapsort 无法正常工作

javascript - JavaScript 数组中的随机颜色

linux - 看不到 pylab 的情节

Python Web 套接字仅发送 1 条消息

python - 如何根据列名属性对 Pandas 数据框进行切片?

java - 修改矩阵并将列和行设置为零的算法