swarm-sim.py 3.66 KB
Newer Older
1
"""This is the main module of the Opportunistic Robotics Network Simulator"""
Ahmad Reza's avatar
Ahmad Reza committed
2
import importlib
Ahmad Reza's avatar
Ahmad Reza committed
3
4
5
6
import getopt
import logging
import os
import sys
7
import time
8
import random
9
from lib import world, config
Ahmad Reza's avatar
Ahmad Reza committed
10
from lib.gnuplot_generator import gnuplot_generator
Ahmad Reza's avatar
Ahmad Reza committed
11
12


13
def swarm_sim(argv):
Ahmad Reza's avatar
Ahmad Reza committed
14
    """In the main function first the config is getting parsed and than
15
    the swarm_sim_world and the swarm_sim_world object is created. Afterwards the run method of the swarm_sim_world
Ahmad Reza's avatar
Ahmad Reza committed
16
    is called in which the simlator is going to start to run"""
Ahmad Reza's avatar
Ahmad Reza committed
17
18
19
    logging.basicConfig(filename='system.log', filemode='w', level=logging.INFO, format='%(message)s')
    logging.info('Started')

20
21
    config_data = config.ConfigData()
    
Ahmad Reza's avatar
Ahmad Reza committed
22
23
    read_cmd_args(argv, config_data)

24
    create_direction_for_data(config_data)
Ahmad Reza's avatar
Ahmad Reza committed
25

26
27
    random.seed(config_data.seed_value)

28
    swarm_sim_world = world.World(config_data)
Ahmad Reza's avatar
Ahmad Reza committed
29

30
    while swarm_sim_world.get_actual_round() <= config_data.max_round and swarm_sim_world.get_end() is False:
31
32
        round_start_timestamp = time.perf_counter()
        if config_data.visualization:
Karol Actun's avatar
Karol Actun committed
33
            swarm_sim_world.vis.run(round_start_timestamp)
Ahmad Reza's avatar
Ahmad Reza committed
34
35
        run_solution(swarm_sim_world)

Karol Actun's avatar
Karol Actun committed
36
    logging.info('Finished')
Ahmad Reza's avatar
Ahmad Reza committed
37

Karol Actun's avatar
Karol Actun committed
38
    # generate_data(config_data, swarm_sim_world)
Ahmad Reza's avatar
Ahmad Reza committed
39

Karol Actun's avatar
Karol Actun committed
40
41
42
    while True:
        round_start_timestamp = time.perf_counter()
        swarm_sim_world.vis.run(round_start_timestamp)
Ahmad Reza's avatar
Ahmad Reza committed
43

Ahmad Reza's avatar
Ahmad Reza committed
44
45

def read_cmd_args(argv, config_data):
Ahmad Reza's avatar
Ahmad Reza committed
46
    try:
47
        opts, args = getopt.getopt(argv, "hs:w:r:n:m:d:v:", ["solution=", "scenario="])
Ahmad Reza's avatar
Ahmad Reza committed
48
    except getopt.GetoptError:
49
        print('Error: swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
50
51
52
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
53
            print('swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
54
55
            sys.exit()
        elif opt in ("-s", "--solution"):
Ahmad Reza's avatar
Ahmad Reza committed
56
            config_data.solution = arg
57
        elif opt in ("-w", "--scenario"):
Ahmad Reza's avatar
Ahmad Reza committed
58
            config_data.scenario = arg
Ahmad Reza's avatar
Ahmad Reza committed
59
        elif opt in ("-r", "--seed"):
Ahmad Reza's avatar
Ahmad Reza committed
60
            config_data.seed_value = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
61
        elif opt in ("-n", "--maxrounds"):
Ahmad Reza's avatar
Ahmad Reza committed
62
63
64
65
            config_data.max_round = int(arg)
        elif opt in "-m":
            config_data.multiple_sim = int(arg)
        elif opt in "-v":
Ahmad Reza's avatar
Ahmad Reza committed
66
            config_data.visualization = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
67
68
        elif opt in "-d":
            config_data.local_time = str(arg)
Ahmad Reza's avatar
Ahmad Reza committed
69
70


71
def create_direction_for_data(config_data):
72
    if config_data.multiple_sim == 1:
73
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
74
75
76
                               "_" + config_data.solution.rsplit('.', 1)[0] + "/" + \
                               str(config_data.seed_value)

77
        config_data.direction_name = "./outputs/mulitple/" + config_data.direction_name
78
79

    else:
80
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
81
82
                               "_" + config_data.solution.rsplit('.', 1)[0] + "_" + \
                               str(config_data.seed_value)
83
84
85
        config_data.direction_name = "./outputs/" + config_data.direction_name
    if not os.path.exists(config_data.direction_name):
        os.makedirs(config_data.direction_name)
86
87
88
89
90
91


def run_solution(swarm_sim_world):
    mod = importlib.import_module('solution.' + swarm_sim_world.config_data.solution)
    mod.solution(swarm_sim_world)
    swarm_sim_world.csv_round.next_line(swarm_sim_world.get_actual_round())
92
    swarm_sim_world.inc_round_counter_by(number=1)
Ahmad Reza's avatar
Ahmad Reza committed
93

94
95
96

def generate_data(config_data, swarm_sim_world):
    swarm_sim_world.csv_aggregator()
97
    gnuplot_generator(config_data.direction_name)
98
99
100
101


if __name__ == "__main__":
    swarm_sim(sys.argv[1:])