Целевая функция в неделю - помощь в написании кода - CPLEX - PullRequest
0 голосов
/ 04 ноября 2019

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

Xijt, я = пункт выдачи (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);

}
}

1 Ответ

2 голосов
/ 05 ноября 2019

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

//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;
}
...