我正在通过 MILP / Pyomo 对一些能源系统进行建模。
在这种情况下,我正在对双向电子进行建模。转换器。
功率/能量可以以两种方式流动:但是,在一种方式中,功率 P 只能在边界 [LB;UB] 内,否则它必须为 0。
我使用这个公式来确保:
LB - P <= LB * x
P <= UB * (1 - x)
x 是二元变量
它似乎正在发挥作用......
换句话说,功率 P 只能在 [-UB;-LB] 范围内,否则为 0。但我正在努力确保这一点,我只是无法获得构建这种约束背后的逻辑。 。
任何帮助和解释将不胜感激。
非常感谢,马克斯
我是 PuLP 的新手,正在尝试将标准差编程为优化问题中的目标函数。我已阅读此答案,尽管我知道它是相关的,但无法将其应用于我的具体情况。
我正在尝试解决以下优化问题:最大化一组 3 个决策变量的标准差,其相关权重向量为 [0.25、0.40 和 0.35]。我的限制是每个决策变量的范围应在 0.5 到 2.0 之间。(这是一个简化的示例;实际上,我将拥有更大的决策变量集和更大的相应权重向量)。
到目前为止,我的代码如下:
from pulp import LpMaximize, LpProblem, LpVariable
# Create the model
model = LpProblem(name="max_stdev", sense=LpMaximize)
# Define the decision variables
x = {i: LpVariable(name=f"x{i}", lowBound=0.5, upBound=2.0) for i in range(3)}
# Add the constraints to the model
model += (0.25*x[0] + 0.40*x[1] + 0.35*x[2] == 1, "weight_constraint")
# Add the objective function to the model, which should be the standard deviation of the x vector …Run Code Online (Sandbox Code Playgroud) 我在 R 中遇到问题,非常感谢您的帮助。
我必须针对以下约束绘制可行性区域:
constrains:
5*x + 3*y >= 210
x + y <= 110
4*x + y <= 200
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我还需要为可行的区域着色。
使用 Pyomo 5.1.1(Windows 7 上的 CPython 2.7.10),我尝试执行最简单的 Pyomo 示例,具体模型见https://software.sandia.gov/downloads/pub/pyomo/PyomoOnlineDocs。 html#_a_simple_concrete_pyomo_model
from __future__ import division
from pyomo.environ import *
model = ConcreteModel()
model.x = Var([1,2], domain=NonNegativeReals)
model.OBJ = Objective(expr = 2*model.x[1] + 3*model.x[2])
model.Constraint1 = Constraint(expr = 3*model.x[1] + 4*model.x[2] >= 1)
Run Code Online (Sandbox Code Playgroud)
我执行:
> pyomo solve Pyomo_concrete_v1.py --solver=glpk
Run Code Online (Sandbox Code Playgroud)
根据我自己的计算,结果应该是:
x[1]=0
x[2]=0.25
OBJ=0.75
Run Code Online (Sandbox Code Playgroud)
但是,我发现以下“results.yml”:
# ----------------------------------------------------------
# Problem Information
# ----------------------------------------------------------
Problem:
- Name: unknown
Lower bound: 0.666666666667
Upper bound: 0.666666666667
Number of objectives: 1
Number of constraints: 2
Number of …Run Code Online (Sandbox Code Playgroud) python mathematical-optimization linear-programming glpk pyomo
我想知道我是否可以在PuLP 中创建一个多目标函数,通过这样做我可以在PuLP 中创建一个 Min Z = max(a,b,c),但是在使用此代码时
ilp_prob = pulp.LpProblem("Miniimize Problem", pulp.LpMinimize)
x = []
if m >3:
return 1,1
for i in range(m):
temp = []
for j in range(len(jobs)):
temp += [pulp.LpVariable("x_%s_%s" %((i+1),(j+1)),0,1, cat = 'Binary')]
x+= [temp]
ilp_prob += max([pulp.lpSum([jobs[j]*x[i][j] for j in range(len(jobs))] for i in range(m))])
for i in range(len(jobs)):
ilp_prob += pulp.lpSum([x[j][i] for j in range(m)])==1
ilp_prob.solve()
Run Code Online (Sandbox Code Playgroud)
它只返回 x[0] 中的所有 1,以及 x[0] 中的所有 0。
我一直在尝试用 Python 解决以下线性问题:
minimize{x1,x2}, such that:
x1+2*x2 = 2
2*x1+3*x2 =2
x1+x2=1
x1>=0
x2>=0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过纸浆和 linprog 库 ( from scipy.optimize import linprog),但我什么也没有。第一点是,这两个库都希望我输入某种“目标函数”来最小化,而我希望将我的变量最小化(本质上是为了验证我没有无限多的解决方案)。但是,我尝试最小化以下目标函数:
x1 + x2
判断这几乎等于最小化 x1 和 x2,因为它们都大于 0。第二点是纸浆和 linprog 似乎都无法处理“不可行”的情况。这意味着当这两个库遇到不可行的问题时,它们不会打印出相关的内容(即:“问题无法解决”),而是开始放弃约束,直到得到答案。例如,上述问题是不可行的,因为不存在满足上述所有方程的数 x1 和 x2。现在 linprog 在这种情况下打印出以下内容
message: 'Optimization terminated successfully.'
Run Code Online (Sandbox Code Playgroud)
和
x: array([ 0., 0.])
Run Code Online (Sandbox Code Playgroud)
从中我了解到解决方案是x1 = 0和x2 = 0,这当然是不正确的。
我的下一步是用嵌套的 for 循环和条件语句自己编写所有代码来描述约束,但我还不想去那里。此外,我正在寻找一个可以轻松推广的解决方案,比如 100 多个不同的方程(因为我将在实数的 n 维空间中进行操作)和 60 多个变量(x1,x2,..., x60)。
我目前使用 Excel 中的 Solver 来寻找制造的最佳解决方案。这是当前的设置:

