Пусть х, у, г являются INT переменных и А представляет собой матрицу, я хочу выразить ограничение как:Как объявить ограничения с переменной как индекс массива в Z3Py?
z == A[x][y]
Однако это приводит к ошибке: Ошибка типа: объект не может быть истолковано как индекс
Что было бы правильным способом сделать это?
=======================
Конкретный пример:
Я хочу, чтобы выбрать 2 пунктов с лучшей комбинацией баллов , , где оценка определяется значением каждого элемента и бонусом в паре выбора. Например, для 3 элементов: a, b, c со связанными значениями [1,2,1] и бонус на пары (a, b) = 2, (a, c) = 5, (b, c) = 3, лучший выбор - (a, c), поскольку он имеет самый высокий балл: 1 + 1 + 5 = 7.
Мой вопрос заключается в том, как представить ограничение бонуса выбора. Предположим, что CHOICE [0] и CHOICE [1] - это переменные выбора, а B - бонусная переменная. Идеального ограничения должно быть:
B = bonus[CHOICE[0]][CHOICE[1]]
, но это приводит к TypeError: объект не может быть истолкован как индекс я знаю другой способ заключается в использовании вложенного для создания экземпляра первого выбора, затем представляет B, но это на самом деле неэффективен для большого количества данных. Может ли любой эксперт предложить мне лучшее решение, пожалуйста?
Если кто-то хочет играть в пример игрушку, вот код:
from z3 import *
items = [0,1,2]
value = [1,2,1]
bonus = [[1,2,5],
[2,1,3],
[5,3,1]]
choices = [0,1]
# selection score
SCORE = [ Int('SCORE_%s' % i) for i in choices ]
# bonus
B = Int('B')
# final score
metric = Int('metric')
# selection variable
CHOICE = [ Int('CHOICE_%s' % i) for i in choices ]
# variable domain
domain_choice = [ And(0 <= CHOICE[i], CHOICE[i] < len(items)) for i in choices ]
# selection implication
constraint_sel = []
for c in choices:
for i in items:
constraint_sel += [Implies(CHOICE[c] == i, SCORE[c] == value[i])]
# choice not the same
constraint_neq = [CHOICE[0] != CHOICE[1]]
# bonus constraint. uncomment it to see the issue
# constraint_b = [B == bonus[val(CHOICE[0])][val(CHOICE[1])]]
# metric definition
constraint_sumscore = [metric == sum([SCORE[i] for i in choices ]) + B]
constraints = constraint_sumscore + constraint_sel + domain_choice + constraint_neq + constraint_b
opt = Optimize()
opt.add(constraints)
opt.maximize(metric)
s = []
if opt.check() == sat:
m = opt.model()
print [ m.evaluate(CHOICE[i]) for i in choices ]
print m.evaluate(metric)
else:
print "failed to solve"