Многоцелевое программирование - CPLEX OPL - минимизировать отклонения - PullRequest
0 голосов
/ 29 октября 2019

Я новичок в CPLEX, прошу прощения, если этот вопрос тупой. Я хотел бы минимизировать отклонения в программировании целей в CPLEX (OPL). Я видел очень похожий вопрос с моим ( Программирование целей в Cplex ), но мне пока не ясно.

Давайте предположим следующую ситуацию:

Сначала мы хотим оптимизировать расстояние между магазином и клиентом, учитывая требуемый спрос и запас. Мы сделали это, и лучшим решением было 602

Во-вторых, мы хотим оптимизировать другое, также учитывая запас и спрос, решение было 251,4

Затем мы хотим создать целевое программирование для достиженияобе цели.

Это была мысль (не сработала):

Некоторые предложения? Большое спасибо

// decision variable 

{string} Store = {"A","B","C","D","E"};
{string} Products = {"P1","P2"};
{string} Client = {"D1" , "D2"};

float Demand [Client][Products]= [[3,1],[4,5]]; //volume in Kg
float Freshness [Store][Products]=[[140,0],[0,100],[0,90],[50,0],[10,0]]; //Lower numbers must have priority
float Stock [Store][Products]= [[0.94,0],[0,8.62],[0,1.21],[2.6,0],[8.77,0]]; //volume in Kg
float Distance [Store][Client]=[[21,52],[42,12],[25,15],[52,31],[9,42]]; //in Km


//Decision Variables
dvar float+ Delivered [Store][Client][Products];

//Função Objetivo
minimize (p1 + n1+ p2+ n2);

//Restricoes
subject to {

sum (u in Store, c in Client, p in Products) 
    Distance[u][c] * Delivered[u][c][p] - p1 + n1 <= 657.9;

sum (u in Store, c in Client, p in Products) 
    Freshness[u][p] * Delivered[u][c][p] - p2 + n2 <= 251.4;


forall (p in Products)
    forall (u in Store)
        sum (c in Client)
            Delivered[u][c][p] <= Stock [u][p];

forall (p in Products)
    forall (c in Client)
        sum (u in Store) 
            Delivered[u][c][p] >= Demand[c][p];

}

1 Ответ

1 голос
/ 29 октября 2019

Если ваши kpis p1 и p2, вы можете использовать staticLex и написать

minimize staticLex(p1,p2);
...