使用设置不同的变量类型和边界LpVariable.dicts

2024-10-01 15:28:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个线性规划问题,我试图找到一个最佳的投资组合,以最大限度的净现值受预算限制。这些投资决策大多是整数(0/1),但也有少数可以部分出资(在0和1之间连续)。我在python中使用PuLP,并将decisions设置为字典变量x,而不是为每个变量设置与decision相对应的不同变量。我不知道如何使用LpVariable.dicts因此整型变量的类别是整数,部分可资助变量的类别是连续的。在

我有一个字典整数/连续字符串保存为变量“types”和一个包含字典键的变量“items”。在

# Define dictionary keys
gc1=dict(zip(data['Investment ID'], data['Cost']))
items = list(gc1.keys())

# Define variable types
types=dict(zip(data['Investment ID'], np.where(data['Partial']==1, 'Continuous', 'Integer')))

# Define lp variable
x = LpVariable.dicts('x', items, lowBound=0, upBound=1, cat=types)

优化运行成功,但是一些应该是整数(0/1)的决策是连续的。在


Tags: iddata字典items整数keyszip类别
2条回答

据我所知,LpVariable.dicts()方法只能接受一个类别,也就是说,它可以用来生成所有相同类型变量的字典。在

您可以选择创建两个列表—连续变量列表和整数变量列表,然后使用LpVariable.dicts()方法,或者如下所示,一次只实例化一个变量,使用python列表理解仍然非常容易。如您所见,所有的整型变量都是1或0。在

from pulp import *
import numpy as np

n_vars = 6
np.random.seed(0)

# Define some variable names and types
var_names = ['var_' + str(i) for i in range(n_vars)]
Partial = np.random.randint(2, size=n_vars)
types = np.where(Partial==1, 'Continuous', 'Integer')

# Create some returns
returns = np.random.rand(n_vars)

# Create some costs
costs = np.random.rand(n_vars)

# Allocate a budget
budget = 2.0

# Create list of contiuous variables
x_cont = [LpVariable(i, lowBound=0, upBound=1, cat=j) for i, j in zip(var_names, types)]

# Do an optimisation to check its worked:
prob = LpProblem("Mixed Problem", LpMaximize)
prob += lpSum([x_cont[i]*returns[i] for i in range(n_vars)])
prob += lpSum([x_cont[i]*costs[i] for i in range(n_vars)]) <= budget
prob.solve()

x_soln = np.array([x_cont[i].varValue for i in range(n_vars)])

print("costs: ", costs)
print("returns: ", returns)

print("types: ", types)
print("x_soln: ", x_soln)

输出:

^{pr2}$

谢谢@kabdulla!我还找到了另一种方法,首先在LpVariable中设置一个类别,然后为变量的每个元素定义类别:

# Define dictionary keys
gc1=dict(zip(data['Investment ID'], data['Cost']))
items = list(gc1.keys())

# Define variable types
types=dict(zip(data['Investment ID'], np.where(data['Partial']==1, 'Continuous', 'Integer')))

# Define lp variable
x = LpVariable.dicts('x', items, lowBound=0, upBound=1, cat='Integer')
for i in items:
     x[i].cat=types[i]

相关问题 更多 >

    热门问题