2015-04-06 4 views
0

Во время решения фразы OptaPlanner я хочу обновить глобальную переменную. Изменения глобальной переменной изменят мою следующую проверку правил.Как объявить нестационарную глобальную переменную в OptaPlanner

Result.java

package com.domain; 

public static boolean status; 
... 
... 

Sample.drl

import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder;  
import com.domain.Result; 
global HardSoftScoreHolder scoreHolder; 

rule "Sample Rule" 
when 
$PlanningEntity:PlanningEntity() 
then 
somelogic($PlanningEntity); 
if(Result.status){ 
    scoreHolder.addHardConstraintMatch(kcontext, -500); 
} 
end 

function void somelogic(PlanningEntity planningEntity){ 
    if(condition 1...){ 
     Result.status = true; 
    }else if(condition 2...){ 
     Result.status = false; 
    }else{ 
     //Do Nothing 
    } 
} 

Мой вопрос:

Как я могу объявить статическую глобальную переменную за решение сессии. (Чтобы избежать одновременного использования нескольких пользователей, выполняющих решение OptaPlanner в то же время.)

ответ

0

В настоящее время вы не можете надежно использовать глобальную переменную, поскольку OptaPlanner может порождать несколько сеансов слюни (необходимые для будущих функций, таких как многопоточные решения, основанные на популяции эвристика, ...).

Обходной путь прост: просто добавьте проблему с одиночной проблемой и используйте ее. См. Классы *Parametrization в примерах.

+0

Но разве эти сессии Drools не будут частью сеанса одного пользователя (т. Е. Выполнение приложения Java)? Следовательно, не было бы такого рода ОПП, похоже, боится. - BTW, справочное руководство Drools даже не заявляет, что глобальные общие данные используются между сеансами, запущенными из одной и той же Java-программы (но почему-то я это помню откуда-то). – laune

+0

. Каждый сеанс спуска, используемый внутри optaplanner, должен иметь свои собственные глобальные экземпляры (если только он не защищен потоком регистратором (или что-то еще, что он действует только как приемник, а не как источник). Создание этих экземпляров должно происходить через callback, поскольку optaplanner может порождать любое количество сеансов слюни, которые он желает (хотя в настоящее время он только генерирует 1 при нормальном выполнении) –

+0

Можно ли использовать переменные тени или добавление переменных в рабочую память в opta-planner (точно так же, как и для обладателя очков) ? Мне нужен динамический проблемный факт, который может меняться и применяться к следующему правилу. Пример: обновление первого шага как «A.». Факт «A» использования второго шага в правиле и обновление факта «B». «в правиле и обновлении факта ... –

Смежные вопросы