lala_1994 2022-04-20 10:18 采纳率: 100%

python中使用定义一个函数，使用for循环return一个带参数的表达式，然后把这个表达式给其他包做最优化

问题相关代码，请勿粘贴截图
``````from scipy.optimize import differential_evolution,NonlinearConstraint
import openpyxl
import numpy as np

# 获取excel中注采数据
def get_injector_data():
book_sheet = workbook["Sheet1"]
columns_all = book_sheet.columns
data = []
columns11 = list(columns_all)[10]
for value in columns11:
data.append(value.value)
data2 = data[2:]
return data2

def get_producer_data1():
book_sheet = workbook["Sheet1"]
columns_all = book_sheet.columns
data = []
columns21 = list(columns_all)[21]
for value in columns21:
data.append(value.value)
data2 = data[2:]
return data2

# 定义目标函数
def objfunc(lp, tp, lij, tij, injector_data, producer_data1):
inj = injector_data; pro = producer_data1
obj_sum = 0
obj_sum_square = 0
for n in range(len(pro)):
tij_ = 0
for m in range(n):
t = (1/tij) * np.exp((m - n)/tij) * inj[m]
tij_ = t + tij_
pro_eval = lp * np.exp(-n / tp) + lij * tij_
obj_sum = obj_sum + pro_eval
obj_sum_square = (pro[n] - obj_sum) ** 2 + obj_sum_square
return obj_sum_square

def main():
injector_data = get_injector_data()
producer_data1 = get_producer_data1()
# lp, tp, lij, tij
lp_min, lp_max = 0, 2
tp_min, tp_max = 0, 4
lij_min, lij_max = 0, 2
tij_min, tij_max = 0, 4
bounds = [[lp_min, lp_max], [tp_min, tp_max], [lij_min, lij_max], [tij_min, tij_max]]
objfunc1 = objfunc('lp', 'tp', 'lij', 'tij', injector_data, producer_data1)
result = differential_evolution(objfunc1, bounds)

# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['lp', 'tp', 'lij', 'tij']
evaluation = objfunc1(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))

``````

lp, tp, lij, tij，是想要return出来的表达式中的四个未知数，injector_data, producer_data1是两个列表（for循环就是循环这两个列表的值），我知道我代码的问题是str和int不能做算数运算，但是我不知道怎么去改（原谅我刚学两个月python）

运行结果及报错内容

TypeError: unsupported operand type(s) for /: 'int' and 'str'

我想要达到的结果
``````def objective(v):
x, y = v
return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
``````

• 写回答

3条回答默认 最新

• 张一毛 2022-04-20 10:50
关注

你首先要确定，你的objfunc函数返回的是函数，还是你函数的计算结果。

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 4月28日
• 已采纳回答 4月20日
• 创建了问题 4月20日

悬赏问题

• ¥15 NeRF的代码复现以及人工智能入门
• ¥15 centos如何做一个可以让ikuai连接的openvpn
• ¥15 Protege 中的Entities下面的界面删除了如何复原
• ¥15 scrapy爬虫求帮
• ¥15 imageEnView绘图问题
• ¥15 关于#python#的问题：您好可以加您一下联系方式吗，在复现的时候确实有点问题难以解决
• ¥15 联想电脑重装系统时无法发现硬盘
• ¥15 MATLAB与UR10e实体机械臂建立通讯
• ¥15 c++题需要快一点不用opencv
• ¥15 关于#java#的问题：想要咨询Flowable流程引擎框架的问题