【问题标题】:How to pass multiple variables to a function in Python (used in packages such as PSO and GA)如何将多个变量传递给 Python 中的函数(用于 PSO 和 GA 等包)
【发布时间】:2021-10-29 23:26:30
【问题描述】:

Python中的一些包使用函数(def)作为优化问题的目标函数或适应度函数,例如https://pypi.org/project/pyswarms/https://pypi.org/project/geneticalgorithm/

例如

def f(X):
    return np.sum(X)

这是包的默认设置,我无法定义:

def f(X, Y):
    return np.sum(X) + np.sum(Y)

这些函数只有 X 作为输入,我想知道如何使用多个变量作为输入(例如 x 和 y),甚至是具有多个索引的变量。

我能够解决一些在单个数组中转换多个变量的问题;但是,在我看来,这是一项艰巨的工作。

有人可以提供有关此主题的任何提示吗?

谢谢

【问题讨论】:

  • 我认为,如果您举一个您当前使用的方法的示例,可能有助于澄清问题。

标签: python genetic-algorithm


【解决方案1】:

我建议看看 map()。

https://docs.python.org/3/library/functions.html#map

map() 函数将给定函数应用于可迭代对象(列表、元组等)的每个项目并返回一个迭代器。

def func(a):
    return a*a

cluster = [5,10,15,20]

list(map(func, cluster))

[25, 100, 225, 400]

或者,也可以使用 lambda 函数:

numbers = [1, 2, 3, 4, 5]

squared = map(lambda num: num ** 2, numbers)

list(squared)

[1, 4, 9, 16, 25]

【讨论】:

  • 感谢您的建议,但我认为这将有助于我的代码转换,并且不要在问题的函数中使用多个变量。虽然,您的建议让我对创建“映射”函数以将 X 转换为我希望的变量有所了解。
【解决方案2】:

根据遗传算法的文档:

请注意,我们定义了函数 f,以便它的输出是我们想要最小化的目标函数,其中输入是 X(决策变量)的集合。

文档中的示例(“约束优化问题”一章):

def f(X):
    pen = 0
    if X[0] + X[1] < 2:
        pen = 500 + 1000 * (2 - X[0] - X[1])
    return np.sum(X) + pen

varbound = np.array([[0, 10]] * 3)    
model = ga(function=f, dimension=3, variable_type='real', variable_boundaries=varbound)    
model.run()

您的示例的解决方案:

def f(X):
    return np.sum(X[0]) + np.sum(X[1])

【讨论】:

  • 在这种情况下,我相信 X[0] 和 X[1] 不可能是数组,因为参数 dimension=3 不接受列表或元组。因此,X[0] 和 X[1] 将只是一个变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多