Могу ли я установить приоритеты для ограничений при использовании решения для целлюлозы cbc? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь вычислить оптимальный ответ для набора двоичных переменных с множеством ограничений.Я хотел бы установить приоритеты для ограничений.ex) ограничение 1, 2, 3 имеет приоритет 100 (самый высокий), а ограничение 4, 5, 6 имеет приоритет 1 (самый низкий)

В настоящее время я использую линейное программирование целлюлозы и решатель cbc для решения задачи производственного планирования.

Небольшая часть моих данных будет выглядеть следующим образом.

   t0  t1  t2  t3  t4  t5  t6  t7  t8  t9
a  v1  v2  v3  v4  v5  v6  v7  v8  v9  v10
b  v11 v12 v13 v14 v15 v16 v17 v18 v19 v20
c  v21 v22 v23 v24 v25 v26 v27 v28 v29 v30

v_list = 
[[v1, v2, v3, v4, v5, v6, v7, v8, v9, v10], 
[v11, v12, v13, v14, v15, v16, v17, v18, v19, v20], 
[v21, v22, v23, v24, v25, v26, v27, v28, v29, v30]]

n_rows = v_list.shape[0]
n_columns = v_list.shape[1]

Каждая переменная может быть -1, 0, 1

Установленные мной ограничения будут выглядеть примерно такниже.

m = LpProblem()

# constraint 1, 2 = find absolute value of each variables
m += vxx  <= t
m += -vxx <= t

# constraint 3 = sum of each row must be equal to or below 2
for r_index in range(n_rows):
    m += lpSum(v_list[r_index, :]) <= 2

# constraint 4 = sum of rows a and b must be equal to or below 2
m += lpSum(v_list[[0, 1], :]) <= 2

# constraint 5 = sum of all rows must be equal to or below 2
for c_index in n_columns:
    m += lpSum(v_list[:, c_index]) <= 2

# constraint 6 = sum of each consecutive value must be equal to or below 1
m += lpSum(v(t) + v(t+1)) <= 1

Цель состоит в том, чтобы минимизировать 2 * ряд (а) + 2 * ряд (б) + 4 * ряд (с)

m += lpSum(v_list)

При решении модели скороткий промежуток времени и LpStatus равен 0 (неразрешено), ограничения с наивысшим приоритетом полностью выполнены, но другие выполнены только частично.

ex) ограничение 1 2 3 4 выполнено, но 5 6 являются частичными.

1 Ответ

0 голосов
/ 23 января 2019

Один из способов установить приоритеты для ограничений - разрешить их нарушение на некоторое количество, а затем штрафовать степень нарушения ограничений в целевой функции.

Например, в ограничении 1 у вас может быть m += vxx <= t + slack_1. Где slack_1 - линейная переменная, которая затем умножается на соответствующий вес в целевой функции. Устанавливая веса каждого из нарушений ограничений, вы можете определить, насколько важны эти ограничения - однако это не гарантирует порядок, в котором ограничения будут выполняться во время работы решателя.

...