纸浆溶液
经过研究,我认为您的目标函数不是线性的。我在Python纸浆库中重新创建了问题,但纸浆不喜欢我们用浮点数和’LpAffineexpression’进行划分。该答案表明线性编程“不理解除法”,但该注释是在添加约束而不是目标函数的情况下进行的。该评论将我指向“混合整数线性分数规划(MILFP)
”和Wikipedia上。
如果纸浆实际起作用,可以按以下方法进行处理(也许有人可以弄清楚原因):
import pulpdata = [(481.79, 5), (412.04, 4), (365.54, 3)] #, (375.88, 3), (379.75, 3), (632.92, 5), (127.89, 1), (835.71, 6), (200.21, 1)]x = pulp.LpVariable.dicts('x', range(len(data)), lowBound=0, upBound=7, cat=pulp.LpInteger)numerator = dict((i,tup[0]) for i,tup in enumerate(data))denom_int = dict((i,tup[1]) for i,tup in enumerate(data))problem = pulp.LpProblem('Mixed Integer Linear Programming', sense=pulp.LpMinimize)# objective function (doesn't work)# TypeError: unsupported operand type(s) for /: 'float' and 'LpAffineexpression'problem += sum([numerator[i] / (denom_int[i] + x[i]) for i in range(len(data))])problem.solve()for v in problem.variables(): print(v.name, "=", v.varValue)使用scipy.optimize的蛮力解决方案
您可以在函数中为每个使用
brute和的范围。如果函数中有3 s,则范围元组中也将有3 s。所有这一切的关键是添加 步*
的尺寸为如此。
slice``x``x``slice
1``slice(start, stop,
step*`)``slice(#,
, 1)`
from scipy.optimize import bruteimport itertoolsdef f(x): return (481.79/(5+x[0]))+(412.04/(4+x[1]))+(365.54/(3+x[2]))ranges = (slice(0, 9, 1),) * 3result = brute(f, ranges, disp=True, finish=None)print(result)
itertools解决方案
或者,您可以使用itertools生成所有组合:
combinations = list(itertools.product(*[[0,1,2,3,4,5,6,7,8]]*3))values = []for combination in combinations: values.append((combination, f(combination)))best = [c for c,v in values if v == min([v for c,v in values])]print(best)
注意 :这是原始功能的缩小版本,仅供参考。



