经过数年和多年的Matlab,我仍然是Python的新手.我正在尝试使用Pulp来设置整数线性程序.
鉴于一系列数字:
{P[i]:i=1...N}
Run Code Online (Sandbox Code Playgroud)
我想最大化:
sum( x_i P_i )
Run Code Online (Sandbox Code Playgroud)
受限制
A x <= b
A_eq x = b_eq
Run Code Online (Sandbox Code Playgroud)
和边界(基于矢量的边界)
LB <= x <= UB
Run Code Online (Sandbox Code Playgroud)
然而,在纸浆中,我没有看到如何正确地进行矢量声明.我用的是:
RANGE = range(numpy.size(P))
x = pulp.LpVariable.dicts("x", LB_ind, UB_ind, "Integer")
Run Code Online (Sandbox Code Playgroud)
我只能输入个别边界(所以只有1个数字).
prob = pulp.LpProblem("Test", pulp.LpMaximize)
prob += pulp.lpSum([Prices[i]*Dispatch[i] for i in RANGE])
Run Code Online (Sandbox Code Playgroud)
对于约束,我真的必须每行做这行吗?似乎我错过了一些东西.我将不胜感激.文档讨论了一个简短的例子.在我的情况下,变量的数量是几千.
当我为我的问题添加一个特定的约束时,问题的LpStatus解决了"Undefined"的变化(没有这个约束,它是"Optimal").在本页面的顶部,显示了返回状态的可能性,但它似乎没有解释它们的含义.任何人都可以解释"未定义"状态的含义吗?它在指定约束时类似于语法错误?
我正在尝试在Anaconda Navigator的环境选项卡中安装"纸浆"模块.但是当我在"All"包中搜索时,我找不到它.它也发生在其他包装上.
有没有办法将我的包安装到所需的环境?
我尝试通过在环境中打开终端来安装它,但我发现之后它不会显示在列表中.
我在这里错过了什么?
在Python PuLP中,线性编程约束可以变成弹性子问题.
http://www.coin-or.org/PuLP/pulp.html?highlight=lpsum#elastic-constraints
解决子问题可以优化距目标值的距离.
当然,目标值是这个子问题的最佳解决方案,但弹性化的全部意义在于我们认为这种解决方案可能是不可行的.
如何将子问题纳入整体问题?我尝试按照添加约束的方式将其添加到问题中,这会引发类型错误.我尝试将它放在目标函数中,这也不起作用.
我在上面的文档或此处托管的示例中找不到任何内容:
https://code.google.com/p/pulp-or/wiki/OptimisationWithPuLP?tm=6
这是我制定的子问题:
capacity = LpConstraint(e=lpSum([ x[m][n] * len(n.items) for n in N ]),
sense=-1, rhs=30, name=str(random.random()))
stretch_proportion = 30/50
elasticCapacity = capacity.makeElasticSubProblem(penalty=50,
proportionFreeBoundList=[1,stretch_proportion])
Run Code Online (Sandbox Code Playgroud)
以下是我认为必须将其纳入LP目标的最接近的事情:
def sub(m):
capacity = LpConstraint(e=lpSum([ x[m][n] * len(n.items) for n in N ]),
sense=-1, rhs=30, name=str(random.random()))
stretch_proportion = 30/50
elasticCapacity = capacity.makeElasticSubProblem(penalty=50,
proportionFreeBoundList=[1,stretch_proportion])
elasticCapacity.solve()
return elasticCapacity.isViolated()
Run Code Online (Sandbox Code Playgroud)
...
prob += lpSum( [ x[m][n] * reduce(op.add, map(D2, [i.l for i in n.items], [j.l for j in n.items]))\
for n in N …
Run Code Online (Sandbox Code Playgroud) 我正在使用Pulp建模器与python来解决整数编程问题.我使用IBM CPLEX作为解算器.当我运行我的Python程序时,我在控制台中有很多输出消息,如:
CPLEX Optimizers将解决多达1000个变量和1000个约束的问题.IBM ILOG CPLEX Optimization Studio预览版可以再使用48天......
我在互联网上寻找解决方案,我解决了这个问题.所以我通过写msg=0
如下来禁用显示:
from coinor.pulp import *
# ...
prob = LpProblem("MyProblem", LpMaximize)
# ...
prob.solve(CPLEX(msg=0))
Run Code Online (Sandbox Code Playgroud)
Python说,昨天我从我的计算机上删除了一些软件,当我尝试运行我的Python程序时cannot run cplex.exe
.我发现我的环境变量出了问题(路径中的所有环境变量都被删除).所以我重新安装了CPLEX解算器,我运行完全相同的程序,但我现在仍然有输出消息msg=0
.
您认为这个问题是什么?如何禁用输出消息?
我在 python 中使用“pulp”和 GUROBI 来解决一些优化问题。例如,GUROBI的计算日志是:
Optimize a model with 12 rows, 25 columns and 39 nonzeros
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [1e+00, 1e+00]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 1e+00]
Found heuristic solution: objective 12
Presolve removed 3 rows and 12 columns
Presolve time: 0.00s
Presolved: 9 rows, 13 columns, 27 nonzeros
Variable types: 0 continuous, 13 integer (13 binary)
Root relaxation: objective 7.000000e+00, 11 iterations, 0.00 seconds
Nodes | Current Node | Objective Bounds | …
Run Code Online (Sandbox Code Playgroud) 我一直在使用PuLP来解决我感兴趣的特定混合整数线性程序 (MIP)。但是,随着问题规模的增长,PuLP 花费的时间太长。我希望能够运行求解器一段时间,并在需要很长时间的情况下提前终止它,并获得迄今为止计算出的最佳可行解决方案。我尝试过用信号手动对求解器进行计时,但变量都是“无”。
我查看了文档,PuLP 似乎不支持这一点,尽管据我了解,它调用的大多数求解器例程都支持这一点。有没有办法对 PuLP 施加时间限制?
目前我正在PuLP
用来解决最大化问题.它工作正常,但我希望能够获得N-best解决方案,而不仅仅是一个.有没有办法在PuLP
任何其他免费/ Python解决方案中执行此操作?我想到了从最佳解决方案中随机挑选一些变量并将它们抛出并重新运行的想法,但这似乎完全是黑客攻击.
我正在使用PuLP
Python中的模块来制定混合整数程序.我试图找出如何MIP start
通过PuLP
接口设置(即程序的可行解决方案).
该PuLP
软件包的开发人员声称您可以通过此处的PuLP
界面访问完整的Gurobi模型
贴在下面是两个完整的模型.我已经使这些尽可能小,同时防止gurobi求解器使用启发式找到最佳值.
我试图在两个模型中设置初始解决方案(到最佳值),但在PuLP
模型中它被忽略,但在gurobipy
模型中它按预期工作.
如何通过PuLP接口为Gurobi解决方案设置初始解决方案?
from pulp import *
prob = LpProblem("min example",LpMinimize)
x1=LpVariable("x1",0,None,LpInteger)
x2=LpVariable("x2",0,None,LpInteger)
x3=LpVariable("x3",0,None,LpInteger)
x4=LpVariable("x4",0,None,LpInteger)
# Objective function
prob += 3*x1 + 5*x2 + 6*x3 + 9*x4
# A constraint
prob += -2*x1 + 6*x2 -3*x3 + 4*x4 >= 2, "Con1"
prob += -5*x1 + 3*x2 + x3 + 3*x4 >= -2, "Con2"
prob += …
Run Code Online (Sandbox Code Playgroud) python mathematical-optimization gurobi integer-programming pulp
我正在尝试创建最佳轮班时间表,在该时间表中将员工分配到轮班时间。输出应旨在花费最少的钱。棘手的部分是我需要考虑特定的约束。这些是:
1) At any given time period, you must meet the minimum staffing requirements
2) A person has a minimum and maximum amount of hours they can do
3) An employee can only be scheduled to work within their available hours
4) A person can only work one shift per day
Run Code Online (Sandbox Code Playgroud)
在staff_availability df
包含了员工的选择['Person']
,可用最小-最大小时他们能够工作['MinHours']
- ['MaxHours']
,他们得到了多少钱['HourlyWage']
,和可用性,表示小时['Availability_Hr']
和15分钟片段['Availability_15min_Seg']
。
注意:如果不需要,可以不必分配可用的员工轮班。他们只是可以这样做。
该staffing_requirements df
包含一天中的时间['Time']
和所需的工作人员['People']
在这些时期。
该脚本返回df
'availability_per_member'
,显示每个时间点有多少员工可用。因此, …