Инструментальная среда имитационного моделирования распределенных систем мобильных агентов


Приложение 26 Model_candidates.cs



страница15/21
Дата24.11.2016
Размер2.3 Mb.
Просмотров4095
Скачиваний0
1   ...   11   12   13   14   15   16   17   18   ...   21

Приложение 26 Model_candidates.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;
namespace Automata {

interface IModel {

}

partial class Model {


List Candidates = new List();

Hashtable applicants = new Hashtable();

List app_list = new List();

int champ_index = 0; // кандидат-победитель

int Exec_Mode;
public int get_exec_mode(){

return Exec_Mode;

}
public int get_champ_index() {

return champ_index;

}
public const int Exec_Mode_Consume = 1;

public const int Exec_Mode_Produce = 2;

public const int Exec_Mode_Stop = 3;

public bool do_pause = false;

public string pause_reason ="";
public List get_candidates() {

List ss;

if(Exec_Mode == Exec_Mode_Consume) {

ss = get_consumers();

if(ss != null) {

return ss;

}

if(move_time_point()){



Exec_Mode = Exec_Mode_Produce;

} else if(points_list.Count == 0) {

Exec_Mode = Exec_Mode_Stop;

return null;

//error("Полный финиш!");

} else {


// в пределах time_to нет завершающихся переходов

return null;

}

}
ss = get_producers();



if(ss != null){

return ss;

}

remove_time_point(t_current);



Exec_Mode = Exec_Mode_Consume;

return get_candidates();

}
bool time_to_on = false;

double time_to;


public void time_limit_on(Double i_time_to) {

time_to_on = true;

time_to = i_time_to;

}

public void time_limit_off() {



time_to_on = false;

}

public void set_t_current(Double i_time) {



t_current = i_time;

}
bool move_time_point(){

if(points_list.Count < 1) {

return false;

}

points_list.Sort();



double next_time = points_list[0];

if(time_to_on)

if(next_time > time_to) {

// t_current не меняется

return false;

}

t_current = next_time;



foreach(Instance inst in inst_list){

inst.move_timers(t_current);

}

return true;



}
public List get_producers(){

Point p = (Point)points_hash[t_current];

if(p == null || p.steps.Count < 1) {

return null;

}

List ss = new List();



foreach(Step step in p.steps) {

ss.Add("t(" + step.start_time + ") n("+step.inst.n_last_trace+") " + step.title);

}

champ_index = 0; // первый попавшийся



return ss;

}
public List get_consumers(){

log("====================NEXT_STEP================");

Candidates = new List();

applicants = new Hashtable();

app_list = new List();


foreach(Instance inst in inst_list) {

// log("instance=" + inst.con.name);

if(inst.current_state == null) continue;

if (inst.place == null) continue;

log("instance=" + inst.con.name);

// Все инстансы, которые имеют какое-нибудь состояние

State state = inst.current_state;

log("---->state=" + state.name);

foreach(Transition trans in state.list_trans) {

log("------->trans "+trans.name+" to=" + trans.state_to.name);

// Все транзиции (переходы) из состоятельных инстансов

Step step = check_step(inst, trans);


/* timed_automata

* satisfy_time == -1, то step := null - переход стал невыполнимым

* либо сейчас выполняется (satisfy_time ==0)

* либо никогда не выполняется (satisfy_time == -1)

* либо м.б. выполнится через satisfy_time (надо еще будет проверять)

* */


double satisfy_time = -1;

if(step != null && trans.has_timed_constraints()) {

satisfy_time = inst.get_satisfy_time(trans);
log("------inst="+inst.con.name+"->satisfy_time=" + satisfy_time + " time=" + t_current);
if(satisfy_time == -1) {

step = null;

}

}

if(step != null) {



/* timed_automata

* здесь должны определить ожидаемое время удовлетворения

* констрейнта - тоже fire_time, для этого нужна информация

* о inst (там реальные таймеры).

* Возможные значения (satisfy_time):

* 0 - сейчас удовлетворяется

* t(>0) - через время t будет удовлетворяться

* -1 - сейчас не удовлетворяется, t(>0) определить не удалось

*

* */
double fire_time = t_current + trans.get_wait_time();



if(trans.has_timed_constraints() && satisfy_time >= 0.0) {

fire_time = t_current + satisfy_time;

}

log("------->fire_time=" + fire_time+ " time="+t_current);



// if(inst.check_charge_transition(trans, t_current, fire_time)) {

/* timed_automata

* для случая констрейнта is_ready_to_fire == true только если он

* удовлетворяется сейчас (sutisfy_time == 0)

*

* */


if(inst.is_ready_to_fire(trans, t_current, fire_time)) {

log("------->check_charge_ok");

Applicant app = null;

if(applicants.Contains(inst)) {

app = (Applicant)applicants[inst];

} else {


app = new Applicant(inst);

applicants.Add(inst, app);

app_list.Add(inst);

}

app.steps.Add(step);



Candidates.Add(step);

} else {


/* timed_automata

* если satisfy_time == -1, то ничего не делаем

* если satisfy_time == t (>0), то это t надо "зарядить"

*

*



* */

log("------->charge trans " + trans.name + " time=" + fire_time);

if(trans.has_timed_constraints()) {

discharge_transition(inst, trans);

}

if(inst.charge_transition(trans, fire_time)) {



log("------->add_fire_point " + fire_time);

add_fire_to_point(fire_time);

} else {

log("------->already charged!");

}

/*

Point p = find_add_point(fire_time);



p.fire_count++;

*/


}

} else {


/* timed_automata

* условия стали невыполнимыми, кончились ресурсы, (а если

* сбросился таймер?), => переход надо "разрядить"

* */


log(inst.con.name + ":" + inst.current_state.name );

foreach(Transition trn in inst.current_state.list_trans) {

log(" " + trn.name + " time="

+ inst.trans_fire_time[trn.id]

);

}
discharge_transition(inst,trans);



/*

double discharge_time = inst.trans_fire_time[trans.id];

log("discharge trans=" + trans.name + " id=" + trans.id

+ " discharge_time="+discharge_time

);

clear_fire_point(discharge_time);



inst.discharge_transition(trans);

*/


}

}

}



log_candidates();

if(Candidates.Count < 1) {

log("Не найдено ни одного кандидата");

return null;

}

champ_index = make_choice();



List ss = new List();

foreach(Step step in Candidates) {

ss.Add(step.title);

}

return ss;



}
void discharge_transition(Instance inst, Transition trans) {

double discharge_time = inst.trans_fire_time[trans.id];

log("discharge trans=" + trans.name + " id=" + trans.id

+ " discharge_time="+discharge_time

);

clear_fire_point(discharge_time);



inst.discharge_transition(trans);

}
void log_candidates() {

// show candidates

log("Список кандидатов:");

foreach(Instance inst in app_list) {

log("__Объект " + inst.con.name);

Applicant app = (Applicant) applicants[inst];

foreach(Step step in app.steps) {

log("____переход " + step.title);

log("\t input:");

foreach(Bind b in step.Binds.Values) {

log("\t " + b.term.port.name + " " + b.inst.place.name);

}

log("\t output:");



foreach(Outcome o in step.Outcomes) {

log("\t " + o.arc.port.name + " " + o.arc.p.name + " ==> " + o.term.res.name);

}

}

}



/*

foreach(Step step in Candidates) {

log("__объект " + step.title);

log("\t input:");

foreach(Bind b in step.Binds.Values) {

log("\t "+b.term.port.name + " " + b.inst.place.name);

}

log("\t output:");



foreach(Outcome o in step.Outcomes) {

log("\t "+o.arc.port.name + " " + o.arc.p.name+" ==> "+ o.term.res.name);

}

}

*/



}
Step check_step(Instance i_inst, Transition i_trans) {

Place place = i_inst.place;

Step step = new Step(i_inst,i_trans);

Boolean term_bind = false;

// проверяем все входные термы проверяемого перехода

foreach(Term term in i_trans.list_term_in) {

term_bind = false;

foreach(Arc arc in place.list_in) {

// все входные дуги проверяемого инстанса

if(term.port == arc.port) {

// дуга одного порта с данным входным термом

log("----------->term_in=" + term.port.name + " from place=" + arc.p.name

+" term.cv="+term.cv + " term.res.name="+ term.res.name

);

Place place_res = arc.p;



// откуда эта дуга (из какого места)- входная позиция

foreach(Instance inst_res in place_res.list_inst){

// все инстансы во входной позиции

if(step.Binds.Contains(inst_res)){

log("+++>"+"inst="+inst_res.con.name+" place="+place_res.name+" already used");

continue;

}

log("+++>" + "inst=" + inst_res.con.name + " place=" + place_res.name + " not used yet");



if(inst_res.flag == Instance.flag_busy) {

log("+++>" + "inst=" + inst_res.con.name + " place=" + place_res.name + " is busy");

continue;

}

log("+++>" + "inst=" + inst_res.con.name + " place=" + place_res.name + " is not busy");



/*

log("term.res_type=" + term.res.type);

log("inst_res.con.type=" + inst_res.con.type);

log("term.state=" + term.state);

log("ins_res.current_state=" + inst_res.current_state);

*/


if(term.cv == Term.c && (term.res.name).Equals(inst_res.con.name)

&& (term.state == null || term.state == inst_res.current_state)

|| term.cv == Term.v && term.res.type == inst_res.con.type

&& (term.state == null || term.state == inst_res.current_state)

) {

log("-------------->bind term_in.res=" + term.res.name);



if(term.cv == Term.v) {

if(step.Vars_in.Contains(term.res.name)) {

error("term_in port=" + term.port.name + ", var=" + term.res.name

+ ": переменная использована на вход более 1 раза");

}

}

Bind b = new Bind(term, inst_res, arc);



step.Binds.Add(inst_res, b);

if(term.cv == Term.v) {

step.Vars_in.Add(term.res.name, inst_res);

}

term_bind = true;



break;

}

}



}

}

if(!term_bind) {



log("Transition not bind!");

return null;

}

}

// проверяем все выходные термы



foreach(Term term in i_trans.list_term_out) {

term_bind = false;

foreach(Arc arc in place.list_out) {

if(term.port != arc.port) continue; // ищем другую дугу

log("----------->term_out=" + term.port.name + " to place=" + arc.p.name);

Place place_new = arc.p;

Outcome outcome = new Outcome(term,arc);

if(term.cv == Term.v) {

string v_name = term.res.name;

if(!step.Vars_in.Contains(v_name)) {

error("Term_out port=" + term.port.name + ", var=" + v_name

+ ": no input var");

}

Instance bind_inst = (Instance) step.Vars_in[v_name];



if(step.Vars_out.Contains(v_name)) {

error("Term_out port=" + term.port.name + ", var=" + v_name

+ ": использована на выход более 1 раза");

}

step.Vars_out.Add(term.res.name,bind_inst);



}

step.Outcomes.Add(outcome);

term_bind = true;

break;


}

if(!term_bind) {

log("Transition not outcome!");

return null;

}

}

return step;



}
Random r = new Random();
int make_choice() {

// выбираем объект

int n = app_list.Count;

// Random r = new Random();

int n_inst = r.Next(n); // определили объект случайным образом

log("выбран объект " + n_inst + " из " + n + ": " + app_list[n_inst].con.name);

// выбираем переход объекта номер n_inst

Instance inst = app_list[n_inst];

Applicant app = (Applicant)applicants[inst];

n = app.steps.Count;

int sum = 0;

foreach(Step step in app.steps) {

sum += step.trans.priority;

}

int r_prty = r.Next(sum);



int n_trans = -1;

Step champ_step = null;

foreach(Step step in app.steps) {

n_trans++;

champ_step = step;

if(r_prty <= step.trans.priority) {

break;

}

r_prty -= step.trans.priority;



}

log("выбран переход " + n_trans + " из " + n + ": " + app.steps[n_trans].title);

log("champ_step: " + champ_step.title);

// выбран переход n_trans !

champ_index = Candidates.IndexOf(champ_step);

log("champ_index=" + champ_index + ": " + Candidates[champ_index].title);

return champ_index;
}

}

}




Каталог: data -> 2013
2013 -> Федеральное государственное автономное образовательное
2013 -> «Визуальный образ персонажей массового кинематогрфа в историческом контексте»
2013 -> 2 раздел анализ предметной области 5
2013 -> Магистерская диссертация
2013 -> Влияние вовлеченности на готовность платить за коллекционные товары
2013 -> Выражение гендерных характеристик в англоязычном "глянцевом" дискурсе
2013 -> Продакт Плейсмент и перспективы его развития в сети Интернет
2013 -> 1Лекции первого полугодия
2013 -> «Правовое рассмотрение компьютерного мошенничества», Ницца, 22 октября 1992 года, грамота «весьма достойно»


Поделитесь с Вашими друзьями:
1   ...   11   12   13   14   15   16   17   18   ...   21


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал