标签: pulp

将Excel解算器解决方案转换为Python纸浆

我发现很难将Excel Solver模型转换为python pulp语法.在我的模型中,我正在优化每个部门的HC和OT变量,目标是最小化OT变量的总和.约束要求HC变量总和不超过92,并且总生产(=E2*C2*D2 + F2*C2在下面的电子表格中)满足每部门要求(下面的Excel电子表格的"输入"列).下面显示的Excel求解器公式非常有效.

问题

  1. 如何在纸浆中编写目标函数(在Excel F7 = SUM(F2:F6)中)?
  2. 约束E7 <= 92
  3. 约束G2:G6> = B2:B6
  4. 我有两个决策变量HCOT.在下面的python代码中,我只创建了一个变量.

之前

在此输入图像描述

解决之后

在此输入图像描述

import pulp
import numpy as np
import pandas as pd

idx = [0, 1, 2, 3, 4]

d = {'Dept': pd.Series(['Receiving', 'Picking', 'PPicking', 'QC', 'Packing'], index=idx),
     'Target': pd.Series([61,94,32,63,116], index=idx),
     'Hrs/day': pd.Series([7.75, 7.75, 7.75, 7.75, 7.75], index=idx),
     'Prod': pd.Series([11733, 13011, 2715, 13682, 14194], index=idx),
     'HC': pd.Series([24,18,6,28,16], index=idx), 
     'OT': pd.Series([0,0,42,0,0], index=idx)}

df = pd.DataFrame(d)

# …
Run Code Online (Sandbox Code Playgroud)

python math mathematical-optimization linear-programming pulp

3
推荐指数
1
解决办法
1535
查看次数

使用 Pulp 更新约束

假设有一个线性程序和以下形式的约束:

\n\n
4 x_1 + 3 x_2 \xe2\x89\xa4 10\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且您想要将其更新为

\n\n
4 x_1 + 3 x_2 + 10 x_3 \xe2\x89\xa4 10\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
3 x_2 \xe2\x89\xa4 10\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了做到这一点,我从头开始“重写”约束,就像

\n\n
prob.constraints[0] = ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

但对于很长的约束来说,这是非常低效的。

\n\n

是否有更简单的方法来添加或删除约束中的变量?

\n

python linear-programming pulp

3
推荐指数
1
解决办法
2277
查看次数

如何在pulp、python上添加GLPK解算器

我想知道如何在纸浆、Python 上逐步添加 GLPK 求解器。我已经安装了python(v=3.6.5)、pulp(v=1.6.8)。

我执行时得到的结果如下pulp.pulpTestAll()

 Testing zero subtraction
 Testing inconsistant lp solution
 Testing continuous LP solution
 Testing maximize continuous LP solution
 Testing unbounded continuous LP solution
 Testing Long Names
 Testing repeated Names
 Testing zero constraint
 Testing zero objective
 Testing LpVariable (not LpAffineExpression) objective
 Testing Long lines in LP
 Testing LpAffineExpression divide
 Testing MIP solution
 Testing MIP solution with floats in objective
 Testing MIP relaxation
 Testing feasibility problem (no objective)
 Testing an infeasible problem
 Testing an integer infeasible problem …
Run Code Online (Sandbox Code Playgroud)

python glpk pulp

3
推荐指数
1
解决办法
3810
查看次数

具有 Python PuLP 性能问题的 MILP 模型 - 求解器非常慢

我最近一直在使用 Python 进行线性编程,并且我使用 PuLP 创建了我的第一个优化算法。

我正在处理生产过程的调度问题。目标是通过为一天中的每个小时创建一个理想的生产计划,并为一年中的所有天创建这个计划,从而最大限度地降低每天的生产成本。

我遇到的问题是算法的执行需要很长时间(几个小时)并且经常卡住。另外,我感觉随着时间的推移它会变慢。

我希望得到有关如何提高代码性能的建议。

我对这个问题的处理方法:

  • 定义我的最小化问题以创建一整天的最佳时间表。
  • 循环我的代码以在一年中的所有 365 天运行此优化。
  • 在每个循环结束时,我采用当天优化的生产计划并将其附加到数据帧,因此最后我有一个包含一年中所有日子的生产计划的数据帧。

