为了账号安全,请及时绑定邮箱和手机立即绑定

如何最小化与给定输入分布的距离?

如何最小化与给定输入分布的距离?

qq_遁去的一_1 2022-01-05 19:53:38
我有一个客户列表,每个客户都可以通过四种不同的方式“激活”:n= 1000df = pd.DataFrame(list(range(0,n)), columns = ['Customer_ID'])df['A'] = np.random.randint(2, size=n)df['B'] = np.random.randint(2, size=n)df['C'] = np.random.randint(2, size=n)每个客户都可以在“A”或“B”或“C”上激活,并且仅当与激活类型相关的布尔值等于 1 时。在输入中,我有最终激活的计数。es:Target_A = 500Target_B = 250Target_C = 250代码中的随机值是优化器的输入,代表以这种方式激活客户端的可能性。我如何才能仅将客户与其中之一联系起来以尊重最终目标?如何最小化实际激活计数与输入数据之间的距离?
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

你有任何经过测试的例子吗?我认为这可能有效但不确定:


import pandas as pd

import numpy as np

from pulp import LpProblem, LpVariable, LpMinimize, LpInteger, lpSum, value


prob = LpProblem("problem", LpMinimize)



n= 1000

df = pd.DataFrame(list(range(0,n)), columns = ['Customer_ID'])

df['A'] = np.random.randint(2, size=n)

df['B'] = np.random.randint(2, size=n)

df['C'] = np.random.randint(2, size=n)


Target_A = 500

Target_B = 250

Target_C = 250



A = LpVariable.dicts("A", range(0, n), lowBound=0, upBound=1, cat='Boolean')

B = LpVariable.dicts("B", range(0, n), lowBound=0, upBound=1, cat='Boolean')

C = LpVariable.dicts("C", range(0, n), lowBound=0, upBound=1, cat='Boolean')


O1 = LpVariable("O1", cat='Integer')

O2 = LpVariable("O2", cat='Integer')

O3 = LpVariable("O3", cat='Integer')


#objective

prob += O1 + O2 + O3


#constraints

prob += O1 >= Target_A - lpSum(A)

prob += O1 >= lpSum(A) - Target_A

prob += O2 >= Target_B - lpSum(B)

prob += O2 >= lpSum(B) - Target_B

prob += O3 >= Target_C - lpSum(C)

prob += O3 >= lpSum(C) - Target_C


for idx in range(0, n):

    prob += A[idx] + B[idx] + C[idx] <= 1 #cant activate more than 1

    prob += A[idx] <= df['A'][idx] #cant activate if 0

    prob += B[idx] <= df['B'][idx] 

    prob += C[idx] <= df['C'][idx] 


prob.solve()    


print("difference:", prob.objective.value())


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号