выбор единого количества для задачи о ранце с диапазоном количеств - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь решить проблему с рюкзаком ниже. У меня есть решение, которое работает, если я выбираю только один объект за раз, но я хочу изменить его, чтобы я мог выбирать разные количества одних и тех же объектов для диапазона величин. Итак, я создал списки с 1, чтобы указать различные количества объектов, и я умножаю вес и полезность на индекс списка, чтобы получить веса и утилиты для каждого количества. Я пытаюсь понять, как мне сформулировать ограничение, чтобы переменная выбора могла выбирать только одно количество каждого объекта? Можно ли индексировать переменную выбора так, чтобы она умножала только ту же длину, что и каждый объект, а затем умножала бы это количество объекта на сумму массива и устанавливала равной 1? Или есть лучший способ установить это ограничение?

код:

import numpy as np
import cvxpy


object1=[1,1,1]

object2=[1,1,1,1]

weight1=[x*5 for x in range(len(product1))]

weight2=[x*3 for x in range(len(product2))]


utility1=[x*2 for x in product1]

utility2=[x*4 for x in product2]


weights=np.array(weight1+weight2)

utilities=np.array(utility1+utility2)



# The variable we are solving for

# updated for python 3.6
# selection = cvxpy.Bool(len(weights))
selection = cvxpy.Variable(len(weights), boolean=True)

# The sum of the weights should be less than or equal to P
weight_constraint = weights * selection <= P

# Our total utility is the sum of the item utilities
total_utility = utilities * selection

# We tell cvxpy that we want to maximize total utility 
# subject to weight_constraint. All constraints in 
# cvxpy must be passed as a list
knapsack_problem = cvxpy.Problem(cvxpy.Maximize(total_utility), [weight_constraint])

# Solving the problem
knapsack_problem.solve(solver=cvxpy.GLPK_MI)
...