我正在处理 3 个生产资产('a'、'l' 和 'o'),每个资产都有几种生产模式。我将每个资产模式组合定义为一个“选项”,总共产生 14 个选项。每个选项每小时都在变化,并且有一个整数值(生产量)和一个二进制值(开/关),产生大约 14 x 2 x 24 = 672 个变量。该问题包含大约 1250 个约束。

我的代码有 200 多行,所以我有点犹豫要不要在这里分享所有内容,但我将在下面分享最重要的部分。

定义供应选项:

def set_supplyoptions():
cols = ['option', 'min_capacity', 'max_capacity']
options_list = [{'option':'o', 'min_capacity': 0, 'max_capacity':146},
                {'option':'l30', 'min_capacity': 0, 'max_capacity':30},
                {'option':'l50', 'min_capacity': 31, 'max_capacity':50},
                {'option':'l90', 'min_capacity': 51, 'max_capacity':90},
                {'option':'l150', 'min_capacity': 91, 'max_capacity':150},
                {'option':'l230', 'min_capacity': 151, 'max_capacity':230},
                {'option':'a15', 'min_capacity': 0, 'max_capacity':15},
                {'option':'a30', 'min_capacity': 0, 'max_capacity':30},
                {'option':'a45', 'min_capacity': 0, 'max_capacity':45}, …
Run Code Online (Sandbox Code Playgroud)

python linear-programming pulp mixed-integer-programming

3
推荐指数
1
解决办法
3100
查看次数

我如何限制 COIN-CBC 的运行时间,因为 maxSeconds 参数似乎对我不起作用?

我想使用 COIN-CBC(或 PuLP 提供的任何其他免费 MIP 求解器)求解一个小型混合整数程序,但时间限制为 10 秒。但是, maxSeconds 参数似乎对我不起作用。

举个例子,我这​​样调用没有时间限制的求解器:

prob.solve(pulp.PULP_CBC_CMD())
Run Code Online (Sandbox Code Playgroud)

我这样称呼它有时间限制:

prob.solve(pulp.PULP_CBC_CMD(maxSeconds=10))
Run Code Online (Sandbox Code Playgroud)

前者在 50.89 秒后终止,解值为 15.65287864835175。后者在 53.53 秒后终止,解值为 15.65287864835175。我预计它会在(大约)10 秒内终止,可能具有更高的解值。

(我知道这篇文章:Time limit for mix integerprogramming with Python PuLP。但它的答案参考了 CPLEX 和 GUROBI,我无法使用它们;我需要一个免费的求解器。)

难道我做错了什么?

python linear-programming pulp

3
推荐指数
1
解决办法
2984
查看次数

如何防止纸浆和蟒蛇的不可行错误?

我有一个优化问题,我编写了一个 python 程序来解决它。我将 Pulp 与 CPLEX 求解器一起使用:

import pulp

prob = LpProblem("myProblem", LpMinimize)
x = pulp.LpVariable.dicts("p", range( K ), 0, 1, pulp.LpContinuous)
prob += pulp.lpSum( x[k] for k in range( K ) )
...
# Rest of the constraints

status = prob.solve( pulp.CPLEX( msg = 0 ) )
Run Code Online (Sandbox Code Playgroud)

我收到错误:

  File "C:\Anaconda\lib\site-packages\pulp\solvers.py", line 468, in readsol
    raise PulpSolverError, "Unknown status returned by CPLEX: "+statusString
pulp.solvers.PulpSolverError: Unknown status returned by CPLEX: infeasible
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何测试问题是否不可行?我想阻止这个事件,如果问题不可行则返回 0。

我试过 :

if prob.status == 'infeasible':
    ...
Run Code Online (Sandbox Code Playgroud)

我试过 …

python cplex pulp

2
推荐指数
1
解决办法
3124
查看次数

PuLP以最小化显示LpVariable的上限值

我正在尝试最小化以下问题:对于笔记本电脑,手机和平板电脑的生产,存在库存成本(每个项目每月1美元)和加班时间(每小时10美元)。有一个需要满足的需求方案,它是对特定月份中最小数量的小工具的约束。除此之外,每月最多有20000小时的生产时间,再加上3000个加班时间。

问题是python / pulp给我的结果(除一个例外)是LpVariables中插入的所有上限值:不是最小化的成本!

from pulp import *


# Define the LP problem: minimize costs
prob = LpProblem("Minimize costs of production and inventory", LpMinimize)


# Demand schemes
demand_laptops = [75, 125, 1000, 1500, 1000, 500, 1250, 1500, 1000, 500, 500, 400, 300]           # Demand laptops
demand_phones = [120, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000]    # Demand phones
demand_tablets = [50, 2000, 3000, 2000, 3000, 4000, 5000, 2000, 3000, 4000, 5000, 4000, 5000]     # Demand …
Run Code Online (Sandbox Code Playgroud)

linear-programming minimize python-3.x pulp

2
推荐指数
1
解决办法
493
查看次数

如何仅访问 PuLP 问题中的特定变量?

在我用 python 中的 PuLP 求解的 LP 模型中,我有两组决策变量,例如

#Variables x 
x = LpVariable.dicts("Decision_x",(range(3),range(3)),0,1,LpInteger)
#Variables y 
y = LpVariable.dicts("Decision_y",(range(3),range(3)),0,1,LpInteger)
Run Code Online (Sandbox Code Playgroud)

求解模型后,我只对 x[i][j] 取值为 1 的变量感兴趣。我知道

for v in prob.variables():
    if v.varValue == 1:
        print(v)
Run Code Online (Sandbox Code Playgroud)

我可以打印所有值等于 1 的变量。因此,所有值等于 1 的 x 和所有 y 变量都会被打印。如何设法仅访问 x 变量,以便不打印 y 变量?我尝试过prob.variables(x)prob.variables()[x]但到目前为止没有任何效果。

然后在下一步中,我想提取 x 等于 1 的 x 变量的索引。例如,如果x[1][3] == 1我想找到索引 1 和 3。PuLP 中有什么聪明的方法来实现这一点吗?

python optimization linear-programming python-3.x pulp

2
推荐指数
1
解决办法
2395
查看次数

Python Pulp 线性规划约束

我对纸浆完全陌生,想知道是否需要优化以下内容:

x = pulp.LpVariable.dicts("Volume", range(0, 7), cat='Binary')
Run Code Online (Sandbox Code Playgroud)

其中只要有 0,则至少需要有 3 个。

所以解可以是 [0,0,0,0,0,0,1], [0,0,0,1,0,0,0], [1,1,1,0,0,0, 1] 但不是 [1,0,1,0,1,0,0]。

我尝试添加一个约束,如下所示:

prob += min([len(list(g)) for k, g in itertools.groupby(x.values()) if k == 0]) >= 3
Run Code Online (Sandbox Code Playgroud)

但没有成功。

我该如何表述呢?

python optimization integer linear-programming pulp

2
推荐指数
1
解决办法
559
查看次数

当问题不可行时纸浆约束

我正在尝试使用 Python 中的 Pulp 来解决线性优化问题。

这是代码:

import pandas as pd
import pulp

D_XB = 20
D_XP = 0
D_XC = 0

Available_Time = 1440 #in minutes

test = [['A1', 'A2', 'A3', 'A4', 'A5'], [1,2,1,0,3], [16,32,0,16,32], [10,10,10,10,10], [120,210,180,180,350]]

Cycles = pd.DataFrame(test, index=['Cycles', 'QTA1', 'QTA2', 'QTA3', 'T_TOT']).T

A1 = pulp.LpVariable("Cycle_A1", lowBound=0, cat='Integer')
A2 = pulp.LpVariable("Cycle_A2", lowBound=0, cat='Integer')
A3 = pulp.LpVariable("Cycle_A3", lowBound=0, cat='Integer')
A4 = pulp.LpVariable("Cycle_A4", lowBound=0, cat='Integer')
A5 = pulp.LpVariable("Cycle_A5", lowBound=0, cat='Integer')
    
# Defining the problem as a minimization problem (Minimize Storage) …
Run Code Online (Sandbox Code Playgroud)

python optimization constraints minimization pulp

1
推荐指数
1
解决办法
3120
查看次数