Python 如何在纸浆包装限制中使用最大值功能

Python 如何在纸浆包装限制中使用最大值功能,python,pulp,Python,Pulp,我正在使用python的纸浆包编写线性规划。我对建立约束持怀疑态度 为了说明这个问题,想象一个100 x 100厘米的正方形。我有几个不同尺寸的圆。我需要在正方形中包含这些圆,以便最大化直径面积之和。填充第一行时,第二行将在其上方形成,以此类推,始终将其视为约束: 每行中只能选择一次每个圆 圆的直径之和不能超过长度限制 圆的直径之和不能超过宽度限制 圆的面积之和不能大于正方形的面积 我的疑问在约束3中。我的想法是确定每行的最大直径(也可以是平均值)。这些最大值之和不能超过100。是否可以创建这样

我正在使用python的纸浆包编写线性规划。我对建立约束持怀疑态度

为了说明这个问题,想象一个100 x 100厘米的正方形。我有几个不同尺寸的圆。我需要在正方形中包含这些圆,以便最大化直径面积之和。填充第一行时,第二行将在其上方形成,以此类推,始终将其视为约束:

每行中只能选择一次每个圆 圆的直径之和不能超过长度限制 圆的直径之和不能超过宽度限制 圆的面积之和不能大于正方形的面积 我的疑问在约束3中。我的想法是确定每行的最大直径(也可以是平均值)。这些最大值之和不能超过100。是否可以创建这样的约束

“变量”

alocado = pulp.LpVariable.dicts("alocado", 
                        ((n, t) for n, t in df.index),
                        cat='Binary')

model = pulp.LpProblem("Alocacao_na_pilha", pulp.LpMaximize)
“目标函数”

model += pulp.lpSum(alocado[n, t] * df.loc[(n, t), 'area'] 
            for n, t in df.index),'z'
“设置”

“限制”

for n in circle:
    model += pulp.lpSum(alocado[(n, t)] for t in filled) <= 1

for t in filled:
    model += pulp.lpSum(alocado[(n, t)] * df.loc[(n, t),'d1'] for n in circle) <= 100

model += pulp.lpSum(pulp.lpSum(alocado[n, t] for t in filled) * df.loc[(n, t), 'area'] for n in circle) <= 1000
欢迎来到SO

如果没有您问题中的输入数据,我无法直接实现它,但是设置每行最大值之和的约束应该相当容易。下面的解决方案是伪代码

我的方法是引入一组新的变量-每行一个:

for i in range(n_rows):
    for circle in i:
        prob += row_maxes[i] >= circle.diameter
row_maxes=pill.LpVariable.dicts(“row_maxes”,[i代表范围内的i(n_行)],cat='Continuous')

然后需要约束这些变量,使其至少与每行上最大的圆一样大:

for i in range(n_rows):
    for circle in i:
        prob += row_maxes[i] >= circle.diameter
然后,可以对这些行的最大值之和设置任何约束:

prob+=lpSum([row_maxes[i]for i in range(n_rows)])欢迎来到SO

如果没有您问题中的输入数据,我无法直接实现它,但是设置每行最大值之和的约束应该相当容易。下面的解决方案是伪代码

我的方法是引入一组新的变量-每行一个:

for i in range(n_rows):
    for circle in i:
        prob += row_maxes[i] >= circle.diameter
row_maxes=pill.LpVariable.dicts(“row_maxes”,[i代表范围内的i(n_行)],cat='Continuous')

然后需要约束这些变量,使其至少与每行上最大的圆一样大:

for i in range(n_rows):
    for circle in i:
        prob += row_maxes[i] >= circle.diameter
然后,可以对这些行的最大值之和设置任何约束:

prob+=lpSum([row_maxes[i]表示范围内的i(n_行)])