列表列表中的域[PROLOG]

时间:2018-12-11 12:07:13

标签: prolog

有人可以告诉我最好的方法吗?

参与项目的负责研究单位(RU)的研究人员要求您提供帮助,以完成每月的项目活动专用表。

该项目由各项活动组成,其中一些活动可能并行进行,而且一开始就知道了联检组专门用于各项活动的时间(根据预算和工作计划)。每个活动都在多个已知的月份内进行(例如,活动A1在第4到6个月和第10到12个月内进行)。

该部门的研究人员分为两种:教师和承包商。该股的每个调查员必须在离开时(根据预算和计划)为该项目投入总计的时间。另外,每个调查人员可能有几个小时专门用于每个特定的活动(而不是整个项目)。

旨在查找每个调查员在每个活动中的小时分布,以使调查员永远不会超过每月的最大小时数,也就是说,他对项目的奉献精神(调查员对战可以奉献100%)。理想情况下,用于每个活动的总时间将在活动的几个月中分配,例如每个研究人员花费的时间。每个研究人员都可以指出他们应该在零小时内奉献给项目的特殊月份(例如,八月为假期月份)。

例如,考虑一个由2名研究人员组成的单位:I1(讲师,每月限制12个小时,他应该为该项目投入总共90个小时,并且不应在M6个月内工作)和I2(承包商) ,该项目每月需要145小时,并且不应在M8月份工作);一个10个月的项目,其中有2个活动:A1(总计875h,活跃在第1至6个月)和A2(总计520h,活跃在第6至10个月)。可能的分配可能是:

Example

我将其视为调查人员列表,在每个调查人员中我都有一份活动列表,而在我所有月份中都有这些活动。我不知道如何设置域。

% 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).

0 个答案:

没有答案