它涉及在旋转机器上制造鞋子,也就是说,生产是分批重复进行的。例如,一批为“10x A1”(参见表中的 A1),这将产生 10x 尺寸 36、20x 尺寸 37...10x 尺寸 41。
有一些前缀设置;A1、A2;R7...如上表所示。
然后是一个requested变量(或者更确切地说是一个变量列表),它基本上说明了客户的要求,每个尺寸的数量。
目标函数是找到一组重复,使其尽可能匹配请求的数量。因此,在解算器中(抱歉,没有英文屏幕截图),您可以看到目标是N21(即每个大小的绝对差之和)。变量是N2:N9- 这是每次设置的重复次数,唯一的限制是它N2:N9是一个整数。
我如何用 python 模拟这种行为?我的开始:
from collections import namedtuple
from pulp import *
class Setup(namedtuple('IAmReallyLazy', 'name ' + ' '.join(f's{s}' for s in range(36, 47)))):
# inits with name and sizes 's36', 's37'... 's46'
repetitions = 0
setups = [
Setup('A1', 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 0),
Setup('A2', …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 OR-Tools 中的 MinCostFlow 解决工程问题。有一个带有管道和多个供应阀的机械分配系统。这些阀门需要连接到消费者。最初,我试图用匈牙利算法来解决这个问题,但后来我意识到通过路径的流量没有被考虑在内。
节点 0-4 是消费者,节点 4-7 是供应阀,节点 8 和 9 是管道。我在每个消费者身上放置了一个“供应”,以显示它期望的流量。我在最后放了一个水槽,以便从系统中取出电源。并非所有消费者都有相同的需求。我们可以看到节点 0 需要 10 个,我专门设计了一条路径(以红色突出显示),允许它携带它到那里。我暂时将所有价格设置为 0。
然而,它实际上是这样解决的:
出于某种原因,它决定将节点 0 拆分为 2 个节点(6 和 7),然后让较大的节点 7 从 3 和 0 接收 5。从系统角度来看,这并不理想,我不明白为什么会这样会这样解决。在匈牙利算法中,它不允许一个 Worker 接受多个 Job。在该算法中,节点 4-7 将是工人,而 0-3 将是作业。
我可以通过增加从节点 1-3 到节点 7 的弧的成本来获得所需的结果,但我不想操纵成本字段来获得所需的结果。这似乎需要很多额外的工作来帮助优化工具选择正确的路径。
我如何使用 OR-Tools 来完成此操作?
我一直在研究可以建模为整数线性规划的组合优化问题。我在 Visual Studio 2017 和 CPLEX1271 中将它实现为一个 C++ 项目。由于有成倍数的约束,我通过 IloCplex::LazyConstraintCallbackI 实现了惰性约束。在我看来,以下过程是如何产生最优解的:每次确定一个整数解时,LazyConstraintCallbackI 将检查它并向模型添加一些违反约束,直到获得最优整数解。
但是,我对不同输入的实现给出的目标值并不总是正确的。经过将近一年的间歇性调试和测试,我终于找到了原因,这与问题非常相关,但可以通过以下小示例来解释(希望如此):涉及四个布尔变量 x1、x2、x3 和 x4 的整数线性规划
minimize x1
subject to:
x1 ? x2
x1 ? x3
x1 ? x4
x2 + x3 ? 1
x1, x2, x3 and x4 ? {0, 1}?
Run Code Online (Sandbox Code Playgroud)
cplex给出的结果是:
Solution status = Optimal
Objective value = 1
x1 = 1
x2 = 1
x3 = 1
x4 = 1?
Run Code Online (Sandbox Code Playgroud)
毫无疑问,目标值是正确的。奇怪的是cplex设置x4 = 1。虽然x4等于1或0对这个编程中的目标值没有影响。但是,当使用惰性约束回调时,这可能会通过添加一些不正确的约束而导致问题,并且整数编程可以通过迭代添加违反约束来解决。我想知道:
目前这是我第一次在 python 中使用 PuLP 库。深入研究这个库的目的是用Python制作一个梦幻足球解算器。我已经成功制作了求解器,但不知道如何添加我需要的一些约束。
我有一个 400 名球员的 Excel 表格以及我如何预测他们的比赛方式,并且我想在给定特定限制的情况下找到 9 名球员的最佳组合。Excel 表包含球员姓名、球员投射、球队球员在场、对手球员面对以及位置。下面是 panda 数据框的头部的样子。
Name Projection Position Team Salary Opponent
0 Jets 3.528576 DST NYJ 2000 IND
1 Texans 7.936528 DST HOU 2100 PIT
2 Panthers 4.219883 DST CAR 2200 LAC
3 Raiders 0.904948 DST LVR 2300 NE
Run Code Online (Sandbox Code Playgroud)
我成功完成的约束条件是:限制最多选择9名球员,QB位置仅1人,WR位置3-4人,TE位置1-2人,DST位置1人,RB位置2-3人。
raw_data = pd.read_csv(file_name,engine="python",index_col=False, header=0, delimiter=",", quoting = 3)
#create new columns that has binary numbers if player == a specific position
raw_data["RB"] = (raw_data["Position"] == 'RB').astype(float)
raw_data["WR"] = (raw_data["Position"] == …Run Code Online (Sandbox Code Playgroud) 我是优化问题的新手,正在研究一个简单的最大化问题,我可以在 Excel 中非常简单地解决这个问题。但是,我需要在 Python 中扩展它并需要一些帮助。
我有一份不同食物的菜单,我需要最大限度地提高我的能量输出。例子:
| 宏 | 食物 | 卡路里 | 活力 |
|---|---|---|---|
| 蛋白质 | 鱼 | 100 | 60 |
| 蛋白质 | 羊肉 | 200 | 40 |
| 蛋白质 | 蛋 | 200 | 38 |
| 碳水化合物 | 香蕉 | 200 | 25 |
| 碳水化合物 | 土豆 | 200 | 30 |
| 碳水化合物 | 米 | 200 | 40 |
| 胖的 | 牛油果 | 450 | 50 |
| 胖的 | 奶酪 | 400 | 60 |
| 胖的 | 奶油 | 500 | 55 |
鉴于以下限制,我需要最大化能量(e):
问题表述:
变量: X (m,i) ? 二元变量 = {1 ,如果宏 m 和项目 i 被选择,0 否则}
最大化 …
python linear-programming pulp mixed-integer-programming scipy-optimize