src/algorithms/grupt/index.js
fe944750
 import { map, reduce, sort, range, omit, times } from 'rambda';
 import type { JobId } from '../../types';
 import { updateCTime } from '../johnson';
 import { min } from 'ramda';
b681b265
 import { fillCorrupted } from '../campbel';
fe944750
 
 type JobOperations = {
   jobId: JobId,
8c7841d1
   operations: Array<{ t: number, name: string }>
fe944750
 };
 
 type JobOperationsWithC = {
   jobId: JobId,
8c7841d1
   operations: Array<{ t: number, c: number, name: string }>
fe944750
 };
 
 export const createSchedule = (jobsOperations: JobOperations[], processorsCount: number): JobOperationsWithC[] => {
8c7841d1
   jobsOperations = fillCorrupted(jobsOperations, processorsCount);
b681b265
 
fe944750
   const jobsOperationsWithKoefs = map((jobsOperation: JobOperations) => {
     const ej = jobsOperation.operations[0].t < jobsOperation.operations[processorsCount - 1].t
       ? 1 : -1;
     const daco = reduce(
       (acc, i) => min(jobsOperation.operations[i-1].t + jobsOperation.operations[i].t, acc),
       Infinity,
       range(1, processorsCount)
     );
 
     const koef = ej / daco;
 
     return { ...jobsOperation, koef };
   }, jobsOperations);
 
   let sortedJobsOperations = sort(
     (a: JobOperations, b: JobOperations) => {
       return b.koef - a.koef;
     },
     jobsOperationsWithKoefs
   );
 
   sortedJobsOperations = map(omit('koef'), sortedJobsOperations);
 
   return updateCTime(sortedJobsOperations, processorsCount);
 };
 
 export default (jobsOperations: JobOperations[], processorsCount: number) => {
   const schedule = createSchedule(jobsOperations, processorsCount);
 
   return times(i =>
     map((jobTime: JobOperationsWithC) => ({
       processor: i + 1,
       startTime: jobTime.operations[i].c - jobTime.operations[i].t,
       endTime: jobTime.operations[i].c,
8c7841d1
       name: jobTime.operations[i].name
fe944750
     }), schedule)
   , processorsCount);
 };