как получить результат решателей ампер в виде массива в Python

Я использую amp для моделирования своей проблемы оптимизации на Python, и я новичок в amp. Моя переменная - это двумерный массив. Это мои данные:

 data;
set USER := u1 u2 ; 
set JOB := j1 j2 ;
param p:= 
u1 j1 0.8022422666444835
u1 j2 0.8022422666444835
u2 j1 0.8022422666444835
u2 j2 0.8022422666444835
; 
param o:= 
u1 j1 0.268
u1 j2 0.544
u2 j1 0.234
u2 j2 0.964
; 

и это мое моделирование усилителя:

set USER;
set JOB;

param p {USER,JOB}>=0;
param o {USER,JOB}>=0;

var t {i in USER, k in JOB}>=0;

maximize profit: sum{k in JOB} 50*log(1+(sum{i in USER} log(1+t[i,k]*o[i,k])))-sum{i in USER}sum{k in JOB} t[i,k]*p[i,k];

Результатом будет t переменная. Я хочу преобразовать t в двумерный массив на Python, потому что я хочу использовать результат этой проблемы оптимизации в моем коде Python. Я запустил этот код на Python:

time = ampl.getVariable('t')
for i in time:
    print(i)

и результат:

(('u1', 'j1'), <amplpy.variable.Variable object at 0x7f82b3b419d0>)
(('u1', 'j2'), <amplpy.variable.Variable object at 0x7f82b3b41d10>)
(('u2', 'j1'), <amplpy.variable.Variable object at 0x7f82b3b41b50>)
(('u2', 'j2'), <amplpy.variable.Variable object at 0x7f82b3b41b10>)

Я не знаю, как преобразовать этот результат в двумерный массив на Python. Не могли бы вы помочь мне мольбами? Заранее благодарим за помощь.


person Ehsan    schedule 19.05.2020    source источник
comment
Мне пришло в голову, что вы, возможно, хотели иметь что-то, проиндексированное значениями u1 и j1 и т. Д., Чтобы вы могли выполнять поиск, например data["u1"]["j2"]. Если это так, вам нужен dict of dicts, а не ответ, который у меня ниже, который составляет список списков ...   -  person Andrew Allaire    schedule 19.05.2020


Ответы (1)


В python обычно используются 2 вещи, такие как массивы, lists и tuples. Основное отличие состоит в том, что кортеж нельзя изменить, а список можно. Например, вы можете добавить в конец списка. Но вы не можете добавлять или удалять элементы из кортежа.

Значение переменной time в вашем коде Python - это то, что можно повторять и что дает кортеж из двух кортежей, по крайней мере, для того вывода, который вы нам показали. Первый из двух кортежей состоит из двух элементов.

Предполагая, что сохраняется тот же шаблон, и что вам нужен список списков из трех элементов на каждой итерации по этой временной переменной, это должно сработать:

time = ampl.getVariable('t')

list_of_lists = []
for param, ampl_var in time:
    u_value, j_value = param
    list_of_lists.append([u_value, j_value, ampl_var])

for sub_list in list_of_lists:
    print(sub_list)

person Andrew Allaire    schedule 19.05.2020