Package de.timefinder.algo.ncp

Source Code of de.timefinder.algo.ncp.NCPEventTSGraph

/*
*  Copyright 2010 Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net.
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*  under the License.
*/
package de.timefinder.algo.ncp;

import de.timefinder.algo.constraint.RasterConstraint;
import de.timefinder.algo.graph.AbstractGraphAlgorithm;
import de.timefinder.algo.graph.EventTree;
import de.timefinder.algo.graph.GraphAlgorithmGPA;
import de.timefinder.algo.graph.GraphAlgorithmGreedy;
import de.timefinder.algo.util.BiMap;
import de.timefinder.data.Event;
import de.timefinder.data.Person;
import de.timefinder.data.algo.Assignment;
import de.timefinder.data.set.BitRaster;
import java.util.Map;
import java.util.Set;
import javolution.util.FastMap;

/**
*
* @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net
*/
public class NCPEventTSGraph {

    private BiMap<Assignment, Integer> assToNumber = new BiMap<Assignment, Integer>();
    private int evCounter = 0;
    private int pCounter = 0;
    private final int slotsPerWeek;
    private AbstractGraphAlgorithm algo;

    public NCPEventTSGraph(int slotsPerDay, int days) {
        this.slotsPerWeek = slotsPerDay * days;
        algo = new GraphAlgorithmGPA(slotsPerWeek);
//        algo = new GraphAlgorithmGreedy(slotsPerWeek);

    }

    public void startOptimize(Period period) {
        // 1. TODO NOW move to class variable !?
        // 2. TODO NOW use only trees where weight > 0
        // 3. TODO NOW GPA
        Map<Person, Integer> personToInteger = FastMap.newInstance();

        for (Assignment ass : period.getAll()) {
            Integer evNumber = assToNumber.get(ass);
            if (evNumber != null) {
                algo.setEventEnableStatus(evNumber, ass.getStart());
                continue;
            }

            evNumber = evCounter++;
            assToNumber.put(ass, evNumber);

            Event event = ass.getEvent();
            algo.addEvent(evNumber, event.getDuration());

            // TODO NOW avoid that an event would have been assigned to two days

            for (Person person : event.getPersons()) {
                Integer pNo = personToInteger.get(person);
                if (pNo == null) {
                    pNo = pCounter++;
                    personToInteger.put(person, pNo);
                }

                algo.addResourceTo(pNo, evNumber);
            }

            // add a weight to each allowed slot (=> trees get the multiple weight -> this does not matter)
            RasterConstraint rasterC = event.getConstraint(RasterConstraint.class);
            BitRaster raster = rasterC.getRaster().getForbidden();
            int duration = event.getDuration();
            for (int slot = raster.getNextFree(0, duration);
                    slot >= 0 && slot < slotsPerWeek;
                    slot = raster.getNextFree(slot + 1, duration)) {
                algo.incSlotWeight(evNumber, slot, 1);// event.getPersons().size());
            }
        }

        applyMatching(period, algo.start());
    }

    private void applyMatching(Period currentWeek, Set<EventTree> matching) {
        for (EventTree tree : matching) {
            int evNumber = tree.getEvent();
            Assignment ass = assToNumber.getSecond(evNumber);
            // ass could be both: unassigned and even assigned

            currentWeek.doMove(ass, tree.getMinSlot() % slotsPerWeek);
        }
    }
}
TOP

Related Classes of de.timefinder.algo.ncp.NCPEventTSGraph

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.