File | Date | Author | Commit |
---|---|---|---|
Instances | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
src | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
.gitignore | 2015-09-14 | homeland | [b50cd1] ungetestet. versuch, glpk aus den namen zu entf... |
Makefile | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
README.md | 2016-10-09 | jochen@homeland | [8733fb] Anpassung der Readme für sourceforge |
farmer.cfg | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
farmer.cpp | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
index.html | 2016-01-22 | jochen@homeland | [34379e] beim worker muss nun zusätzlich die größe des z... |
worker.cpp | 2016-01-25 | jochen@homeland | [e6c658] Sachen bzgl. include und libs speziell für Hoch... |
Dieses Programm ist eine Weiterentwicklung meines Codes aus der Bachelorarbeit. Die OR-Instanzen von Chu-And-Beasley sind damit weiterhin lösbar - mal schneller und mal auch leider langsamer. Primär tut dieser Code bei binären Rucksack Problemen die dem Capital Budgeting Problemen entsprechen (BIP).
Das Logging ist sehr umfangreich und stellt immer nur eine Momentaufnahme dar.
So könnte eine farmer.cfg
Datei aussehen:
2
5000
6
1.05
20.6
50.0
500
3000
127.0.0.1 61001
127.0.0.1 61002
127.0.0.1 61003
127.0.0.1 61004
Die erste Zeile gibt an, wie viele Worker, die am Dateiende aufgelistet sind, genommen werden sollen. In diesem Beispiel sind es zwei: der Worker mit Port 61001 und der mit 61002.
Die zweite Zeile gibt in ms an, wie lange jeder Job auf einem Worker laufen darf. Die Zeit für das Lösen des vorangestellten Simplex-Verfahrens ist hier nicht enthalten.
Die dritte Zeile gibt an, bis zu wie viele Variablen bzw. Projekte vorbelegt werden sollen, sollte das Zeitlimit auf dem Worker überschritten werden.
Die vierte Zeile sollte man besser auf 1.0 stellen. Dieser Wert ist ein Faktor, mit dem bei jeder Überschreitung des Zeitlimits das Zeitlimit verändert wird. Streng genommen kann man so das Limit mit einem Wert kleiner 1 auch herunter setzten.
Die beiden nächsten Werte sind Prozentangaben, ab welcher Vorbelegung die Jobs via Tiefensuche abgearbeitet werden sollen bzw. ab wann die Zeitbeschränkung aufgehoben wird und ein Presolver eingesetzt werden darf.
Die Zeile mit der 500 bedeutet, dass im 500ms Tackt der Farmer die Worker nach neuen, bisher besten Lösungen abfragt und seine bekannte bisher beste Lösung dem Worker mitteilt. Dieser Update- oder Sync-Intervall erfagt auch die Speichernutzung des Workers, um dies mit loggen zu können.
Die 3000 bedeutet, dass alle 3 Sekunden eine Logginginfo auf stderr
ausgegeben wird. Erst am ende gibt der Farmer das Ergebnis auf stdout
aus. Dieser Intervall wird auch für das Informieren des HTML-Client genommen. In dem HTML-Client ist via Polling 1000ms eingestellt, um die Logging-Infos ab zu fragen. Auch hier werden dann trotzdem nur die Infos, die alle 3s aufgezeichnet werden, übertragen.
GANZ WICHTIG: hinter jeder Zeile sollte ein LEERFELD sein! Manche
Editoren neigen dazu, dieses Leerfeld zu entfernen. Ohne dieses
Leerfeld hatte ich Probleme.
Starten von 8 Workern, mit je 800MB, die diese zum allokieren von Speicher nutzen dürfen:
./worker 61001 800 &
./worker 61002 800 &
./worker 61003 800 &
./worker 61004 800 &
./farmer Instances/OR10x100-0.50_4.dat.cplex farmer.cfg
make idl
make
make clean-idl
make clean
Copyright (c) 2016, Jochen Peters (Krefeld)
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.