- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解决 0-1 背包问题的轻微修改,其中每个项目都是从中选择一个值的值向量,而不是使用 Python Cplex 的标量。这是 Mixed integer problem 的变体。我写了一个IBM OPL解决这个问题,但无法弄清楚如何使用 Python Cplex 解决它。我使用 IBM OPL 的解决方案是:
int Capacity = 100; // Capacity of the knapsack
int k = 2; // Number of items
int n = 5; // Number of values
range values = 1..n;
range items = 1..k;
// parameters
int profit[items][values] = [[ 5, 10, 20, 20, 20], // only one item should be selected from this list
[ 5, 20, 25, 30, 40]]; // only one item should be selected from this list
int weight[values] = [ 10, 20, 50, 70, 80]; // Corresponding weights
// decision variable x[i][j]=1 if the jth item is selected
dvar boolean x[items][values];
// objective function
maximize sum(i in items, j in values) x[i][j] * p[i][j];
// constraints
subject to{
sum(i in items, j in values) x[i][j] * w[j] <= Capacity;
forall(i in items) sum(j in values) x[i][j] <= 1;
}
我们可以通过 oplrun -v knapsack.mod
来运行这个问题。这个问题的解决办法是
x = [[0 1 0 0 0]
[0 0 0 0 1]];
profit = 10 + 40
= 50
问题的数学表述为:
我正在尝试使用 Python CPLEX 获得与上面相同的解决方案。以下代码是我尝试解决该问题的方法,但它不正确。我不确定如何解决:
import cplex
capacity = 100 # Capacity of the cache
k = 2 # Number of items
n = 5 # Number values for each item
profit = [[5, 10, 20, 20, 20],
[5, 10, 25, 30, 40]]
weight = [10, 20, 50, 70, 80]
xvar = [] # Will contain the solution
def setupproblem(c):
c.objective.set_sense(c.objective.sense.maximize)
# xvars[i][j] = 1 if ith item and jth value is selected
allxvars = []
for i in range(k):
xvar.append([])
for j in range(n):
varname = "assign_" + str(i) + "_" + str(j)
allxvars.append(varname)
xvar[i].append(varname)
# not sure how to formulate objective
c.variables.add(names=allxvars, lb=[0] * len(allxvars),
ub=[1] * len(allxvars))
# Exactly one value must be selected from each item
# and the corresponding weights must not exceed capacity
# Not sure about this too.
for j in range(k):
thevars = []
for i in range(n):
thevars.append(xvar[i][j])
c.linear_constraints.add(
lin_expr=[cplex.SparsePair(thevars, [1] * len(thevars))],
senses=["L"],
rhs=capacity)
def knapsack():
c = cplex.Cplex()
setupproblem(c)
c.solve()
sol = c.solution
if __name__ == "__main__":
knapsack()
最佳答案
你的问题是你没有表明你解决的程序是MIP。我不知道如何在 Python 下使用 2d 变量,但以下方法有效:
import numpy as np
import cplex
from cplex import Cplex
from cplex.exceptions import CplexError
capacity = 100 # Capacity of the cache
k = 2 # Number of items
n = 5 # Number values for each item
profit = [[5, 10, 20, 20, 20],
[5, 10, 25, 30, 40]]
weight = [10, 20, 50, 70, 80]
xvar = [ [ 'x'+str(i)+str(j) for j in range(1,n+1) ] for i in range(1,k+1) ]
xvar = xvar[0] + xvar[1]
profit = profit[0] + profit[1]
types = 'B'*n*k
ub = [1]*n*k
lb = [0]*n*k
try:
prob = cplex.Cplex()
prob.objective.set_sense(prob.objective.sense.maximize)
prob.variables.add(obj = profit, lb = lb, ub = ub, types = types, names = xvar )
rows = [[ xvar, weight+weight ]]
rows = [[ xvar, weight+weight ],
[ xvar[:5], [1]*5 ],
[ xvar[5:], [1]*5 ],
]
prob.linear_constraints.add(lin_expr = rows, senses = 'LEE', rhs = [capacity,1,1], names = ['r1','r2','r3'] )
prob.solve()
print
print "Solution value = ", prob.solution.get_objective_value()
xsol = prob.solution.get_values()
print 'xsol = ', np.reshape(xsol, (k,n) )
except CplexError as exc:
print(exc)
我得到的答案:
Solution value = 50.0
xsol = [[ 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 1.]]
关于python - 使用 python cplex 的 0-1 背包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007864/
我想最小化受一组线性和二次约束的二次目标函数。 二次目标函数是不定的(非凸)。二次约束是正半定(凸)。变量是连续的。 我可以使用 Gurobi 或 CPLEX 处理这个问题吗?哪一个是更好的选择? 最
我正在尝试找出如何热启动 CPLEX 的二次规划求解器。我对终止于一阶固定点的非凸二次规划的 QP 求解器热启动特别感兴趣。 我相信start()函数应该这样做,但我不知道如何让求解器使用起始数据。
我目前正在使用命令行使用 cplex 和 pyomo pyomo -solver=cplex model.py data.dat 结果保存在文件 results.json 中。如何使用以前的结果作为起
我将 GAMS 与 CPLEX 优化器一起使用。在 CPLEX 优化器中有一个选项“iis”,以便它生成不可约的不一致约束集。如果我将 iis 选项设置为 1(或者我认为是 0 以外的任何值,但我只在
Docplex 和 CPLEX Python API 之间有什么区别?他们中的任何一个比另一个更快吗? 最佳答案 CPLEX Python API是围绕 C API 的轻量级包装器(又名,C 可调用库
是否可以在不调用 mip 求解器的情况下运行 cplex 预求解器来聚合问题?如果是,您能否提供一个使用 c 可调用库的示例? 最佳答案 是的,可以独立调用预求解。您要查找的函数是 CPXpresol
我是 LP 的新手,只是简单地使用过 PuLP在 Python 中。 为什么SCIP 3.2.1 - CPLEX 12.63之间有速度差异和 CPLEX 12.6.3 ? SCIP 不是仍然使用 CP
我已经使用GAMS很长时间了,但我无法在GAMS下使用CPLEX的所有功能。你能用 Pyomo 做到这一点吗?或者直接在 Python 中使用 CPLEX?谢谢! 最佳答案 使用 Pyomo 的优势是
我正在使用 CPLEX 求解线性二元优化模型。我已经用 MATLAB 和 JAVA 编写了模型。 JAVA和MATLAB编程得到的目标函数最优值是相同的。然而,最佳变量值是不同的。我的模型可能有多个最
我正在使用 CPLEX 12.8 为我的论文项目建模,但我遇到了无法解决的问题。我得到以下输出: CPLEX 12.8.0.0: integer infeasible. 1828 MIP simple
我必须使用 CPLEX Java API 解决以下问题: 我需要编写一个条件,该条件将返回一组整数变量的最小值(假设 x[i], i=1,2,...,n)但只考虑正数。 换句话说: 分钟{x[i] |
我正在尝试优化 CPLEX OPL 中的以下问题。我已经定义了参数和决策变量。但是,当我尝试制定目标函数和约束时,我似乎遇到了一个问题,因为我在目标函数调用行中收到错误“不能使用 int 的类型范围”
我遇到了交叉背包问题,其中需要通过最小化成本将一组元素中的最大数量的多个元素放入一个箱子中。我能够解决 CPLEX 中的优化问题。 但是,当问题由两个容器(具有不同的容量)组成时,我发现在 CPLEX
我正在开发一个用 Java 编写的 LP 并使用 cplex 作为求解器。找到最佳解决方案需要一些时间。如果我有一个计算速度更快的可行解决方案或者只是一个优化性降低的解决方案就足够了。 在CPLEX用
有没有办法在 cplex java 中获取两个不同决策变量的乘积并将其添加到目标函数中? 例如。 决策变量 -> x[i] 决策变量 -> y[j] -> x[i]*y[j] 这样的乘法应该是可能的,
我正在求解一个具有两种类型的变量的模型,x [i] [j]是ILOBOOL,而u [i]是ILOFLOAT。我正在尝试向此模型添加惰性约束。我设法以以下方式正确添加了惰性约束: std::string
我有一个 IloCplex 对象,我想使用 Cplex Java API 获取 IloObjective 的系数。 通过此代码,我获得了 IloObjective 和 IloNumExpr,但无法访问
我是 cplex 的新人,我正在尝试通过在约束中创建一个二进制变量来优化 x 的函数,这样: 如果 x[i] > 0 则 y[i] = 1 或如果 x[i] = 0 则 y[i] = 0 然后约束是
我是第一次使用 CPLEX Java API。 我想最小化某些索引上矩阵中值的总和,这是由条件给出的。 例如,如果我有矩阵 M = {{ 0, 1, 2, 1},{ 1, 2, 1, 0},{ 0,
我正在 cplex 上开发一个项目,情况是这样的: 这是一家化工厂,生产并销售 2 种最终产品 有 3 个 react 堆,每个 react 堆可以执行不同的任务,一次一个 目标函数使总利润最大化 解
我是一名优秀的程序员,十分优秀!