Условная сумма - PullRequest
       9

Условная сумма

0 голосов
/ 27 июня 2019

Я хочу суммировать по диапазону (областям) за исключением случаев, когда j не равно k. Кто-нибудь может мне помочь?

Я пытался:

forall( k in Areas ) 
        sum ( j in Areas: j!=k ) X[k][j] == 1;
Also tried:
forall( k in Areas ) 
        sum ( j in Areas) (j!=k)*X[k][j] == 1;

    int NbAreas = 5;

    range Areas = 1..NbAreas;

    float P[Areas] = [0, 0.3, 0.65, 0.2, 0.1];
    float D[Areas] = [0, 7, 5, 3, 9];
    float FROMTO[Areas][Areas] =    [ 
                                    [0, 2, 5, 1, 3],
                                    [2, 0, 4, 3, 8],
                                    [5, 4, 0, 6, 2],
                                    [1, 3, 6, 0, 7],
                                    [3, 8, 2, 7, 0]];


    dvar int Y[Areas];
    dvar int T[Areas];
    dvar int X[Areas][Areas] in 0..1;


    maximize sum( i in Areas ) P[i] * Y[i];
    subject to {
        forall( k in Areas ) 
            sum ( j in Areas: j!=k) X[k][j] == 1;
        forall( k in Areas)
            sum ( i in Areas: i!=k) X[i][k] == 1;
        forall( i in Areas) forall (j in Areas) T[i] + FROMTO[i][j] -     T[j] - 100*(1-X[i][j]) <= 0;
        T[1] == 0;
        forall( i in Areas: i!=1) T[i] - D[i] - 1000*(1-Y[i]) <= 0;
}

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Я так понимаю, вы имели в виду

Я хочу суммировать по диапазону (областям), кроме случаев, когда j равно равно (вместо "не равно") к.

Я также предполагаю, что ваша проблема в том, что опубликованная вами модель недопустима. Вы должны пометить свои ограничения, чтобы очиститель конфликта мог работать, а затем посмотреть на результаты уточнения конфликта. Если я обозначу ваши ограничения так:

maximize sum( i in Areas ) P[i] * Y[i];
subject to {
    forall( k in Areas ) 
        sum1: sum ( j in Areas: j!=k) X[k][j] == 1;
    forall( k in Areas)
        sum2: sum ( i in Areas: i!=k) X[i][k] == 1;
    forall( i in Areas) forall (j in Areas)
        fromto: T[i] + FROMTO[i][j] - T[j] - 100*(1-X[i][j]) <= 0;
    T[1] == 0;
    forall( i in Areas: i!=1)
        limit: T[i] - D[i] - 1000*(1-Y[i]) <= 0;

Тогда я получаю этот конфликт:

 sum1(1):      X(1)(2) + X(1)(3) + X(1)(4) + X(1)(5)  = 1
 sum1(2):      X(2)(1) + X(2)(3) + X(2)(4) + X(2)(5)  = 1
 sum1(3):      X(3)(1) + X(3)(2) + X(3)(4) + X(3)(5)  = 1
 sum1(4):      X(4)(1) + X(4)(2) + X(4)(3) + X(4)(5)  = 1
 sum1(5):      X(5)(1) + X(5)(2) + X(5)(3) + X(5)(4)  = 1
 fromto(1)(2): 100 X(1)(2) + T(1) - T(2) <= 98
 fromto(1)(3): 100 X(1)(3) + T(1) - T(3) <= 95
 fromto(1)(4): 100 X(1)(4) + T(1) - T(4) <= 99
 fromto(1)(5): 100 X(1)(5) + T(1) - T(5) <= 97
 fromto(2)(1): 100 X(2)(1) - T(1) + T(2) <= 98
 fromto(2)(3): 100 X(2)(3) + T(2) - T(3) <= 96
 fromto(2)(4): 100 X(2)(4) + T(2) - T(4) <= 97
 fromto(2)(5): 100 X(2)(5) + T(2) - T(5) <= 92
 fromto(3)(1): 100 X(3)(1) - T(1) + T(3) <= 95
 fromto(3)(2): 100 X(3)(2) - T(2) + T(3) <= 96
 fromto(3)(4): 100 X(3)(4) + T(3) - T(4) <= 94
 fromto(3)(5): 100 X(3)(5) + T(3) - T(5) <= 98
 fromto(4)(1): 100 X(4)(1) - T(1) + T(4) <= 99
 fromto(4)(2): 100 X(4)(2) - T(2) + T(4) <= 97
 fromto(4)(3): 100 X(4)(3) - T(3) + T(4) <= 94
 fromto(4)(5): 100 X(4)(5) + T(4) - T(5) <= 93
 fromto(5)(1): 100 X(5)(1) - T(1) + T(5) <= 97
 fromto(5)(2): 100 X(5)(2) - T(2) + T(5) <= 92
 fromto(5)(3): 100 X(5)(3) - T(3) + T(5) <= 98
 fromto(5)(4): 100 X(5)(4) - T(4) + T(5) <= 93

Так что, похоже, ваши данные в FROMTO и T не позволяют получить реальное решение.

0 голосов
/ 27 июня 2019

Вы написали "за исключением случаев, когда j не равно k".

Так что вместо

forall( k in Areas)
        sum ( i in Areas: i!=k) X[i][k] == 1;

Я бы написал

forall( k in Areas)
        sum ( i in Areas: i==k) X[i][k] == 1;
...