我有一个函数,它接受两个值作为输入,并返回一个值为"组合"两个通过第二个函数(为简单起见,f2
返回输入值的总和)。在python中它是:
f1 (in1, in2):
return f2(in1,in2)
f2 (in1, in2):
return in1 + in2
现在,in1
和in2
与时间点相关联; in1
可以包含3个值:0
,1
和2
。
我想做的是"展望未来"对于n=4
个时间点,并确定in1
值的最佳序列,这将给我最高的回报值。
所以,让我们说in2
最初是10.我需要做的是评估:
a = f1(0, 10)
b = f1(1, 10)
c = f1(2, 10)
然后,对于我获得的每个结果,我需要使用in1的可能值进行评估:
a0 = f1(0, a); a1 = f1(1, a); a2 = f1(2, a)
b0 = f1(0, b); b1 = f1(1, b); b2 = f1(2, b)
c0 = f1(0, c); c1 = f1(1, c); c2 = f1(2, c)
所以我在n次迭代后停止并确定最佳输入序列(在此示例中它将是2 2 2 2
,因为10+12+14+16
是最高值)。
可以在这个实例中使用递归(可能是深度优先搜索)吗?编码它的最佳方法是什么?蛮力方法是嵌套4 for循环,但如果n = 10
?
答案 0 :(得分:0)
如果您事先知道f1和f2的数学性质,那么您应该将其表示为数学程序(例如,如果f1和f2相对于in1和in2是线性的,则使用PuLP库。)
以下是您提到的使用PuLP建模并使用CBC解决的示例:
from pulp import *
model = LpProblem("Maximize f1", LpMaximize)
in1 = LpVariable.dicts("in1", 0, 2, LpInteger)
in2 = 10
model += in1 + in2 # f1 and f2 combined
model.solve()
print(in1.varValue)
虽然这个问题很简单(in1 = 2)。不确定你的时间段是如何形成的,因为你没有指定f1或f2的时间依赖性。
如果你不知道f1和f2的形式,并且不能假设它们相对于in1和in2是连续的,平滑的或凸的,那么你可能需要强制它并计算所有( in1,in2)组合。深度优先和广度优先将花费相同的时间来详尽地计算它们。