Целевая функция в неделю - помощь в написании кода - CPLEX

(Модель OPL и модель Lindo находятся в поле кода) Мне нужна помощь с этой проблемой. Моя цель - организовать, какие грузовики будут отправляться из пункта отправления в пункт назначения каждую неделю (1, 2, 3 и 4 недели). В этом примере всего 6 грузовиков, и по крайней мере один должен быть отправлен в неделю. Каждая поставка имеет соответствующую стоимость, и цель состоит в том, чтобы минимизировать стоимость в первую неделю, затем вторую, третью и четвертую. Это задача лексикографического целевого программирования. Я сделал расширенную модель в другом программном обеспечении (Lindo), и она сработала, но мне трудно писать в OPL. Может кто-нибудь мне помочь?

Xijt, i = пункт выдачи (1,2,3,4,5), j = пункт назначения (1,2), t = недели (1,2,3,4)

! My code in Lindo:
MIN p4
subject to
p1 = 10
p2 = 10
p3 = 100

! Cost 

0 X111 + 0 X211 + 90 X311+  0 X411 + 10 X511 + 0 X121 + 100 X221 + 0 X321 + 50 X421 + 10 X521 -p1 + n1 = 0 ! Week 1 
0 X112 + 0 X212 + 90 X312+  0 X412 + 10 X512 + 0 X122 + 100 X222 + 0 X322 + 50 X422 + 10 X522 -p2 + n2 = 0 ! Week 2 
0 X113 + 0 X213 + 90 X313+  0 X413 + 10 X513 + 0 X123 + 100 X223 + 0 X323 + 50 X423 + 10 X523 -p3 + n3 = 0 ! Week 3 
0 X114 + 0 X214 + 90 X314+  0 X414 + 10 X514 + 0 X124 + 100 X224 + 0 X324 + 50 X424 + 10 X524 -p4 + n4 = 0 ! Week 4 


! Number of trucks

X311 + X312 + X313 + X314  = 1 !In 4 weeks, there is 1 truck from pickup point 3 to destination 1
X511 + X512 + X513 + X514  = 1
X221 + X222 + X223 + X224  = 2
X421 + X422 + X423 + X424  = 1
X521 + X522 + X523 + X524  = 1 


! Week restriction
!At least one truck must be used per week
X311 + X511 + X221 + X421 + X521 >=1
X312 + X512 + X222 + X422 + X522 >=1
X313 + X513 + X223 + X423 + X523 >=1
X314 + X514 + X224 + X424 + X524 >=1


END

INT X311 
INT X312 
INT X313 
INT X314 

INT X511
INT X512 
INT X513 
INT X514

INT X221 
INT X222
INT X223 
INT X224 

INT X421 
INT X422 
INT X423 
INT X424

INT X521
INT X522
INT X523
INT X524 
---------------------------------------------------
// CPLEX
using CP;
// decision variables

{string} Pickup = {"A","B","C","D","E"};
{string} Destination = {"D1" , "D2"};
{string} Weeks = {"W1", "W2", "W3", "W4"};

int Trucks [Pickup][Destination]= [[0,0],[0,2],[1,0],[0,1],[1,1]]; 
int Cost [Pickup]=[140,100,90,50,10]; 

//Decision Variables
dvar int  Delivered [Forest][Destination][Weeks]; //not sure if it is right

//Expressions
dexpr int Week1 = sum (u in Pickup, c in Destination, W1 in Weeks) Trucks[u][c] * Cost [u] * Delivered[u][c][W1];
dexpr int Week2 = sum (u in Pickup, c in Destination, W2 in Weeks) Trucks[u][c] * Cost [u] * Delivered[u][c][W2];
dexpr int Week3 = sum (u in Pickup, c in Destination, W3 in Weeks) Trucks[u][c] * Cost [u] * Delivered[u][c][W3];
dexpr int Week4 = sum (u in Pickup, c in Destination, W4 in Weeks) Trucks[u][c] * Cost [u] * Delivered[u][c][W4];



//Objective Function
minimize staticLex (Week1,Week2,Week3,Week4);

//Constraint
subject to {
forall (u in Pickup)
    forall (c in Destination)
        sum (W1 in Weeks)
            Trucks [u][c] >= 1;

forall (u in Forest)
    forall (c in Destination)
        sum (W2 in Weeks)
            Trucks [u][c] >= 1;

forall (u in Pickup)
    forall (c in Destination)
        sum (W3 in Weeks)
            Trucks [u][c] >= 1;

forall (u in Pickup)
    forall (c in Destination)
        sum (W4 in Weeks)
            Trucks [u][c] >= 1;

}


execute Output {
    writeln ("Delivered Plan")
        for (var t in Trucks)
            for (var u in Pickup)
                for (var c in Destination)
                    for (var w in Weeks)
                        if (Delivered [t][u][c][w]>0) {
                        writeln (Delivered [t][u][c][w] + '' + " number of trucks " + '' + t + '' + "  delivered from pickup poit " + '' + u +" to destination " +''+ c + " in the week "+''+ w);

}
}


person Marinna Gomes    schedule 04.11.2019    source источник
comment
Из журнала двигателя: Предупреждение: ограничение всегда ложно, модель неосуществима. сумма (intExprArray []) ›= 1   -  person Marinna Gomes    schedule 04.11.2019
comment
Вы можете показать свою модель OPL?   -  person Daniel Junglas    schedule 04.11.2019
comment
Это в поле кода, просто поверните планку. Спасибо   -  person Marinna Gomes    schedule 04.11.2019


