纸浆:最小化一组向量的最大值
本教程将介绍纸浆:最小化一组向量的最大值的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我有一个要解决的线性规划问题,它的所有数据都来自一个表。
该表的大小为(m*n),如下所示:
| c0c1 c2 c3... cn sum
--- + ------ + ------ + ------ + ------ + ------ + ------ +++ ----- +
r0 | ||| Σ r0
r1 | ||| Σ r1
r2 | ||| Σ r2
r3 | ||| Σ r3
r4 | |||
. | |||
. | |||
. | |||
rm | ||| Σ rm
------------------------------------------------------------------- +
max |max(c0) max(c1) max(c2) max(c3) max(cn) ||| Σ max(c0...n)
优化问题后,此表中的所有垃圾箱都将保留浮点值。
我正在尝试最小化每列(ΣMAX(c0...n))的最大值总和。
我已创建一个LpProblem
:
problem = pulp.LpProblem("problem",pulp.LpMinimize)
我已经创建了LpVariables
,表示表中的每个垃圾箱:
variables = pulp.LpVariable.dicts("bin",
((r,c) for r in rows for c in columns),
lowBound=0,
cat='Continuous')
我预先知道每一行的总和(ΣRx),并且约束条件是一行的x的值必须等于ΣRx。作为这些数据的一个特征,只有一行中的索引子集可以对此ΣRX值做出贡献。例如,只有第0行中的箱子(0,1)和(0,3)可能具有非零值。这些投入箱的索引各行不同;某些行可能只有一个投入箱,而其他行有多个(或全部)投入箱。我已经通过为每一行创建约束来说明这一点。
for row in rows:
column_set # a list of bin indexes for this row that make up the sum.
variable_set = [ variables[(row,c)] for c in column_set ]
problem += pulp.lpSum(variable_set) == row_sum # the sum of the row.
我的问题在于怎么定义我的目标函数。由于Python的max()
不适用于LpVariable
对象,因此我尝试考虑怎么获取任意列的最大值并将其分配给自己的LpVariable
对象。
执行此操作的一种方法可能是遍历给定列中表示存储箱的每个LpVariable
,执行类似v = variable.value()
的操作并将所有v
添加到列表中,然后对此列表执行max()
并将LpVariable
设置为等于该值,但这只会获得LpVariable
的初始值,并且当求解器在solve()
过程中更改数据时,这些最大值将不会动态更新。
我还尝试使用单独的LpVariable
来表示每列的最大值,设置如下:
pulp.LpVariable("Max___{}".format(s),
lowBound=max([v.value() for v in column]),
upBound=max([v.value() for v in column]),
cat=pulp.LpContinuous
)
但同样,这似乎只是从每个LpVariable
的初始条件中获取值,并对其运行solve()
返回'infeasible'
解决方案。
有什么建议吗?
推荐答案
A高级说明:
m rows, n cols
引入n
新m_0, m_1, ..., m_(n-1)
添加表单的m*n
新:
m_0 >= entry(r_0,c_0)
m_0 >= entry(r_1,c_0)
...
m_0 >= entry(r_(m-1),c_0)
...
...
m_1 >= entry(r_0,c_1)
m_1 >= entry(r_1,c_1)
...
m_1 >= entry(r_(m-1),c_1)
...
:
minimize(m_0 + m_1 + ... + m_(n-1))
备注:
只有当每个m都被求解器以某种方式向下推时,这才起作用!
此处:最小化总和->确定!
它独立于条目的类型(二进制、整数、连续)
好了关于纸浆:最小化一组向量的最大值的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。