场景如下:
我想最大限度地降低运行电机的成本。我有 X 个电机,每个电机都有一个下限和一个上限。它不能超过上限,也不能低于下限,除非它与 0 一致。
当这些电机必须达到 Y 的功率时,我必须找到一种方法来最小化这些电机的成本。
并非每个电机都必须处于活动状态,但如果处于活动状态,则必须达到其下限。
我试图最小化该函数的成本,并且我有一个代码片段。
prices = {
'Motor2': lambda y: (1/(np.poly1d(np.loadtxt("path_to_txt"))(y*1000)/100)) * 7048),
'Motor3': lambda z: (1/(np.poly1d(np.loadtxt("path_to_txt"))(z*1000)/100)) * 1674),
'Motor4': lambda a: (1/(np.poly1d(np.loadtxt("path_to_txt"))(a*1000)/100)) * 1637),
'Motor5': lambda b: (1/(np.poly1d(np.loadtxt("path_to_txt"))(b*1000)/100)) * 6354),
'Motor6': lambda c: (1/(np.poly1d(np.loadtxt("path_to_txt"))(c*1000)/100)) * 2634),
'Motor7': lambda d: (1/(np.poly1d(np.loadtxt("path_to_txt"))(d*1000)/100)) * 1654),
'Motor8': lambda e: (1/(np.poly1d(np.loadtxt("path_to_txt"))(e*1000)/100)) * 1354),
'Motor9': lambda x: (1/(np.poly1d(np.loadtxt("path_to_txt"))(x*1000)/100)) * 7048),
'Motor10': lambda f:(1/(np.poly1d(np.loadtxt("path_to_txt"))(f*1000)/100)) * 1629)
}
这些是给定电机的价格。
我想给它一个参数,如果电机速度(y、z、a、b 等)为 0,那么我希望成本为零。
我尝试过两种不同的方法:
第一个是这样的:
'Motor2': lambda y: (1/(np.poly1d(np.loadtxt("path_to_txt"))(y*1000)/100)) * 7048) if y > 0 else 0
当到达 Gekko 最小化方法时,会返回以下错误:
类型错误:“int”类型的对象没有 len()
另一个是带有 model.if3/if2 的那个
这部分看起来像这样:
'Motor2': lambda y: model.if3(y-2.1,(1/(np.poly1d(np.loadtxt("Path_to_txt"))(y*1000)/100))* 70848,0),
我尝试更改 if3、if2 内的顺序,但它要么表明它们不是最佳解决方案,要么给出错误的解决方案。
2.1 是电机处于活动状态时必须运行的下限。
txt-t 包含 a^3 + b^2 + c^1 + 常数
所以我的问题是,如何使用 if...else 语句或任何其他方法来解决这个问题?
先感谢您
编辑1:
这是完整的错误跟踪:
Traceback (most recent call last):
File "path_file\file.py", line 56, in <module>
model.Minimize(sum(prices[motor](xx[motor]) for motor in
power_ranges))
File "path_file\file.py", line 56, in <genexpr>
model.Minimize(sum(prices[motor](xx[motor]) for motor in
power_ranges))
File "path_file\file.py", line 35, in <lambda>
'Motor2': lambda y: (1/(np.poly1d(np.loadtxt("path_to_txt_motor2")
(y*1000)/100))* 70848 if y > 0 else 0,
File "path_to_anaconda\gekko\gk_operators.py", line 25, in __len__
return len(self.value)
File "path_to_anaconda\gekko\gk_operators.py", line 144, in __len__
return len(self.value)
TypeError: object of type 'int' has no len()