A method comprising: determining a location of a target balloon (102A-102F, 206A-206I, 300, 502); determining locations of one or more neighbor balloons (504, 506, 508, 510) relative to the determined location of the target balloon, wherein the target balloon comprises a communication system (316, 318) that is operable for data communication with at least one of the one or more neighbor balloons; determining a desired movement of the target balloon based on the determined locations of the one or more neighbor balloons relative to the determined location of the target balloon, wherein the desired movement of the target balloon comprises a desired horizontal movement of the target balloon; and controlling the target balloon based on the desired movement of the target balloon, wherein controlling the target balloon based on the desired movement of the target balloon comprises controlling an altitude of the target balloon based on the desired horizontal movement of the target balloon; wherein determining the desired movement of the target balloon (102A-102F, 206A-206I, 300, 502) based on the determined locations of one or more neighbor balloons (504, 506, 508, 510) relative to the determined location of the target balloon comprises: defining a potential energy function that assigns a potential energy to the target balloon as a function of the determined locations of the one or more neighbor balloons and the determined location of the target balloon; determining a gradient of the potential energy function; and determining the desired movement of the target balloon based on the gradient of the potential energy function. determining a location of a target balloon (102A-102F, 206A-206I, 300, 502); determining locations of one or more neighbor balloons (504, 506, 508, 510) relative to the determined location of the target balloon, wherein the target balloon comprises a communication system (316, 318) that is operable for data communication with at least one of the one or more neighbor balloons; determining a desired movement of the target balloon based on the determined locations of the one or more neighbor balloons relative to the determined location of the target balloon, wherein the desired movement of the target balloon comprises a desired horizontal movement of the target balloon; and controlling the target balloon based on the desired movement of the target balloon, wherein controlling the target balloon based on the desired movement of the target balloon comprises controlling an altitude of the target balloon based on the desired horizontal movement of the target balloon; wherein determining the desired movement of the target balloon (102A-102F, 206A-206I, 300, 502) based on the determined locations of one or more neighbor balloons (504, 506, 508, 510) relative to the determined location of the target balloon comprises: defining a potential energy function that assigns a potential energy to the target balloon as a function of the determined locations of the one or more neighbor balloons and the determined location of the target balloon; determining a gradient of the potential energy function; and determining the desired movement of the target balloon based on the gradient of the potential energy function. defining a potential energy function that assigns a potential energy to the target balloon as a function of the determined locations of the one or more neighbor balloons and the determined location of the target balloon; determining a gradient of the potential energy function; and determining the desired movement of the target balloon based on the gradient of the potential energy function.