  Internet of Things (IoT) is a pivotal technology in application domains that
require connectivity and interoperability between large numbers of devices. IoT
systems predominantly use a software-defined network (SDN) architecture as
their core communication backbone. This architecture offers several advantages,
including the flexibility to make IoT networks self-adaptive through software
programmability. In general, self-adaptation solutions need to periodically
monitor, reason about, and adapt a running system. The adaptation step involves
generating an adaptation strategy and applying it to the running system
whenever an anomaly arises. In this paper, we argue that, rather than
generating individual adaptation strategies, the goal should be to adapt the
logic / code of the running system in such a way that the system itself would
learn how to steer clear of future anomalies, without triggering
self-adaptation too frequently. We instantiate and empirically assess this idea
in the context of IoT networks. Specifically, using genetic programming (GP),
we propose a self-adaptation solution that continuously learns and updates the
control constructs in the data-forwarding logic of SDN-based IoT networks. Our
evaluation, performed using open-source synthetic and industrial data,
indicates that, compared to a baseline adaptation technique that attempts to
generate individual adaptations, our GP-based approach is more effective in
resolving network congestion, and further, reduces the frequency of adaptation
interventions over time. In addition, we compare our approach against a
standard data-forwarding algorithm from the network literature, demonstrating
that our approach significantly reduces packet loss.
