Домен в списке списков списков [PROLOG] - PullRequest
0 голосов
/ 11 декабря 2018

Может ли кто-нибудь сказать мне лучший подход для этого?

Следователь, отвечающий за исследовательскую группу (RU), которая участвует в проекте, просит вас помочь в заполнении ежемесячных листов посвящения деятельности по проекту.

Проект состоит из Мероприятий, некоторые из которых могут происходить параллельно, и время, отводимое Группой для каждого Мероприятия, известно с самого начала (в соответствии с бюджетом и планом работы).Каждое мероприятие происходит в течение нескольких известных месяцев (например, мероприятие А1 выполняется в месяцы с 4 по 6 и с 10 по 12).

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

Он предназначен для определения ежемесячного распределения часов каждого Исследователя для каждой Деятельности, так чтоСледователь никогда не превышает максимальное количество часов в месяц, то есть его преданность делу предусмотрена проектом (Intratigador Contratado может иметь преданность 100%).В идеале общее время, отведенное для каждого вида деятельности, будет распределено по нескольким месяцам его активности, таким как время, потраченное каждым исследователем.Каждый исследователь может указать исключительные месяцы, когда они должны посвятить себя проекту с нулевым часом (например, август как праздничный месяц).

Например, учитывая единицу с 2 исследователями: I1 (Лектор, с ограничением)12 часов в месяц, которые должны посвятить в общей сложности 90 часов проекту и не должны работать в месяце М6) и I2 (Подрядчик, 145 часов в месяц проекту, и не должны работать в месяце М8);10-месячный проект с двумя видами деятельности: A1 (всего 875 часов, активно в течение месяцев с 1 по 6) и A2 (всего 520 часов, активно в течение месяцев с 6 по 10).Возможное назначение может быть следующим:

Пример

Я рассматриваю это как список следователей, внутри каждого следователя у меня есть список действий и внутри действийУ меня есть все месяцы.Я не знаю, как мне установить домен.

% Activities_Information = [1-5, 1-10, 7-12, 6-24]
% Max_Hours = [10,12,145,145,8]

folha(Activities_Information,N_months,Max_Hours):-

    %get the number of activities
    length(Activities_Information,N_act),
    %get the number of investigatores
    length(Max_Hours,N_inv),
    %generate a table with the values
    gerar_tabela(N_inv, N_act, N_months, Tabela),
    %assign the domain  
    assign_domain(Tabela,Max_Hours,TabelaDominm,N_inv,N_act,N_months,0,0).




gerar_tabela(N_investigators, N_activities, N_months, Tabela) :-
        length(Row, N_activities),
        length(X,N_months),
        maplist(=(X), Row),         
        length(Tabela, N_investigators),
        maplist(=(Row), Tabela).      


%End of investigatores
assign_domain(_,_,_,N_inv,_,_,Iter_Inv,_):-
    Iter_Inv =:= N_inv.

%Next investigator after all the activities
assign_domain(Tabela,Max_Hours,TabelaDomin,N_inv,N_act,N_months,Iter_Inv,Iter_Ativ):-
    Iter_Ativ =:= N_act,
    Iter_Inv1 is Iter_Inv + 1,
    print('Investigador:'),write(Inter_Inv),nl,
    assign_domain(Tabela,Max_Hours,TabelaDomin,N_inv,N_act,N_months,Iter_Inv1,0).

assign_domain(Tabela,Max_Hours,TabelaDomin,N_inv,N_act,N_months,Iter_Inv,Iter_Ativ):-
    %get the investigator order Iter_Inv
    get_list_element(Iter_Inv,Tabela,Investigador),
    %Get the activity order Iter_Ativ
    get_list_element(Iter_Ativ,Investigador,Atividade),
    %Get max hours for this investigator
    get_list_element(Iter_Inv,Max_Hours,Horas_Max),
    domain(Atividade,1,Horas_Max),
    Iter_Ativ1 is Iter_Ativ + 1,
    assign_domain(Tabela,Max_Hours,TabelaDomin,N_inv,N_act,N_months,Iter_Inv,Iter_Ativ1).

%get list element (element position, list, query element)
get_list_element(0,[HeadElement|_],HeadElement).

get_list_element(Pos,[_|OtherElems],Symbol):-
        Pos > 0,
        Pos1 is Pos-1,
        get_list_element(Pos1,OtherElems,Symbol).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...