gpt4 book ai didi

python - 寻找具有 11,390,625 个变量组合的函数的最小值

转载 作者:行者123 更新时间:2023-12-01 01:06:53 24 4
gpt4 key购买 nike

我正在编写一个代码来解决管道数量的直径尺寸的最佳组合。目标函数是找到六个管道中压降之和最小。

因为我有 15 个离散直径尺寸的选择,它们是 [2,4,6,8,12,16,20,24,30,36,40,42,50,60,80],可用于系统中的六个管道中的任何一个,可能的解决方案列表将变为 15^6,等于 11,390,625

为了解决这个问题,我使用 Pulp 包使用混合整数线性规划。我能够找到相同直径组合的解决方案(例如 [2,2,2,2,2,2] 或 [4,4,4,4,4,4]),但我需要的是遍历所有组合(例如 [2,4,2,2,4,2] 或 [4,2,4,2,4,2] 来找到最小值。我尝试这样做,但过程需要很长时间是时候检查所有组合了。有没有更快的方法来做到这一点?

请注意,我无法计算每个管道的压降,因为直径的选择将影响系统中的总压降。因此,在任何时候,我都需要计算系统中每种组合的压降。

我还需要约束问题,使管道面积的速率/横截面 > 2。

非常感谢您的帮助。

我的代码的第一次尝试如下:

from pulp import * 
import random
import itertools
import numpy

rate = 5000
numberOfPipelines = 15

def pressure(diameter):
diameterList = numpy.tile(diameter,numberOfPipelines)
pressure = 0.0
for pipeline in range(numberOfPipelines):
pressure += rate/diameterList[pipeline]
return pressure
diameterList = [2,4,6,8,12,16,20,24,30,36,40,42,50,60,80]

pipelineIds = range(0,numberOfPipelines)
pipelinePressures = {}

for diameter in diameterList:
pressures = []
for pipeline in range(numberOfPipelines):
pressures.append(pressure(diameter))
pressureList = dict(zip(pipelineIds,pressures))
pipelinePressures[diameter] = pressureList
print 'pipepressure', pipelinePressures
prob = LpProblem("Warehouse Allocation",LpMinimize)

use_diameter = LpVariable.dicts("UseDiameter", diameterList, cat=LpBinary)
use_pipeline = LpVariable.dicts("UsePipeline", [(i,j) for i in pipelineIds for j in diameterList], cat = LpBinary)

## Objective Function:
prob += lpSum(pipelinePressures[j][i] * use_pipeline[(i,j)] for i in pipelineIds for j in diameterList)

## At least each pipeline must be connected to a diameter:
for i in pipelineIds:
prob += lpSum(use_pipeline[(i,j)] for j in diameterList) ==1

## The diameter is activiated if at least one pipelines is assigned to it:
for j in diameterList:
for i in pipelineIds:
prob += use_diameter[j] >= lpSum(use_pipeline[(i,j)])


## run the solution

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

for i in diameterList:
if use_diameter[i].varValue> pressureTest:
print("Diameter Size",i)

for v in prob.variables():
print(v.name,"=",v.varValue)

这就是我为组合部分所做的,花了很长时间。

xList = np.array(list(itertools.product(diameterList,repeat = numberOfPipelines)))
print len(xList)
for combination in xList:
pressures = []
for pipeline in range(numberOfPipelines):
pressures.append(pressure(combination))
pressureList = dict(zip(pipelineIds,pressures))
pipelinePressures[combination] = pressureList
print 'pipelinePressures',pipelinePressures

最佳答案

我会迭代所有组合,我认为您会遇到内存问题,否则尝试在 MIP 中对所有组合进行建模。

如果您可能使用多处理库来迭代问题以使用所有核心,那么应该不会花很长时间,只需记住仅保存迄今为止最佳组合的信息,而不是尝试立即生成所有组合,然后评估它们。

如果问题变得更大,您应该考虑动态规划算法或使用带有列生成的 PuLP 。

关于python - 寻找具有 11,390,625 个变量组合的函数的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com