from __future__ import print_function
import sys
from ortools.linear_solver import pywraplp
def main(sol='hand'):
solver = pywraplp.Solver('LinearExample',
pywraplp.Solver.GLOP_LINEAR_PROGRAMMING) #
# data
#
nb_items = 12
nb_resources = 7
items = list(range(nb_items))
resources = list(range(nb_resources)) capacity = [150, 150, 150, 150, 150, 150, 150]
value = [96, 76, 56, 11, 86, 10, 66, 86, 83, 12, 9, 81]
### variables ###
# Assign variable:
assign={}
for r in resources:
assign = [solver.IntVar(0, 1, 'Assign[%r][%d]' % (r, j)) for j in items]
# objective: minimize number of techs:
z = solver.Sum((value[i] * assign[r][i]) for i in items for r in resources)
### constraints ###
# Assign:
for j in value:
solver.Add(solver.Sum(assign[r][j] == 1 for r in resources))
# Bin capacity:
for r in resources:
solver.Add(solver.Sum(value[j] * assign[r][j] for j in value) <= capacity[r])
## Objective:
objective = solver.Maximize(z) #
# solution and search
#
solver.Solve()
print()
print('z: ', int(solver.Objective().Value()))
print()
print('walltime :', solver.WallTime(), 'ms')
if sol == 'CBC':
print('iterations:', solver.Iterations())
if __name__ == '__main__': sol = 'GLPK'
if len(sys.argv) > 1:
sol = sys.argv[1]
if sol != 'GLPK' and sol != 'CBC':
print('Solver must be either GLPK or CBC')
sys.exit(1) main(sol) z = solver.Sum((value[i] * assign[r][i]) for i in items for r in ressources)TypeError: 'Variable' object does not support indexing--
You received this message because you are subscribed to the Google Groups "or-tools-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to or-tools-discu...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
assign={}
for r in resources:
assign[r] = [solver.IntVar(0, 1, 'Assign[%r][%d]' % (r, j)) for j in items]
# objective: minimize number of techs:
z = solver.Sum((value[i] * assign[r][i]) for i in items for r in resources)
### constraints ###
# Assign:
for j in items:
solver.Add(solver.Sum(assign[r][j] for r in resources) == 1) for r in resources:
solver.Add(solver.Sum(value[j] * assign[r][j] for j in items) <= capacity[r])How would I convert this into a 3D variable? If I understand correctly, for the 2D version, I created an empty list and appended a list inside the resources for-loop:
assign = {}
for r in resources:
assign[r] = [solver.BoolVar('Assign[%r][%d]' % (r, j)) for j in items] #3D Variable assign (attempt 1):
assign = {}
for r in resources:
for i in items:
assign[r][i] = [solver.IntVar(0, 1, 'Assign[%r][%i][%d]' % (r, i, j)) for j in items] #3D Variable assign (attempt 1):
assign = defaultdict(list)
for r in resources:
for i in items:
assign[r][i].append(solver.IntVar(0, 1, 'Assign[%r][%i][%d]' % (r, i, j)) for j in items)--