У меня есть минимаксная проблема, которую нужно решить в AMPL. У меня есть ряд процессоров (j
) и процессов (i
), с набором операций, которые должны выполняться каждым процессом последовательным образом (от процессора 1 до процессора N) на каждом процессоре с продолжительностью для каждая операция определяется как p[i,j]
Каждый процесс имеет ожидаемое время окончания.
Задача состоит в том, чтобы запланировать выполнение всех процессов на процессорах, чтобы минимизировало максимальную задержку (определенную как момент времени, когда выполнение заканчивается - ожидаемое время окончания). Для этого я попытался, как вы можете видеть в следующем фрагменте кода, минимизировать задержку max_delay, определенную в ограничениях. Проблема заключается в том, что при таком изменении она меняет каждую задержку, равную max_delay , что приводит к неправильному планированию.
Знаете ли вы другой способ решения проблемы? Я также думал о настройке max_delay >= argmax(delay[i])
, но, честно говоря, я не знаю, правильно ли это и как реализовать функцию argmax в AMPL
Заранее спасибо за ответы, вот код, который я реализовал
# Parameters
param r >= 0; # # of PROCESSORS
param T >= 0; # # of PROCESSES
param t_max >= 0; # TIME max for TIME set
# Sets
set PROCESSES := 1..T;
set PROCESSORS := 1..r;
set TIME := 0..t_max;
# Other params
param D{PROCESSES} >= 0; # exp. end
param p{PROCESSES, PROCESSORS} >= 0; # TIME for exec of operation p fro process i on processor j.
# Variables
var USE{PROCESSES, PROCESSORS, TIME} binary;
var end_time{PROCESSES} >= 0;
var DELAY{i in PROCESSES} = end_time[i] - D[i]; # array of delays
var max_DELAY integer >= 0;
# Constraints
# Constraint to define end_time
subject to end_time_constraint {i in PROCESSES}:
sum{t in TIME} (t + p[i,r])*USE[i,r,t] <= end_time[i] ;
# constraint to grant a single execution
subject to single_execution {i in PROCESSES, j in PROCESSORS} :
sum{t in TIME} USE[i,j,t]=1;
# Constraint to avoid multiple operation to execute at the same time
subject to operation_constraint {i in PROCESSES, t in TIME}:
sum{j in PROCESSORS} USE[i,j,t]<=1;
# Constraint to grant the right execution order (operation od process i on processor j befor the one on j+1)
subject to order_constraint {i in PROCESSES, j in PROCESSORS, t in TIME}:
sum{k in 0..t} USE[i,max(j-1, 1),k] >= USE[i,j,t];
# constraint to get the max delay over delays array
subject to max_DELAY {i in PROCESSES}:
max_DELAY >= DELAY[i];
# constraint to avoid sovrapposition of processes
subject to non_sovrapp1 {t in TIME, j in PROCESSORS}:
sum{i in PROCESSES, k in max(t-p[i,j]+1,0)..(t)} USE[i,j,k]<=1;
# constraint to avoid sovrapposition of processors
subject to non_sovrapp2 {i in PROCESSES, t in TIME} :
sum{ j in PROCESSORS, k in max(t-p[i,j]+1,0)..(t)} USE[i,j,k] <= 1;
minimize min_DELAY : max_DELAY;