Python,更改约束

2024-04-26 21:01:06 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在研究一个线性优化问题,如下所示:

import pandas as pd 
from pulp import *
import math
import numpy as np 
import itertools
import pandas as pd 
import os

prob = LpProblem("Problem",LpMinimize)
Range = range(0,10) 
df=pd.DataFrame({'ID':[1,2,3,4,5],'type':['a','b','b','a','b'],'number': 
 [10,1,4,5,8],'Penalty':[3,1,2,3,1]})
ID=df['ID'].tolist()
N= df['number'].tolist()
Unique_types=df['type'].unique().tolist() 
Penalty = df['Penalty'].tolist()



choices = LpVariable.dicts("Choice",(Range,ID),0,1,LpInteger)
use_ith_type=LpVariable.dicts("use_ith_type",(Range,Unique_types),0,1,LpInteger)

# Objective
prob += lpSum([-choices[i][j] * k  for i in Range for j,k in zip(ID,Penalty)]) 

for i in Range: 
    for j in Unique_types:
        numbers = df['number'].loc[df['type']==j].tolist()
        prob += lpSum(choices[i][k] for k in numbers) <= use_ith_type[i][j]*25,""
    prob += lpSum(choices[i][k]*k for k in ID)   <=  26-lpSum([use_ith_type[i][j] for j in Unique_types]), ""




prob.writeLP("Minimization.lp")
prob.solve()
print("Status:", LpStatus[prob.status])   

数据帧(df)由数字和相应类型的列表组成。一个范围内的数字之和必须小于26-lpSum([use_ith_type[i][j] for j in type])。这意味着约束取决于范围内类型的数量。现在的代码不再适用于更大范围(Range)和一长串数字的组合。然后它变得太慢,永远不会有解决方案。因此,我正在寻找一个解决办法,以不同的方式解决这个问题。有人建议怎么做吗?你知道吗

先谢谢你。你知道吗


Tags: inimportiddfforusetyperange