Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何最大化函数?_Python_Python 3.x_Mathematical Optimization_Linear Programming_Pulp - Fatal编程技术网

Python 如何最大化函数?

Python 如何最大化函数?,python,python-3.x,mathematical-optimization,linear-programming,pulp,Python,Python 3.x,Mathematical Optimization,Linear Programming,Pulp,如何最大化目标函数 我有一个客户列表,每个客户都可以通过三种不同的方式“激活” 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) df['check_somma'] = df

如何最大化目标函数

我有一个客户列表,每个客户都可以通过三种不同的方式“激活”

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)
df['check_somma'] = df['A']+df['B']+df['C']
for index, rows in df[df['check_somma'] == 0].iterrows():
    i = np.random.randint(3)
    if i == 0:
        df.loc[index,['A']]= 1
    if i == 1:
        df.loc[index,['B']]= 1
    if i == 2:
        df.loc[index,['C']]= 1
df['check_somma'] = df['A']+df['B']+df['C']
df['A_k'] = np.random.rand(n,1)
df['B_k'] = np.random.rand(n,1)
df['C_k'] = np.random.rand(n,1)
df['A_k'] = df['A_k'] * df['A']
df['B_k'] = df['B_k'] * df['B']
df['C_k'] = df['C_k'] * df['C']
每个客户都可以在“A”或“B”或“C”上激活,并且仅当与激活类型相关的布尔值等于1时

在输入中,我有最终激活的计数。es:

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')

prob = LpProblem("problem",LpMaximize)

#objective
prob += lpSum(A)+lpSum(B)+lpSum(C)

#constraints
prob += Target_A >= lpSum(A)
prob += Target_B >= lpSum(B)
prob += Target_C >= lpSum(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() 
A=LpVariable.dicts(“A”,范围(0,n),下限=0,上限=1,cat='Boolean')
B=LpVariable.dicts(“B”,范围(0,n),下限=0,上限=1,cat='Boolean')
C=LpVariable.dicts(“C”,范围(0,n),下限=0,上限=1,cat='Boolean')
prob=LpProblem(“问题”,LpProblem)
#客观的
prob+=lpSum(A)+lpSum(B)+lpSum(C)
#约束条件
概率+=目标值A>=lpSum(A)
概率+=目标值B>=lpSum(B)
概率+=目标值\u C>=lpSum(C)
对于范围(0,n)内的idx:
prob+=A[idx]+B[idx]+C[idx]只需修改一行代码:目标函数。为了优先考虑绝对差异,并且只有在抽签的情况下优先考虑权重更大的解决方案,我们将在目标函数中缩放差异,这样即使减少1个差异,也比任何权重改进都要好。我们可以根据客户数量+1进行缩放,因为权重之和永远不会超过n

因此,只需使用旧代码并将目标函数更改为:

prob += (O1 + O2 + O3) * (n + 1) - lpSum([A[idx] * df['A_k'][idx] + B[idx] * df['B_k'][idx] + C[idx] * df['C_k'][idx] for idx in range(0, n)])

您现在需要手动检查变量及其赋值,以了解差值,因为目标解决方案代表另一件事。

这个问题与您之前的问题有何不同?是的,现在我想最小化距离并最大化每个激活的关联权重:)每个客户都有A、B和C的关联激活权重?是的,激活A有A_k作为关联权重,B有B_k,C有C_k。每个客户端在各种激活上具有不同的权重您的当前代码无法激活可以激活的客户,因为您不允许激活501 a