Дано M задач и N процессоров. Для задач задано отношение частичного следования и время выполнения каждой задачи. Построить оптимальную последовательность выполнения
_________________
На оптимальность я пока забил и свел задачу к тому, чтобы разбить начальный список на количество списков, равное количеству процессоров.
domains
intptr=integer*
ptrptr=intptr*
predicates
sum(intptr,integer) //суммирует весь список
podschet(intptr,integer) //подсчет числа членов
start(ptrptr,integer,ptrptr)
ptrSum(ptrptr,intptr) //суммирует вложенные списки
maxS(intptr,integer) //находит максимальный член
max(integer,integer,integer) //возвращает максимум
createSps(ptrptr,integer,integer,intptr,real) //создает список задач проссоров
mastSps(intptr,integer,intptr,real) //создает список задач с суммой меньше максимальной
clauses
max(X,Y,X):- X>Y ,!.
max(X,Y,Y).
maxS([A|End],ANS):-!, maxS(End,ANS1),
max(A,ANS1,ANS).
maxS([],0).
sum([A],Ans):-Ans=A.
sum([A|Ends],ANS):-!, sum(Ends,Ans1),
Ans=Ans1+A.
sum([],0).
ptrsum([A|Ends],[B|Endl]):-!, sum(A,B),
ptrSum(Ends,Endl).
ptrsum([],[]).
podschet([A|Ends],ANS):-!,
podschet(Ends,Ans1),Ans=Ans1+1.
podschet([],0).
mastSps([],Lst,[],Max):-!,write("act1",Lst,"\n").
mastSps([],0,[K],Max):-!,write("act2").
mastSps([],0,[],Max).
mastSps([Q],Lst,[],Max):-write("act1 \n").
mastSps([Q],0,[K|Endk],Max):-write("act2 \n"),
mastSps([K,Q],1,Endk,Max).
mastSps([Q|Endq],Lst,[Q|Endm],Max):-K=Lst-1,
write("K=",K,"\n"),mastSps(Endq,K,Endm,Max),
sum([Q|Endq],Sum),write("Q=",Q,Endq," "),
Sum<Max,
write("Sum=",Sum,"Max=",Max," "),
Lst<5,!.
createSps([],1,Lst,M,Max):-
mastSps(Q,Lst,M,Max).
createSps([Q|Ends],N,Lst,M,Max):-!,
createSps(Ends,K,Lst,M,Max), N=K-1,
mastSps(Q,Lst,M,Max).
start(M,N,Q):-!,ptrSum(M,Mk), //избавляемся от вложенных списков
sum(Mk,A), //считаем общую длину
podschet(Mk,Mi), //считаем количество членов... уже просто так, на всякий случай
Max=A/N, //находим среднюю максимальную длину
maxS(Mk,S), write("\nStep",Mi," ",Max,"\n"), //находим член максимальной длины. В теории, хочу еще сравнить его со средним максимальным, но пока не знаю как быть с таким списком [1,1,1,1,18] на трех процессорах.
!!! mastSps(Qt,Mi,Mk,Max),write("Qt=",Qt). //пока проверяю как работает эта функция. Почему-то не выводит список Qt
goal
start([[1],[2,3,2],[3],[4],[3,1,1]],2,Q),write("Q=",Q).
буду благодарен за любую помощь
П.с. пишу на TurboProlog'e