Проблема с формированием списка

Дано 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

  • Вопрос задан
  • 2736 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы