One thing to keep in mind here is that you are not trying to exactly represent which areas are actually used to feed the plant. A county might have all of its corn production in the eastern half, for example. (And a plant might not even be pulling from adjacent counties.)
You just want a cartographic convention showing approximate relative scale based on the adjacent counties.
Here is how I would go about this...
In your ethanol plant point layer, I would have four attributes: corn needed, average yield, buffer radius, and residual. Corn needed would stay constant. Buffer radius is the currently used buffer radius. Average yield is the average yield per square mile inside that radius, and residual is the difference between corn needed and average yield*pi*radius^2. The ethanol plant layer should have a unique identifier too (for joins).
You are trying to minimize your residuals. You will want to set a cutoff for your residuals (e.g. if the calculated amount is within 100 bushels of the corn needed, then you will not further refine the radius).
You also need a county layer that has two attributes, the average corn yield per square mile and the amount of corn produced (which you can get from area * average corn yield). The last is really a dummy variable for calculation later. If you have any counties with an average corn yield per square mile of zero, set that instead to an arbitrarily small number. Zeros in that field will cause problems later.
Pick an initial arbitrary radius, smaller than the normal width of a county such as 1 mile, and set the radius value to that for all plants. Run these operations in a geodatabase, so that the area attribute is automatically maintained.
This next section you might want to automate as a python script or geoprocessing model:
- Run a buffer on your ethanol plants using the radius column for the buffer distance.
- Intersect the resulting buffer with the counties layer, keeping all attributes.
- For the intersect output, for each feature recalculate corn produced using average corn yield * new area of the feature.
- Run a merge on the intersect output using ethanol plant unique ID as the merge attribute. Have a summary statistic that sums up the corn produced from all features merged. This will now give you corn produced inside your buffer radius for each plant.
- Using the summary statistic, recalculate the average yield attribute on the merge output, using the summed up corned produced divided by the area of the feature.
- Using the ethanol plant unique ID, join the merge output to the original ethanol plants. Calculate the average yield on the ethanol plant as equal to the average yield on the corresponding merge feature. Remove the join.
- Calculate the residual. This should be pretty large with your initial radius, but will shrink considerably with the next pass after you calculate the new radius.
- For only those plants whose residual is greater than your cutoff, recalculate the buffer radius. The new radius is (corn needed/(pi*average yield))^0.5
- Repeat steps 1 to 8 until all of your features have residuals smaller than your cutoff. If this takes more than 3-4 passes, you might want to consider increasing your cutoff, as, again, this is only a cartographic convention not a precise representation of the exact area used for ethanol production.
As I mentioned above, you might want to script or model steps 1-8, as you will repeat those several times. You can just as easily run the whole thing manually too though.
Also, optionally, instead of using a residual in step 8, you could just always recalculate the radius for all features until you have an output from step 7 where all features have a satisfactory residual.
When you have reached the point that you are happy with the residuals, your buffer output from step 1 on the last pass will be the buffer you want to use for your map.