我正在尝试解决LP问题,我有一个100行和2列的数据框(假设a
,b
),我需要选择10行以便满足以下条件:
if a>=b then b/(a+b)>=0.2
if a<=b then a/(a+b)>=0.2
我尝试了以下步骤(假设数据帧为df
)
key=list(df['key'])
a=dict(zip(key,df['a']))
b=dict(zip(key,df['b']))
c=dict(zip(key,df['c']))
var=LpVariable.dicts('keys',key,lowBound=0,cat='Binary')
prob= *defined minimizing function*
prob+=lpSum([c[i]*var[i] for i in key)<=10
prob+=condition(lpSum([a[i]*var[i] for i in key),lpSum([b[i]*var[i] for i in key))=1
def condition(a,b):
if a>=b and b/(a+b)>=0.2: return 1
if a<=b and a/(a+b)>=0.2: return 1
return 0
我在最后一步上遇到了麻烦。有什么解决方法吗?
注意:我知道可以使用其他方法或工具来解决此类问题,但是我对Pulp有所限制,因为这只是一个较大问题的一部分,因此任何有关此问题的指导都将有所帮助