Ответы (1)


Это выглядит подозрительно:

//Expressions
dexpr int Week1 = sum (u in Pickup, c in Destination, W1 in Weeks) Trucks[u][c] * Freshness [u] * Delivered[u][c][W1];
dexpr int Week2 = sum (u in Pickup, c in Destination, W2 in Weeks) Trucks[u][c] * Freshness [u] * Delivered[u][c][W2];
dexpr int Week3 = sum (u in Pickup, c in Destination, W3 in Weeks) Trucks[u][c] * Freshness [u] * Delivered[u][c][W3];
dexpr int Week4 = sum (u in Pickup, c in Destination, W4 in Weeks) Trucks[u][c] * Freshness [u] * Delivered[u][c][W4];

//Objective Function
minimize staticLex (Week1,Week2,Week3,Week4);

В выражении для одной недели вы суммируете переменные для всех недель. Думаю, вместо этого вам нужно следующее:

//Expressions
dexpr int Week1 = sum (u in Pickup, c in Destination) Trucks[u][c] * Freshness [u] * Delivered[u][c]["W1"];
dexpr int Week2 = sum (u in Pickup, c in Destination) Trucks[u][c] * Freshness [u] * Delivered[u][c]["W2"];
dexpr int Week3 = sum (u in Pickup, c in Destination) Trucks[u][c] * Freshness [u] * Delivered[u][c]["W3"];
dexpr int Week4 = sum (u in Pickup, c in Destination) Trucks[u][c] * Freshness [u] * Delivered[u][c]["W4"];

Обратите внимание, что последний индекс для Delivered теперь постоянен в каждом выражении. Каждое выражение теперь суммирует переменные только за одну неделю.

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

forall (u in Pickup)
    forall (c in Destination)
        sum (w in Weeks)
            Trucks [u][c] >= 1;

Тогда эти ограничения выглядят странно, поскольку вы суммируете более w in Weeks, но сумма, которую вы суммируете (Trucks), не индексируется по неделям. И Trucks тоже не является переменной решения. Таким образом, вы на самом деле не указываете здесь ограничение, а просто суммируете постоянные значения.

Следующая проблема заключается в том, что ваша переменная решения Delivered не фигурирует ни в каком ограничении. Так что здесь особо нечего оптимизировать.

Возможно, вы захотите вернуться и посмотреть, что именно следует оптимизировать. Какие вещи оптимизатор может изменить или должен решить, каковы ограничения и т. Д. Например, в вашей модели LINDO я не вижу ничего, что выглядело бы связанным с Delivered переменными решения или Freshness или Forest вещами. Вместо этого в модели LINDO кажется, что Trucks являются переменными решения и также индексируются в течение нескольких недель.

Вот модель OPL, которая должна быть эквивалентна вашей модели LINDO (без исправлений в течение 1, 2, 3 недель:


{string} Pickup = {"A","B","C","D","E"};
{string} Destination = {"D1" , "D2"};
{string} Weeks = {"W1", "W2", "W3", "W4"};

// In the LINDO model not all variables are used. For example, variable
// X111 (which means going from pickup 1 to destination 1 in week 1) is
// never used. We use a tuple and a tuple set to list all the
// pickup/destination combinations that are actually used.
tuple P {
  string pickup;      // Pickup location
  string destination; // Destination location
}
{P} Pairs = { <"C", "D1">, // 31
              <"E", "D1">, // 51
              <"B", "D2">, // 22
              <"D", "D2">, // 42
              <"E", "D2">  // 52
};
int PickupCost[Pickup] = [ 140, 100, 90, 50, 10 ];

//Decision Variables
dvar int+ Trucks[Pairs][Weeks];

//Expressions
dexpr int Week1 = sum(p in Pairs) Trucks[p]["W1"] * PickupCost[p.pickup];
dexpr int Week2 = sum(p in Pairs) Trucks[p]["W2"] * PickupCost[p.pickup];
dexpr int Week3 = sum(p in Pairs) Trucks[p]["W3"] * PickupCost[p.pickup];
dexpr int Week4 = sum(p in Pairs) Trucks[p]["W4"] * PickupCost[p.pickup];


//Objective Function
minimize staticLex (Week1, Week2, Week3, Week4);


//Constraint
subject to {
  // Number of trucks
  forall(p in Pairs)
    sum(w in Weeks) Trucks[p][w] >= 1;

  // Week restriction
  // At least one truck must be used per week
  forall(w in Weeks)
    sum(p in Pairs) Trucks[p][w] >= 1;
}
person Daniel Junglas    schedule 05.11.2019
comment
Спасибо. Но я все еще не получаю значения для переменной решения (доставлено), а также не получаю значения для выражений решений (неделя 1, неделя 2, неделя 3 и неделя 4). - person Marinna Gomes; 05.11.2019
comment
Я думаю, что в вашей модели есть еще одна проблема: переменная решения «Доставлено» не фигурирует ни в каком ограничении. Может быть, вы хотите Delivered в ограничениях, а не Trucks? Я не уверен. - person Daniel Junglas; 05.11.2019
comment
Я обновил свой ответ дополнительными проблемами в вашей модели. - person Daniel Junglas; 06.11.2019