Ошибка при решении правила распределения CDN

У меня проблема с моим предписанием математической задачи AMPL.

Я пытаюсь решить эту проблему:

В сети с набором узлов N и набором ребер E каждый узел имеет хранилище для кэширования содержимого. Существует набор O объектов контента, к которым обращаются клиенты, и при необходимости их можно кэшировать. Пусть размер o ∈ O равен h_o единиц хранения. Предположим, что у каждого узла n ∈ N есть клиенты, которые запрашивают объект o ∈ O, так что трафик к n для загрузки o равен d_n; o. В сети управляемой доставки контента (CDN) оператор CDN может применять различные политики для распределения копий контента между кешами. Эти политики могут зависеть от многих факторов, которые могут иметь технический или деловой характер, что приводит к различным проблемам оптимизации. Пусть h_max будет максимальной общей памятью, которая может быть использована CDN (т. Е. Суммой памяти, используемой CDN по всем узлам). Найти: распределение копий каждого объекта o ∈ O таким образом, чтобы ограничение на общее хранилище, используемое CDN, удовлетворялось при минимизации общего трафика в сети (т. Е. Стоимости маршрутизации от кешей к клиентским узлам).

Файлы Ampl:

    #Model for 'CDN allocation copies' problem

#sets
#-------------------------------------------------------------------------------------
set K;              #index of nodes with group of clients
set N;              #nodes
set E;              #edges
set O;              #objects

#parameters
#-------------------------------------------------------------------------------------
param d {K,O};      #demands for object o
param t {K,O} symbolic;     #destination nodes
param r {N,K} binary;       #1 if node n is ancestor of node k, 0 otherwise

param a {N,E} binary;       #1 if edge begins in vertex, 0 otherwise
param b {N,E} binary;       #1 if edge ends in vertex, 0 otherwise

param c {E};        #cost of using an edge
param Hmax;         #available capacity for allocation object in proxy servers

#variables
#-------------------------------------------------------------------------------------
var f {N,O} binary;         #1 if object saved at node k, 0 otherwise
var x {E,K,O};              #value of the demand realised over edge for object

#goal function
#-------------------------------------------------------------------------------------
#The function minimizes cost of routing
#By saving copies at CDN proxies we minimizing all traffic from all demands
#with all objects
minimize goal:
    sum{e in E}
    sum{k in K}
    sum{o in O}
        (x[e,k,o]*c[e]);

#constraints
#-------------------------------------------------------------------------------------
subject to c0 {e in E, k in K, o in O}:
    x[e,k,o]>=0;

subject to c1a {k in K, o in O, n in N: n!=t[k,o]}:
(r[n,k]==1 and f[n,o]==1)
    ==>
        sum{e in E}
            (a[n,e]*x[e,k,o]) -
        sum{e in E}
            (b[n,e]*x[e,k,o]) =
                                d[k,o]*(1-f[k,o])
    else
        sum{e in E}
            (a[n,e]*x[e,k,o]) -
        sum{e in E}
            (b[n,e]*x[e,k,o]) =
                                0;

subject to c1c {k in K, o in O, n in N: n==t[k,o]}:
sum{e in E}
    (a[n,e]*x[e,k,o]) -
sum{e in E}
    (b[n,e]*x[e,k,o]) =
                            -d[k,o]*(1-f[k,o]);

subject to c2:
sum{k in K}
sum{o in O}
    f[k,o] <= Hmax;

subject to c3 {k in K, o in O}:
sum{n in N}
    r[n,k]*f[n,o] <= 2;

subject to c4 {o in O}:
    f[1,o]=1;

И мой файл данных:

#Data file for 'CDN allocation copies' problem simple example

#indices
set K := 2 3;               #index of nodes with group of clients
set N := 1 2 3;             #nodes
set E := 1_2 1_3;           #edges
set O := o1 o2 o3 o4 o5 o6 o7 o8 o9 o10;    #objects

#parameters
param d (tr):                  #demands for object o
       2      3    :=
o1  2560    512  
o2  1280    256        
o3   640    128
o4   320     64
o5   160     32
o6    80     16
o7    40      8
o8    20      4
o9    10      2
o10    5      1;
#opt= 63 + 75 = 138

param t (tr):                  #destination nodes
        2       3   :=
o1      2       3
o2      2       3
o3      2       3
o4      2       3
o5      2       3
o6      2       3
o7      2       3
o8      2       3
o9      2       3
o10     2       3;

param r (tr):                   #1 if node n is ancestor of node k, 0 otherwise
        1       2       3   :=  
2       1       0       0
3       1       0       0;

param a (tr):                   #1 if edge begins in vertex, 0 otherwise
        1       2       3   :=
1_2     1       0       0
1_3     1       0       0;

param b (tr):                   #1 if edge ends in vertex, 0 otherwise
        1       2       3   :=
1_2     0       1       0
1_3     0       0       1;

param c :=      #cost of using an edge
1_2     1
1_3     1;

param Hmax := 10; #available capacity for allocation object in proxy servers

Когда я пытаюсь решить свою проблему, я вижу эту ошибку:

Error at _cmdno 15 executing "let" command
(file C:\Program Files\AMPLDevX64  Evaluation\plugins\com.ampldev_2.3.0.201211162252   \include/writesol.ampl, line 22, offset 783):
Can't evaluate _con[92]:
subscript not in 1 .. 91

person Michał Rowicki    schedule 10.05.2013    source источник


Ответы (1)


Ошибка была вызвана тем, что AMPL неправильно включил количество логических ограничений в _ncons. Это исправлено в AMPL версии 20130510 (см. http://www.netlib.org/ampl/changes). Логическим ограничением в вашей модели является индикаторное ограничение c1a.

person vitaut    schedule 11.05.2013
comment
Большое спасибо за помощь! Я отредактировал свой файл модели и добавил более простой файл данных, который публикую здесь: stackoverflow.com/questions/16500128/ - person Michał Rowicki; 11.05.2013