我正在尝试使用 PuLP 解决优化问题,但在编写目标函数时遇到问题。
我已将现实生活中的示例简化为使用谷物的更简单的示例。假设我有一个产品列表和一些可以将它们放入的过道(对于本示例 2)。每种产品都有一个我们通常每周销售的数量(例如:我们每周销售 20 盒水果圈和 6 盒麦片)。每个物品还需要一定数量的架子(例如:磨砂片需要 1 个架子,但玉米片需要 2 个)。
| 产品 | 销售量 | 货架 | 指定通道 |
|---|---|---|---|
| 水果圈 | 20 | 2 | |
| 磨砂片 | 15 | 1 | |
| 可可卵石 | 8 | 1 | |
| 果味鹅卵石 | 9 | 1 | |
| 玉米片 | 12 | 2 | |
| 麦片 | 6 | 1 |
每个过道只有4个货架。因此,理论上我可以将水果圈和玉米片放在一个过道上(2 个架子 + 2 个架子)。如果我将这些商品放在一个过道中,则该过道的每周销售额将为 20 + 12 = 32。如果我将其他 4 件商品(1 个货架 + 1 + 1 + 1)放入一个过道中,则该过道的销售额将为 15 + 8 + 9 + 6 = 38。过道的平均销售额应为 35。我的优化问题的目标是让每个过道尽可能接近该平均数字。我想最小化每个过道每周总销售额和平均数量之间的总绝对差异。在此示例中,我的偏差为 ABS(38-35) + ABS(32-35) = 6。这就是我想要最小化的数字。
我不知道如何写,所以 PuLP 接受了我的目标。我无法在网上找到具有这种复杂程度的示例,它将每个值与平均值进行比较并获取累积绝对偏差。当我写出技术上可以计算的代码时,PuLP 似乎不接受它。
这是一些示例代码:
products = ['Fruit Loops', 'Frosted Flakes', …Run Code Online (Sandbox Code Playgroud) 我试图找到一种算法来确定一组具有两个变量和以下形式的线性不等式的严格正积分解的存在性:
\n该问题还涉及以下形式的最终不等式:
\n一些线性编程技术应该在这里起作用,但我不太熟悉它们。我一直在寻找一种更临时的解决方案,也许可以利用问题中给出的性质和约束(不平等类型)。任何见解或算法都会受到欢迎,但就 而言(其中 是不等式的数量)而言,确定性和线性的东西会特别有趣。
\n附加约束: ,,> 0
\n当我看到优化问题时,我看到了很多选择.一种是线性编程.我用抽象的术语理解LP是如何工作的,但我发现很难看出某个特定问题是否适合LP.是否有任何启发式方法可以帮助指导此决策?
例如,描述的工作是否有一种很好的方法来进行这种类型的挖掘?花了几周才看到如何正确地解决问题.是否有可能"提前"知道LP可以解决问题,而不首先看到"如何表达它"?
有没有我可以用来确定问题是否适合LP的清单?是否有针对此主题的标准(可读)参考?
我在组织非自动化仓库(带叉车)时遇到了这样的问题.在一天开始时,仓库中的托盘货架上有一些货盘,白天有一些特定数量的货车进出仓库的货盘.而且我希望最大限度地减少白天叉车的行驶距离,并且(或)最大限度地减少处理即将卸货的卡车的等待时间(他们正在等待用托盘填充他们的货车).
我已经提出了一些非常直观的算法,但如果我将它们与最直观的方法进行比较,它们就不会产生好的效果 - 将进口托盘放到仓库中最近的免费机架上.我试图将这个问题转换为线性编程,但我没有成功 - 我知道如何为个别卡车找到最小化的叉车路径,但后来我不知道如何把它放在一起,因为每次卡车出口/进口一些托盘仓库状态是改变了(仓库中不同的托盘布局).我还尝试通过系统检查每种可能性来找到最佳结果的强力方法,但这并不是在合理的时间内产生结果......
有没有人有想法(关于将问题转换为线性编程)?
由于Microsoft Solver Foundation已被弃用,我试图找到一种替代或合理的方法来创建自己的DSL.
我正在寻找的是在F#中描述LP的DSL必不可少的,用Clp解决它并评估结果.
在重新发明轮子之前:有人知道一个已经为LP提供DSL的好库吗?
否则,你将如何在F#中构建这样的DSL?从本质上讲,我希望能够写出类似的东西
let xs = createVars 100 in 0..1
let ys = [| 1 .. 100 |]
let f i x = i*x
let lp =
minimize sumprod(xs, ys) subjectTo [
xs.[0] + xs.[1] = 1
sum(xs) <= 1
sum({for i in 1..100 -> f i xs.[i]}) <= 100
// ...
]
let solver = Clp()
let result = solver.solve lp
Run Code Online (Sandbox Code Playgroud) 我在linprog R包中使用solveLP来解决一个简单的线性编程问题:
minimize -x1-x2
subject to 2*x1+x2+x3 =12
x1+2*x2 +x4 = 9
x1,x2,x3,x4 >=0
Run Code Online (Sandbox Code Playgroud)
具有双重等价物:
maximize 12*y1+9*y2
subject to 2*y1+y2 <= -1
y1+2*y2 <= -1
y1,y2 <=0
Run Code Online (Sandbox Code Playgroud)
如果我以原始形式陈述问题,我会得到正确的结果(5,2,0,0).但是当以双重形式陈述问题时,前两个约束只会被忽略.我得到的结果(0,0)显然违反了(2*y1 + y2 <= -1且y1 + 2*y2 <= -1),是否有额外的设置或参数我缺少?请查看下面的代码,让我知道您的想法:
require(linprog)
objVec <- c(-1,-1,0,0)
rhsConstr <- c(12, 9,0,0,0,0)
Amat <- rbind( c( 2, 1, 1, 0 ),
c( 1, 2, 0, 1 ),
c( 1, 0, 0, 0 ),
c( 0, 1, 0, 0 ),
c( 0, 0, 1, 0 ),
c( 0, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个最大化EE + FF的线性优化目标,其中EE和FF各自由一些C和D组成.
用我编写的代码,我可以找到求解器:
EE_quantity: 0, FF_quantity: 7
Run Code Online (Sandbox Code Playgroud)
...但我知道还有另一种解决方案:
EE_quantity: 1, FF_quantity: 6
Run Code Online (Sandbox Code Playgroud)
为了验证其他有效解决方案的用户输入,我为EE和FF添加了约束.所以我EE_quantity == 0, FF_quantity == 7在下面的代码中添加了一个可运行的例子:
SolverContext c2 = SolverContext.GetContext();
Model m2 = c2.CreateModel();
p.elements = elements_multilevel_productmix();
Decision C_quantity = new Decision(Domain.IntegerNonnegative, "C_quantity");
Decision D_quantity = new Decision(Domain.IntegerNonnegative, "D_quantity");
Decision EE_quantity = new Decision(Domain.IntegerNonnegative, "EE_quantity");
Decision FF_quantity = new Decision(Domain.IntegerNonnegative, "FF_quantity");
m2.AddDecisions(C_quantity, D_quantity, EE_quantity, FF_quantity);
m2.AddConstraints("production",
6 * C_quantity + 4 * D_quantity <= 100,
1 * C_quantity + 2 * D_quantity <= 200,
2 …Run Code Online (Sandbox Code Playgroud) 我想进一步利用以下附加约束来约束下面的系统,该约束使用了绝对值运算符:
abs(x1)+abs(x2)+abs(x3) <= 10
Run Code Online (Sandbox Code Playgroud)
有可行的方法在R中实现这些附加的绝对值约束吗?
方程组:
maximize: x1 + 9x2 + x3;
subject to:
x1 + 2x2 + 3x3 <= 9
3x1 + 2x2 + 2x3 <= 15
Run Code Online (Sandbox Code Playgroud)
R代码:
require(lpSolve)
# objective function, constants, constraints
obj = c(1,9,1)
con = matrix(c(1,2,3,3,2,2), nrow=2, byrow=TRUE)
rel = c("<=", "<=")
rhs = c(9,15)
Run Code Online (Sandbox Code Playgroud)
解:
my.lp = lp("max", obj, con, rel, rhs)
my.lp$objval
my.lp$solution
Run Code Online (Sandbox Code Playgroud)
显然,这是一个简单的示例,用于说明我在线搜索后遇到的问题。这似乎存在一种方法lp_solve本身,就证明这里的在lp_solve在线帮助指导。但是,如果可能的话,我希望将问题保留在R中。
我正在尝试最小化以下问题:对于笔记本电脑,手机和平板电脑的生产,存在库存成本(每个项目每月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) It is known that exact mathematical strategies such MILP are not efficient for large instances of the flexible job shop problem.
It is common to see in the literature MILP formulations for the FJS problem. I read that it is interesting to use the MILP model for experiments involving non-exact methods as metaheuristics (GA, FA, TS, etc) since it provides lower and upper bounds.
我还读到,当找到可行的解决方案比最优解决方案更重要时,应该选择CP。这是真实的说法吗?
mathematical-optimization linear-programming constraint-programming mixed-integer-programming
optimization ×2
pulp ×2
r ×2
algorithm ×1
clp ×1
clr ×1
dsl ×1
f# ×1
lpsolve ×1
math ×1
minimize ×1
python ×1
python-3.x ×1
solver ×1
statistics ×1