目前,我正在研究一个线性优化问题,如下所示:
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)和一长串数字的组合。然后它变得太慢,永远不会有解决方案。因此,我正在寻找一个解决办法,以不同的方式解决这个问题。有人建议怎么做吗?你知道吗
先谢谢你。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