Это выглядит подозрительно:
//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;
}